0

これは私のコードです:

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 で無効なコンテキストで分割が無用に使用されています。"

この警告を回避するには、コードをどのように変更すればよいですか? ありがとう~~~~~

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 の戻り値を配列に戻す必要があり、その後で配列を処理できます。ループを 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
    };

これを1行で行うには

map {$hash{$_}++} split /[=,\n]/, while <DATA>;
于 2012-05-02T12:11:49.493 に答える