2012-05-02 32 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

什麼是'split'存在的目的是什麼? –

+1

評論該行。 – Birei

+0

這個腳本打算計算相同的items.and這些項目用=或者 – niejieqiang

回答

4

你沒有做任何與split的返回值; $ _在'$ hash {$ _}'中使用時是行從DATA讀取:

while循環後您的哈希值是:

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

還要注意在關鍵的年底新線。

編輯:問題更新了評論: 「這個腳本打算數相同items.and這些項目由=或分隔, - 」

這樣做會修改while循環這個問題的方法:

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

分裂返回上「=」或陣列分割「」 - 這是再環繞在和鍵連接在該值的散列遞增

+0

分隔,謝謝,'$ hash {$ _} ++ for split/\ = |,/'現在這個警告消失了 – niejieqiang

+1

確保你chomp ,或者你會得到兩個密鑰,具體取決於它是否是行尾,例如 - $ hash {4 \ n}與$ hash {4}不一樣 – beresfordt

3

如果你正在尋找到計數的任何字符串的occurances在數據然後下面將做什麼你要。 split的返回需要返回給一個數組,然後你可以處理這個數組。你可以在一條線上完成循環,但這種方式更加詳細。

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 
    }; 

爲此在一行

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

是的,我忘記將它們推到@arr – niejieqiang