2012-06-05 3 views
0

엄격한 경고와 경고를 사용하는 경우에는 발생하지 않을 것이라는 사실을 무시하고이 두 사례가 다른 이유를 알고 싶습니다. > {이름},하지만 -> {이름} 할당에 영향을 X [0] -Perl 해시/속성 혼동

FINAL, FINAL 
SRV, FINAL 

인덱스가 제로의 경우, 않는 이유는 y는 [0] :

#!/usr/local/perl5/bin/perl 

$x[0] = ""; 
$y[0] = ""; 

$x[0]->{name} = "SRV"; 
$y[0]->{name} = "FINAL"; 
print "$x[0]->{name}, $y[0]->{name}\n"; 

$x[1]->{name} = "SRV"; 
$y[1]->{name} = "FINAL"; 
print "$x[1]->{name}, $y[1]->{name}\n"; 

출력은 색인이 하나 일 때?

감사합니다.

숀.

+6

이가 그렇게하지 않습니다에

$y[0] = $x[0]; 

을 변경하여 해결할 수 있습니다 나를. – gpojd

+0

마찬가지로 : @Sean : 다시 확인하고 동작하는 방식대로 동작하는 것을 보여줄 수 있습니까? 유닉스에서는 다음을 사용할 수 있습니다 :'cat test.pl && perl test.pl' – Dancrumb

+0

맞습니다. 내 코드에서 문제를 보여줄 필요가 없다고 생각한 두 가지 초기 할당을 제거했습니다. 이것은 이제 내가 실행중인 코드와 정확히 일치합니다. Perl -v는 버전 v5.8.4라고보고합니다. – Sean

답변

5

실제로 실행 한 코드가 아닙니다. 귀하가 제시 한 코드에서 $x[0]$y[0]은 다른 해시에 대한 참조이지만 문제 코드에서는 $x[0]$y[0]이 동일한 해시를 참조합니다. 다음 코드에서와 같이 :

my %hash = { name => "SRV" }; 
$x[0] = \%hash;   # $x[0] is a reference to %hash. 
$y[0] = $x[0];   # $y[0] is a reference to %hash. 
$y[0]->{name} = "FINAL"; # Changes $hash{name}. 

print $x[0]->{name};  # Prints $hash{name}. 
print $y[0]->{name};  # Prints $hash{name}. 

위의 문제는

$y[0] = { %{ $x[0] } }; 

또는

use Storable qw(dclone); 
$y[0] = dclone($x[0]); 
+0

좋아요, 코드의 편집 된 버전에서 $ x [0]과 $ y [0]을 모두 null로 설정했습니다. (실제로, 정말로 ""). 그래서 여러분이 말하는 것은 둘 모두 null에 할당 되었기 때문에 각각 동일한 해시에 대한 참조이므로 기본적으로 동일한 변수였습니다. 그러나 $ x [1]과 $ y [1]은 아무 것도 할당되지 않았기 때문에 동일한 변수에 대한 참조가 아닙니다. (나는 그들을 동일하게 만들려고하지 않는다. 왜냐하면 하나가 다른 것을 수정하고 스크립트에서 문제를 일으키기 때문이다.) – Sean

+1

@Sean, 항상'use strict; 경고를 사용하라. "빈 문자열 인 이름의 해시에 액세스 할 것을 Perl에게 말하고있다. '[1]'예제에서는 실제로는 null undef이므로, 역 참조에 필요할 때 Perl은 해시를 생성합니다. (이것을 자동 화상 화라고합니다.) – ikegami