gpt4 book ai didi

perl 传递散列引用未按预期运行

转载 作者:行者123 更新时间:2023-12-02 08:19:53 26 4
gpt4 key购买 nike

(注意:我有点想通了,看到最后的所有方式)

有点晚了,我已经盯着这段代码看了太久了。我终于写了一个简短的测试程序来测试哈希并通过引用传递它们,但它的行为并不像我预期的那样。我确定我遗漏了一些非常简单的东西……任何人都可以发现它吗?

#!/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);
}

我希望此代码将数字 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 = {};

改变这一行:

$hash{$number} = $number;

到:

$_[0]->{$number} = $number;

让一切都按预期工作。为什么第一条语句修改了一个新的本地 %hash,而我希望这个本地 %hash 指向我最初传递给例程的同一个取消引用的哈希引用?

最佳答案

一切都按预期进行。您在测试子中的第一条语句复制了传递的哈希值:

 my %hash = %{$_[0]};

要改变传递的哈希值,您应该使用 hashref,例如:

 my $hashref= $_[0];

$hashref->{key} = 'val';

此方法将更改原始哈希,而不是副本。

关于perl 传递散列引用未按预期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38197242/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com