2011-03-23 16 views
7

Dumper($cmd_string) yorumunu yaparsam, while döngüsü asla çekilmez.Data :: Dumper() 'ın yan etkileri nelerdir?

Dumper() hangi cm efektleri $ cmd_string üzerinde var?

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; 
} 

Ben Dumper (olmadan Perl ayıklayıcısını çalıştırın) ve sonra çalışır cmd_string $ x komutunu kullanın, ancak varsa eğer ben sadece adım: Burada

$ cmd_string alt çağrısından önce budur kod aracılığıyla çalışmaz.

Ben döngü için önce cmd_string $ x keşke,

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 

Şimdi alt sonundaki kod olsa adım sonra ben alt sonunda bu olsun Bu edilir

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' 

cevap

12

each Yineleyici karma karmaları, karma içinde nerede olduğunu takip etmek için gizli başına bir karma değişken kullanır. Benim tahminim $cmd_string hash üretmek için kullanılan kod da each kullanır, ancak tamamlanmak için yinelenen değil.

each yineleyiciyi sıfırlamak için while döngüsünden önce keys %{$cmd_string->{$desc}};'u yerleştirin. Void bağlamında keys'u çağırmak, karma yineleyiciyi sıfırlamanın standart yoludur.

Alternatif olarak, yalnızca for my $cmd (keys %{$cmd_string->{$desc}}) { kullanın ve döngü içinde $arg değişkenini oluşturun.

Dumper() kullanımının sorunu çözmemesinin nedeni, Dumper'ın hashta büyük olasılıkla keys çağırmasıdır, böylece yineleyiciyi sıfırlar.

+0

En az bir eski Dumper sürümü, yanlışlıkla çektiği karmaların sonunda yineleyiciyi bıraktı. – ysth

+0

Hızlı, hassas ve doğru. Ben çok seviyorum ... – bitbucket

+1

'Dumper()' dahili yineleyiciyi sıfırlar. Bu sonsuz döngüye yol açar: 'perl -MData :: Dumper -e '% x = (0,0); Damper% x iken $ k = her% x'' –

İlgili konular