2012-05-07 9 views
2

MS WindowsでStrawberry Perl 5.14.2を使用しています。次のコードはLinux Perl 5.10.1ではうまく動作しますが、MS Windowsでは失敗します。私は両方を実行するように更新する必要があります。MS Windowsで動作するようにPerlスクリプトを更新するには

sub read_dict { 
    open F, "<:utf8", "$dictfile" || die "Dictonary file $dictfile not found"; 
    while (<F>) { 
     chomp; 
     s/^ *//; 
     split; 
     $freq{$_[1]} = $_[0]; 
     $header = substr($_[1],0,$wd); 
     if ($freq{"m,$header"}) { 
      if ($freq{"m,$header"} < length($_[1])) { 
       $freq{"m,$header"} = length($_[1]); 
      } 
     } else { 
      $freq{"m,$header"} = length($_[1]); 
     } 
     $freq{total} += $_[0]; 
    } 
    close(F); 
} 

それは検出し、MS Windows上の$ dictfileを解析したが、他の場所にゼロによる除算エラーが発生{総} $のFREQを、蓄積することができません。 $のdictfileは次のようになり、データと加重辞書です:2つのプラットフォーム間の

8 永垂不朽 
8 震耳欲聋 
85 罗马里奥 
891 澳大利亚 
9 埃芬贝格 

私のトラブルは、それが失敗のいずれかの分割でのショー。または次の行がありますが、私はそれを修正するのに十分なPerlを知らないのです。コードを変更する必要がありますか、またはPerlを特定のコマンドラインオプションで起動する必要がありますか?

ありがとうございました。

+3

私の@varは=スプリット 'のように、明示的な' split'コールを使用してみてください。多分そこに隠された文書化されていない行動はあるが、 'split'('と 'の代わりに' @ _'の@のvar'を使用空の文脈では、分割されたアイテムを置くために@を使用しません) – ArtM

+0

ありがとうございますArtM。私は警告を出し、暗黙の分割が専用であることを発見した。あなたが提案したものだけで、PerlのOSとバージョンの両方の魅力のように機能します。 – tahoar

+2

["@への暗黙の分割の使用は推奨されていません]"(http://stackoverflow.com/questions/2436160/why-does-perl-complain-use-of-implicit-split-to-is-deprecated) – daxim

答えて

1

ArtMの提案によれば、ここに作業コードがあります。

sub read_dict { 
    open F, "<:utf8", "$dictfile" || die "Dictonary file $dictfile not found"; 
    while (<F>) { 
     chomp; 
     s/^ *//; 
     my @entry = split(/ /, $_); 
     $freq{$entry[1]} = $entry[0]; 
     $header = substr($entry[1],0,$wd); 
     if ($freq{"m,$header"}) { 
      if ($freq{"m,$header"} < length($entry[1])) { 
       $freq{"m,$header"} = length($entry[1]); 
      } 
     } else { 
      $freq{"m,$header"} = length($entry[1]); 
     } 
     $freq{total} += $entry[0]; 
    } 
    close(F); 
} 
関連する問題