gpt4 book ai didi

perl - Data::Dumper() 的副作用是什么?

转载 作者:行者123 更新时间:2023-12-04 10:44:13 24 4
gpt4 key购买 nike

如果我注释掉 Dumper($cmd_string)然后是 while循环永远不会被采用。

Dumper() 对 $cmd_string 有什么副作用?

这是子调用之前 $cmd_string 的内容:

VAR1 = {
'The Java Runtime Library' => {
'apt-get install -y' => 'sun-java6-jre'
}
};


sub installPackages
{
my $cmd_string = shift;
my %rc_hash;

my $rc;

Dumper($cmd_string);

for my $desc (keys %{$cmd_string})
{
while (my ($cmd, $arg) = each %{$cmd_string->{$desc}})
{
print "system($cmd $arg)\n";

$rc = system("$cmd $arg");

if ($rc)
{
$rc_hash{$desc}{$cmd} = '';
}
}
}
return \%rc_hash;
}

如果我在没有 Dumper() 的情况下运行 Perl 调试器并在 $cmd_string 上使用 x 命令,那么它可以工作,但如果我只是单步执行代码,它就不起作用。

这是在仅通过 sub 末尾的代码之后
  DB<3> x $cmd_string
0 HASH(0x2769550)
'' => HASH(0x2769880)
empty hash
'The Java Runtime Library' => HASH(0x25cc2a0)
'apt-get install -y' => 'sun-java6-jre'
DB<4> x $cmd_string->{$desc}
0 HASH(0x2769880)
empty hash

现在,如果我在 for 循环之前 x $cmd_string 我在子的末尾得到这个
main::installPackages(msi.pl:1979):       return \%rc_hash;
DB<3> x $cmd_string
0 HASH(0x1125490)
'The Java Runtime Library' => HASH(0xf852a0)
'apt-get install -y' => 'sun-java6-jre'

最佳答案

each哈希迭代器使用隐藏的每个哈希变量来跟踪它在哈希中的位置。我的猜测是用于生成 $cmd_string 的代码hash 也使用 each但没有迭代完成。

重置 each迭代器,位置 keys %{$cmd_string->{$desc}};在你的 while 循环之前。调用 keys在 void 上下文中是重置哈希迭代器的标准方法。

或者,只需使用 for my $cmd (keys %{$cmd_string->{$desc}}) {然后创建 $arg循环内的变量。

使用Dumper()的原因解决的问题是 Dumper 最有可能调用 keys在散列上,从而重置迭代器。

关于perl - Data::Dumper() 的副作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5411625/

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