Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 什么是数据::Dumper()';有什么副作用?_Perl_Debugging_Side Effects - Fatal编程技术网

Perl 什么是数据::Dumper()';有什么副作用?

Perl 什么是数据::Dumper()';有什么副作用?,perl,debugging,side-effects,Perl,Debugging,Side Effects,如果我注释掉转储程序($cmd_string),那么while循环永远不会执行 Dumper()对$cmd\u字符串有什么副作用 下面是子调用之前的$cmd_字符串: VAR1 = { 'The Java Runtime Library' => { 'apt-get install -y' => 'sun-java6-jre' } }; sub installPackages { my $cmd_string = shift; my

如果我注释掉
转储程序($cmd_string)
,那么
while
循环永远不会执行

Dumper()对$cmd\u字符串有什么副作用

下面是子调用之前的$cmd_字符串:

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_字符串上使用x命令,那么它可以工作,但是如果我只是单步执行代码,它就不工作

这是在仅单步执行子脚本末尾的代码之后发生的

  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
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'
DB x$cmd\u字符串
0散列(0x2769550)
''=>散列(0x2769880)
空散列
'Java运行时库'=>哈希(0x25cc2a0)
'apt get install-y'=>'sun-java6-jre'
DB x$cmd_字符串->{$desc}
0散列(0x2769880)
空散列
现在,如果我在for循环前面加上x$cmd_字符串,我会在子循环的末尾得到它

  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
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'
main::installPackages(msi.pl:1979):返回\%rc\u散列;
DB x$cmd_字符串
0散列(0x1125490)
'Java运行时库'=>哈希(0xf852a0)
'apt get install-y'=>'sun-java6-jre'

哈希上的每个迭代器使用一个隐藏的每个哈希变量来跟踪它在哈希中的位置。我的猜测是,用于生成
$cmd_字符串
哈希的代码也使用
每个
,但不是迭代完成的

要重置
每个
迭代器,请放置
键%{$cmd_string->{$desc}在while循环之前。在void上下文中调用
是重置哈希迭代器的标准方法

或者,只需对我的$cmd(key%{$cmd_string->{$desc}}{
使用
,然后在循环中创建
$arg
变量


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

至少有一个非常旧版本的Dumper在其转储的散列结束时意外地离开了迭代器。
Dumper()
确实重置了内部迭代器。这会导致无限循环:
perl-MData::Dumper-e“%x=(0,0);Dumper%x,而$k=each%x'
每个
都不应用于包装函数调用。对于您描述的迭代器问题,最好完全避免它。