gpt4 book ai didi

perl - 将散列传递给子例程而不更改其输入

转载 作者:行者123 更新时间:2023-12-04 22:48:41 25 4
gpt4 key购买 nike

Perl 中处理散列时,我试图调试一些奇怪的行为。我将散列(不是 ref)传递给子例程,并且出于某种原因更新它。

some_sub($a,%{$hash});
sub some_sub {
my ($a,%hash) = @_;
my @struct;
while (my ($dir, $data) = each %hash) {
foreach my $id (keys(%{$data})) {
my $entry = $data->{$id};
$entry->{id} = $id;
my $parent = $data->{$entry->{id}};
unless ($parent) {
push @struct, $entry
} else {
push @{$parent->{children}},$entry;
}
}
}
}
my %h= %{$hash};
print Dumper(\%h);

sub some_sub 确实改变了 %hash 但只针对内部范围,所以它不应该改变外部 %hash 的数据.此外,我将散列作为散列而不是散列引用传递。我怀疑子 some_sub 将内存地址插入到 %hash 中,但我不确定。

我应该如何调试和解决这个问题?

编辑:我还尝试将哈希引用传递给子例程,并在对新哈希执行所有操作时将哈希引用取消引用到另一个哈希中。

最佳答案

散列中的每个值都是一个标量。如果您有嵌套散列,则内部散列存储为标量 - 散列引用。因此,当改变嵌套结构时,引用的哈希也会发生变化,而原始哈希也被引用。

#! /usr/bin/perl
use warnings;
use strict;

sub change {
my %hash2 = @_;
for my $key (keys %hash2) {
++$_ for values $hash2{$key};
}
}

my %hash = (a => {b => 12, c => 24});
change(%hash);
use Data::Dumper; print Dumper \%hash;

输出:

$VAR1 = {
'a' => {
'b' => 13,
'c' => 25
}
};

获得与原始结构相似但包含不同引用的结构的过程称为克隆深度复制。参见 Clone或来自 Storabledclone .

关于perl - 将散列传递给子例程而不更改其输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53899445/

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