我正在尝试计算特定输入行上每个单词的出现次数。给出的例子(我想要实现的目标):
$./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
}
}