Text-Processing

如何在 perl 中實現字元串到數組雜湊?

  • July 29, 2020

我正在嘗試計算特定輸入行上每個單詞的出現次數。給定範例(我想要實現的目標):

$./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}which 是 hash,其中 key 是 word(string) 而 value 是數組,不是標量。那麼為什麼會出現這個錯誤呢?

正如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";
}

參見例如

我從未使用過 Perl,但從我在網上看到的情況來看,對於您的程式碼的第 4 行,您不必這樣做 @words = split(' ', $_);@words = split;

也許試試這個:

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

引用自:https://unix.stackexchange.com/questions/600705