我尝试在哈希中添加数组。
[i[0] for i in airports for i[0] in i]
收到错误:
不是./sort_log_by_ip.pl第63行第1行的HASH引用。
为什么这段代码错了?
在perldoc perldsc
我看到了这种结构,我正在使用类似的东西:
if ( not exists $hashtime{ $arr[0] }{ $date }{ $hour }{ $min } ) {
print "$min not exist";
$hashtime{ $arr[0] }{ $date }{ $hour }{ $min } = [ $sec ];
$create++;
};
之前的代码:
while ( <> ) {
next unless s/^(.*?):\s*//;
$HoA{$1} = [ split ];
}
答案 0 :(得分:5)
您在所有( )
个区块中使用的是列表{ }
,而不是哈希引用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,而它显然没有。{/ p>
在两个if
块中,您需要分配使用{ }
获取的哈希引用
$hashtime{$arr[0]} = { $date => { $hour => { $min => [$sec] } } };
和
$hashtime{$arr[0]}{$date} = { $hour => { $min => [$sec] } };
以及上一个if
区块。
请正确缩进您的代码。用它的发布方式很难处理它。