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

で述べたようにrakesh sharmaでコメント、アクセス構文匿名配列ハッシュの要素はです@{ $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";
}

例を見る

おすすめ記事