繁体   English   中英

将数组添加到Perl中的哈希

[英]Add array to hash in perl

我尝试在哈希中添加数组。

if ( not exists $hashtime{ $arr[0] }{ $date }{ $hour }{ $min } ) {
    print "$min not exist";
    $hashtime{ $arr[0] }{ $date }{ $hour }{ $min } = [ $sec ];
    $create++;
};

并收到错误:

在./sort_log_by_ip.pl第63行,第1行处不是HASH引用。

为什么此代码错误?

perldoc perldsc我看到了这种构造,并且我正在使用类似的东西:

while ( <> ) {
     next unless s/^(.*?):\s*//;
     $HoA{$1} = [ split ];
}

更新

之前的代码:

if ( not exists $hashtime{ $arr[0] } ) {
    $hashtime{ $arr[0] } = ( $date => { $hour => { $min => [ $sec ] } } );
    $create++; 
    print "create for IP: $arr[0]\n";
}

if ( not exists $hashtime{ $arr[0] }{$date} ) {
    $hashtime{ $arr[0] }{ $date } = ( $hour => { $min => [ $sec ] } );
    $create++;
    print "create for IP: $arr[0] DATE: $date\n";
}

if ( not exists $hashtime{ $arr[0] }{$date}{$hour} ) {
    $hashtime{ $arr[0] }{ $date }{ $hour } = ( $min => [$sec] );
    $create++;
    print "create for IP: $arr[0] DATE: $date HOUR: $hour\n";
}

在所有if块中,您都使用列表( )代替哈希引用{ }

当你说

$hashtime{$arr[0]} = ( $date => { $hour => { $min => [$sec] } } );

由于在标量上下文中对LIST ( )进行了评估,因此发生的情况等同于

$hashtime{$arr[0]} = ( $date, { $hour => { $min => [$sec] } } );

最终成为

$hashtime{$arr[0]} = { $hour => { $min => [$sec] } };

因为,运营商评估并丢弃操作数一次一个,返回的最后一个。

下一个if类似,则您可以选择其中一个(或两个都选择)

$hashtime{$arr[0]}{$date}{$min}{[$sec]}
$hashtime{$arr[0]}{$hour}{$min}{[$sec]}

但是,导致错误的代码

if (not exists $hashtime{$arr[0]}{$date}{$hour})

$arr[0]{$date}都需要一个hashref,但显然没有两者。


在两个if块中,您都需要分配一个使用{ }获取的哈希引用

$hashtime{$arr[0]} = { $date => { $hour => { $min => [$sec] } } };

$hashtime{$arr[0]}{$date} = { $hour => { $min => [$sec] } };

以及最后一个if块。


请正确缩进您的代码。 以它的发布方式来处理它非常困难。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM