0

従業員の CSV データがあり、各従業員のハッシュを配列に挿入しようとしています

open($empOutFh,">empOut.txt")
    $hash= [];
    while(<$empFh>) {
        @columnNames = split /,/, $_ if $.==1;
        @columnValues = split /,/, $_;
        %row = map{$_=>shift @columnValues}@columnNames;
        push @$hash,\%row;
    } 
    print Dumper($hash);

私は出力を取得しています

$VAR1 = [
          {
            'emp_no' => '11000',
            'hire_date
' => '1988-08-20
',
            'birth_date' => '1960-09-12',
            'gender' => 'M',
            'last_name' => 'Bonifati',
            'first_name' => 'Alain'
          },
          $VAR1->[0],
          $VAR1->[0],
          $VAR1->[0]
      ]

しかし、各行を印刷しようとすると、毎回異なる行ハッシュが表示されます

4

2 に答える 2

3

問題は、単一のハッシュを使用している%rowため、\%row常に同じハッシュを参照していることです。に割り当てるたび%rowに、新しいハッシュに設定するのではなく、同じハッシュをクリアして再設定するだけです (それにより、配列のすべての要素に間接的に影響します)。

これを修正するには、各ループ反復で新しいハッシュを作成する必要があります。コードへの最小限の変更は、次の演算子%rowを使用して、ローカル スコープを持つレキシカル変数として宣言することです。my

        my %row = map { $_ => shift @columnValues } @columnNames;
        push @$hash, \%row;

もう 1 つのオプションは、中間変数を完全に削除し、パスごとに新しい匿名ハッシュへの参照を生成することです。

        push @$hash, { map { $_ => shift @columnValues } @columnNames };
于 2013-07-07T05:05:47.957 に答える