如何在perl中实现字符串到数组的哈希?

如何在perl中实现字符串到数组的哈希?

我正在尝试计算特定输入行上每个单词的出现次数。给出的例子(我想要实现的目标):

$./foo.pl
asd fgh
asd iop
zxc

asd: 1, 2
fgh: 1
iop: 2
zxc: 3

只是一个程序来记录哪一行出现了一个单词。这个脚本:

#!/usr/bin/perl -w
while(<>){
    ++$line_num;
    @words = split $_;
    for my $w(@words){
        push @h{$w}, $line_num;
    }
}
for my $k(keys %h){
    print "$k:\t";
    print "@h{$k}\n";
}

给出错误:

Experimental push on scalar is now forbidden

但它@h{$w}是哈希,其中键是单词(字符串),值是数组,不是标量。那么为什么会出现这个错误呢?

答案1

如中所述拉克什·夏尔马的评论,访问语法匿名数组作为哈希的一个元素是@{ $h{$w} }。例如:

#!/usr/bin/perl -w

while(<>){
    for my $w (split) {
        push @{ $h{$w} }, $.;
    }
}
for my $k (keys %h) {
    print "$k:\t", "@{ $h{$k} }\n";
}

参见示例

答案2

我从未使用过 Perl,但从我在网上看到的情况来看,对于代码的第 4 行,您不需要执行 @words = split(' ', $_);@words = split;

也许可以尝试这个:

while (<>){
  ++$line_num;
  for $w (split){              #Changed this
    push @{$h{$w}}, $line_num;  #Changed this
  }
}

相关内容