0

this is my code:

my %hash=();

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

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

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

I don't know why it warn me : Useless use of split in void context at get_path.pl line 11."

and how should I change the code to avoid this warning? thank you~~~~~

4

2 回答 2

4

你没有对 split 的返回值做任何事情;$_ 在 '$hash{$_}' 中使用时是从 DATA 中读取的行:

while 循环后的哈希值是:

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

还要注意键末尾的新行。

编辑:用评论更新的问题:“这个脚本打算计算相同的项目。这些项目由 = 或 , – 分隔

这样做的方法是将您的 while 循环修改为:

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

split 返回一个在 '=' 或 ',' 上拆分的数组 - 然后循环遍历该值并增加一个以该值为键的哈希值

于 2012-05-02T12:02:29.553 回答
3

如果您要计算 DATA 中任何字符串的出现次数,那么以下内容将满足您的需求。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>;
于 2012-05-02T12:11:49.493 回答