2017-06-02 16 views
0
while ($word = <STDIN>) { 
    $length = length($word) -1; # Subtract 1 for included newline char 
    $wordLength[$length]++; 
} 

print "Word length \t\t Occurrences \n\n"; 

for (my $i =1; $i <= $#wordLength; $i++) { 
if (not exists $wordLength[$i]) { 
    print "$i \t\t\t 0 \n"; 
} 
    else { 
    print "$i \t\t\t $wordLength[$i] \n"; 
    } 
} 

これはtxtファイルに素晴らしい読書を作品とのような出力:たPerl:配列の代わりにハッシュを使用すると、

Word Length Occurrence 
1   27 
2   104 
3   1039 
4   3505 
5   7181 
6   11765 
7   15898 

私は、これは、配列の代わりにハッシュを使用して動作するように取得しようとしていますが、それはdoesnのうまくいきません。これは私の試みです:

while ($word = <STDIN>) { 
    chomp($word); 
    $length = length($word); 
    $wordLength{$word} = "$length"; 
} 

foreach $word (sort keys %wordLength) { 
    print "$word, $wordLength{$word}\n"; # print key and value 
} 
+1

「$ wordLength {$ length}」を使用してください。あなたが今言葉に挑戦しているのは奇妙です。 – tadman

+1

各長さのカウントが必要な場合は、元のコードから角括弧を変更するだけです。 '$ wordLength [$ length] ++'は '$ wordLength {$ length} ++'になります。 –

+1

また、「動作していないようです」は有効な問題の説明ではありません。あなたのコードは実際に何をしていますか?それはあなたが期待するものとどう違うのですか? –

答えて

1

なぜですか?どの配列もここでうまくいきます。

my @occurrences_by_length; 
while (my $word = <>) { 
    chomp($word); 
    my $length = length($word); 
    ++$occurrences_by_length[$length]; 
} 

print "Length Occurrences\n"; 
for my $length (1..$#occurrences_by_length) { 
    my $occurrences = $occurrences_by_length[$length] 
     or next; 

    printf "%6d %11d\n", $length, $occurrences; 
} 

ハッシュは効率が悪いものの、変更なしで簡単に使用できます。

my %occurrences_by_length; 
while (my $word = <>) { 
    chomp($word); 
    my $length = length($word); 
    ++$occurrences_by_length{$length}; 
} 

print "Length Occurrences\n"; 
for my $length (sort { $a <=> $b } keys(%occurrences_by_length)) { 
    my $occurrences = $occurrences_by_length{$length}; 
    printf "%6d %11d\n", $length, $occurrences; 
} 
関連する問題