2012-05-02 8 views
0

これは私のコードです:Perlでの "無効なコンテキストでの無駄な分割"警告を避けるには?

my %hash=(); 

while (<DATA>) { 
    split /\=|,/; 
    $hash{$_}++; 
} 

map{print "$_ == > $hash{$_}\n"} sort keys %hash; 

__DATA__ 
1=2,3,4 
a=1,1,5 

それは私を警告する理由を私は知らない。 get_path.plラインで無効コンテキストでの分割の無駄な使用11.」

とどのように私がすべき ありがとうございました~~~~~~

+3

でこれを行うには? –

+1

行にコメントを付けます。 – Birei

+0

このスクリプトでは、同じ項目をカウントするつもりです。これらの項目は=または、 – niejieqiang

答えて

4

あなたはsplitの戻り値で何もしません; $ _は '$ hash {$ _}'で使用されている行があるデータから読み取る:

whileループの後に0

あなたのハッシュは以下のとおりです。

%hash = (
      '1=2,3,4 
' => 1, 
      'a=1,1,5 
' => 1 
     ); 

はまた、キーの末尾に新しい行を注意してください。

編集:質問のコメントで更新: 「このスクリプトは同じカウントするつもりはこれら=で区切られたアイテムや、items.and - 」

をこれを行う方法はこれにあなたのwhileループを変更することであろう:

while (<DATA>) { 
    chomp ; 
    foreach(split /\=|,/){ 
     $hash{$_}++; 
    } 
} 

分割が「」「=」または上のアレイ分割を返します - これは、その後に掛けて、あなたは、任意の文字列の回出てくるカウントするように探している場合は、その値をキーとハッシュが

+0

スプリット/ \ = |// '$ hash {$ _} ++ありがとうございました。この警告は消えました – niejieqiang

+1

あなたが行の終わりであるかどうかに応じて2つのキーを得るでしょう - たとえば、 - $ hash {4 \ n}は$ hash {4}と同じではありません – beresfordt

3

をインクリメントされていますDATAでは、次のようにしてあなたは欲しい。分割の戻り値は配列に戻され、配列を処理する必要があります。ループを1行で行うこともできますが、この方法はより詳細です。

use strict; 
use warnings; 
use Data::Dumper; 

my %hash=(); 

while (<DATA>) { 
    chomp; 
    my @arr = split /\=|,/; 
    map {$hash{$_}++} @arr; 
} 
print Dumper \%hash; 

$VAR1 = { 
     '4' => 1, 
     '1' => 3, 
     'a' => 1, 
     '3' => 1, 
     '2' => 1, 
     '5' => 1 
    }; 

そこ `split`の目的は何一行

map {$hash{$_}++} split /[=,\n]/, while <DATA>; 
+0

はい、私はそれらを@arr – niejieqiang

関連する問題