在perl中添加数组到hash

时间:2017-11-23 08:59:10

标签: arrays perl hash

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

[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 ];
}

1 个答案:

答案 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区块。

请正确缩进您的代码。用它的发布方式很难处理它。