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