perl에서 참조를 이해하는 데 어려움을 겪고 있습니다. 여기에 내 문제를 설명하는 짧은 펄 스크립트는 [I 펄-5.8.3을 사용하여이 코드를 실행] : 모두 서브 루틴에있는 것 같아요Perl - 서브 루틴에 대한 참조 전달
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my %a = ("a" => 1, "b" => 2);
my %b =();
print Dumper(\%a, \%b);
foo(\%a, \%b);
print "+==After fn call==+\n";
print Dumper(\%a, \%b);
print "+-----------------------+\n";
bar(\%a, \%b);
print "+==After fn call==+\n";
print Dumper(\%a, \%b);
sub foo {
my($h1, $h2) = @_;
$h2 = $h1;
print Dumper($h2);
}
sub bar {
my($h1, $h2) = @_;
%{$h2} = %{$h1};
}
을 $의 H1와 $ H2 지역 바르이다. 여전히 bar()는 원래 % b의 값을 변경하지만 foo()는 변경하지 않습니다. 왜 그런가요?
실제로는 참조로 호출하지 않기 때문에 이해할 수 있습니다. 참조 값은 값순으로 서브 루틴으로 전달됩니다. –
@Brian Roach, 사실이 아닙니다. Perl은 항상 참조로 전달됩니다. 참조는 참조로 전달되며,이 참조는'$ h1'과'$ h2'에 복사됩니다. '$ h1'과'$ h2'를 렉시 컬 변수이므로 아무 효과가없는 것으로 변경합니다. '$ _ [0]'과'$ _ [1]'을 변경하면 서브 변수에 전달 된 변수에 영향을줍니다. – ikegami
@ikegami, 나는'foo'에서'$ h2 = $ h1'을'$ _ [1] = $ _ [0]'으로 대체했습니다. 출력은 변경되지 않습니다. 나는 여전히 가치에 의한 복사로 남아 있기 때문에 서브 루틴 내부의 변화는 참조 된 변수에 영향을 미치지 않는다. 내 이해가 맞습니까? 아니면 아직도 뭔가 빠졌나요? – Unos