2013-03-08 18 views
1

배열의 내용이 인쇄 될 때 hashref2의 key3에 원하는 값이 없습니다 (달성해야 할 대상은 hashref1이 key3의 배열을 value1로 가지는 것입니다. hashref2는 value2를 갖는 key3의 배열을가집니다).다중 해시에 사용 된 배열 참조의 요소

코드 흐름에서 먼저 hashrefs를 채우고 데이터를 하위 배열로 푸시해야합니다.

하위 배열에 대한 참조를 사용하면 올바른 방법일까요?

#!/usr/bin/perl 
use strict; 
use warnings; 
use Data::Dumper; 

my @array; 
my @subarray; 


# Puash to array 
my $hashref1 = { 
    key1 => 'value1_1', 
    key2 => 'value1_2', 
    key3 => \@subarray 
}; 
push (@array, $hashref1); 

# push some data in subarray 
push (@subarray, 'value1'); 

# clear subarray 
splice(@subarray); 

# Puash to array 
my $hashref2 = { 
    key1 => 'value2_1', 
    key2 => 'value2_2', 
    key3 => \@subarray 
}; 
push (@array, $hashref2); 

# push some data in subarray 
push (@subarray, 'value2'); 

print "hashref1:\n".Dumper($hashref1); 
print "hashref2:\n".Dumper($hashref2); 

print "array:\n".Dumper(@array); 

아웃 :

hashref1: 
$VAR1 = { 
      'key2' => 'value1_2', 
      'key1' => 'value1_1', 
      'key3' => [ 
         'value2' 
        ] 
     }; 
hashref2: 
$VAR1 = { 
      'key2' => 'value2_2', 
      'key1' => 'value2_1', 
      'key3' => [ 
         'value2' 
        ] 
     }; 
array: 
$VAR1 = { 
      'key2' => 'value1_2', 
      'key1' => 'value1_1', 
      'key3' => [ 
         'value2' 
        ] 
     }; 
$VAR2 = { 
      'key2' => 'value2_2', 
      'key1' => 'value2_1', 
      'key3' => $VAR1->{'key3'} 
     }; 
+0

같이 별도 얕은 복사를'덤퍼 (@array)이''되어야 덤퍼 (\ @ 배열)'. 배열이나 해쉬를'Dumper'에 전달하는 것은 의미가 없습니다. – ikegami

답변

2

난 그냥 완전히 참조가 작동하는 방법을 이해하지 못하는 것 같아요. 기본적으로 동일한 배열에 대한 참조를 푸시합니다. 따라서이 배열의 내용이 정확히 같아지는 것은 당연합니다.

당신이해야 할 일은 새로운 배열 참조를 만드는 것입니다. 당신은 당신의 해시 모든 참조에 같은 배열에 대한 참조를 저장하는

#!/usr/bin/perl 
use strict; 
use warnings; 
use Data::Dumper; 

my @array; 
my $subarray = []; 


# Puash to array 
my $hashref1 = { 
    key1 => 'value1_1', 
    key2 => 'value1_2', 
    key3 => $subarray 
}; 
push (@array, $hashref1); 

# push some data in subarray 
push (@$subarray, 'value1'); 

# create a new subarray 
$subarray = []; 

# Puash to array 
my $hashref2 = { 
    key1 => 'value2_1', 
    key2 => 'value2_2', 
    key3 => $subarray 
}; 
push (@array, $hashref2); 

# push some data in subarray 
push (@$subarray, 'value2'); 

print "hashref1:\n".Dumper($hashref1); 
print "hashref2:\n".Dumper($hashref2); 

print "array:\n".Dumper(@array); 
4

: 여기에 적절한 코드입니다. 즉, @subarray을 수정하면 해당 참조가있는 모든 해시가 일치하게 변경된 것처럼 보입니다.

대신로서

@subarray = ('value2'); 
my $hashref2 = { 
    key1 => 'value2_1', 
    key2 => 'value2_2', 
    key3 => [ @subarray ], 
}; 
push (@array, $hashref2);