[英]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.