我在perl中遇到困難。下面是一個簡短的perl腳本解釋我的問題[我跑用perl-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()則沒有。這是爲什麼?
,因爲它不是真的* *參照打電話:如果你考慮相同的代碼,而無需調用子程序你會更好地理解它。參考值按值傳遞給子例程。 –
@布萊恩羅奇,不正確。 Perl *總是*通過引用傳遞。引用被引用傳遞,然後被複制到'$ h1'和'$ h2'中。改變'$ h1'和'$ h2'沒有效果,因爲它們是詞法變量。更改'$ _ [0]'和'$ _ [1]'會影響傳遞給子的變量。 – ikegami
@ikegami,我用'$ _ [1] = $ _ [0]'在'foo'中替換了'$ h2 = $ h1'。輸出不會改變。我猜它仍然是按值複製的,所以子程序內部的變化不會影響被引用的變量。我的理解是否正確?還是我仍然想念一些東西? – Unos