2013-07-07 3 views
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] 
     ] 

그러나 각 행을 인쇄하려고 할 때마다 각기 다른 행 해시를 보여줍니다.

답변

3

문제는 하나의 해시가 %row이므로 문제가 발생하면 \%row입니다. 항상 같은 해시를 참조합니다. %row에 지정할 때마다 새 해시로 설정하지 않고 동일한 해시를 지우고 다시 채우는 것만으로 (즉, 배열의 모든 요소에 간접적으로 영향을줍니다.)

이 문제를 해결하려면 각 루프 반복에서 새 해시를 만들어야합니다. 코드에 최소한의 변화는 my 연산자를 사용하여, 로컬 범위와 어휘 변수로 %row를 선언하는 것 : 또 다른 옵션은 완전히 중간 변수를 제거하고 단지 새에 대한 참조를 생성하는 것입니다

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

각 패스에 익명 해시 : 당신이 map이 제대로 작동하려면 얻을 수없는 경우

 push @$hash, { map { $_ => shift @columnValues } @columnNames }; 
0

대신 foreach 루프를 사용합니다. 똑똑한 것보다 코드를 유지할 수 있어야합니다.

#!/usr/bin/env perl 

use strict; 
use warnings; 

# -------------------------------------- 
use Data::Dumper; 

# Make Data::Dumper pretty 
$Data::Dumper::Sortkeys = 1; 
$Data::Dumper::Indent = 1; 

# Set maximum depth for Data::Dumper, zero means unlimited 
local $Data::Dumper::Maxdepth = 0; 

# -------------------------------------- 

# open($empOutFh,">empOut.txt") 
my $emp_file = 'empOut.txt'; 
open my $emp_out_fh, '>', $emp_file or die "could not open $emp_file: $!\n"; 

#  $hash= []; 
my @emps =(); 
my @columnNames =(); 

#  while(<$empFh>) { 
while(my $line = <$empFh>){ 
    chomp; 

#   @columnNames = split /,/, $_ if $.==1; 
    if($. == 1){ 
     @columnNames = split /,/, $line; 
     next; 
    } 

#   @columnValues = split /,/, $_; 
    my @columnValues = split /,/, $line; 
    my %row =(); 

#   %row = map{$_=>shift @columnValues}@columnNames; 
    for my $i (0 .. $#columnNames){ 
     $row{$columnNames[$i]} = $columnValues[$i]; 
    } 

#   push @$hash,\%row; 
    push @emps, \%row; 

#  } 
} 

#  print Dumper($hash); 
print Dumper \@emps;