Eri*_*jen 2 perl hash reference pass-by-reference
(注意:我有点想到这一点,最后一路看到)
这有点晚了,我一直盯着这段代码太久了.我终于写了一个简短的测试程序来测试哈希并通过引用传递它们,它的行为并不像我期望的那样.我确信有一些非常简单的东西我很想念...有人能发现吗?
#!/usr/bin/perl
use Data::Dumper;
my %hash = ();
print "BEFORE ADDING KEYS\n";
print Dumper (\%hash);
test (\%hash, 10);
print "AFTER ADDING KEYS\n";
print Dumper (\%hash);
sub test {
my %hash = %{$_[0]};
my $number = $_[1];
if ($number == 0) { return; }
print "BEFORE ADDING KEY HASH_REF=$_[0] NUMBER=$number\n";
print Dumper (\%hash);
$hash{$number} = $number;
print "AFTER ADDING KEY\n";
print Dumper (\%hash);
test ($_[0], $number - 1);
}
Run Code Online (Sandbox Code Playgroud)
我希望这段代码将数字10到1添加到我的哈希中,但是一旦测试例程完成递归,哈希就会被删除并且不包含任何内容.我错过了什么?这是输出:
BEFORE ADDING KEYS
$VAR1 = {};
BEFORE ADDING KEY HASH_REF=HASH(0xdb82fd0) NUMBER=10
$VAR1 = {};
AFTER ADDING KEY
$VAR1 = {
'10' => 10
};
BEFORE ADDING KEY HASH_REF=HASH(0xdb82fd0) NUMBER=9
$VAR1 = {};
AFTER ADDING KEY
$VAR1 = {
'9' => 9
};
...
BEFORE ADDING KEY HASH_REF=HASH(0xdb82fd0) NUMBER=1
$VAR1 = {};
AFTER ADDING KEY
$VAR1 = {
'1' => 1
};
AFTER ADDING KEYS
$VAR1 = {};
Run Code Online (Sandbox Code Playgroud)
改变这一行:
$hash{$number} = $number;
Run Code Online (Sandbox Code Playgroud)
至:
$_[0]->{$number} = $number;
Run Code Online (Sandbox Code Playgroud)
使一切按预期工作.为什么第一个语句会修改一个新的本地%哈希,当我希望这个本地%哈希指向我最初传递给例程的相同的去引用哈希引用时?
一切都按预期工作.您在test子中的第一个语句会生成传递哈希的副本:
my %hash = %{$_[0]};
Run Code Online (Sandbox Code Playgroud)
要改变传递的哈希,你应该使用hashref,如:
my $hashref= $_[0];
$hashref->{key} = 'val';
Run Code Online (Sandbox Code Playgroud)
这种方法将改变原始哈希,而不是它的副本.
| 归档时间: |
|
| 查看次数: |
79 次 |
| 最近记录: |