Arrays Perl:在for循环中馈送的哈希在循环外为空

Arrays Perl:在for循环中馈送的哈希在循环外为空,arrays,perl,hash,Arrays,Perl,Hash,我对散列函数有一定的了解。通过一个“for”循环,我动态地创建散列和“hashnames”,并向它们提供一些键/值元素。不幸的是,这些值在循环外不再可见。 下面是我正在使用的小代码及其输出 #!/usr/bin/perl -w use warnings; use English; use Data::Dumper; @wA = ("a", "b", "c", "d", "e", "f"); @dA = (1, 2, 3, 4, 5, 6); for (my $i=0; $i<=$#w

我对散列函数有一定的了解。通过一个“for”循环,我动态地创建散列和“hashnames”,并向它们提供一些键/值元素。不幸的是,这些值在循环外不再可见。 下面是我正在使用的小代码及其输出

#!/usr/bin/perl -w

use warnings;
use English;
use Data::Dumper;

@wA = ("a", "b", "c", "d", "e", "f");
@dA = (1, 2, 3, 4, 5, 6);

for (my $i=0; $i<=$#wA; $i++){
    $hn = "hash-$wA[$i]";
    push(@hna, $hn);
    %hn = ();
    #my %hn;
    $hsize = @hn;
    print "1. HashName: " . $hn . " Size: " . $hsize . "\n";
    print "HashName: $hn\n";
    if ($i == 0){
        print "Feed the hash $hn: ";
        for (my $j=$i; $j<=$#dA; $j++){
            $hn{ $dA[$j] } = $wA[$j];
            print "$dA[$j] => $wA[$j], ";
        }
        print "\n";
    }
    if ($i == 1){
        print "Feed the hash $hn: ";
        for (my $j=$i; $j<=$#dA; $j++){
            $hn{ $dA[$j] } = $wA[$j];
            print "$dA[$j] => $wA[$j], ";
        }
        print "\n";
    }
    if ($i == 2){
        print "Feed the hash $hn: ";
        for (my $j=$i; $j<=$#dA; $j++){
            $hn{ $dA[$j] } = $wA[$j];
            print "$dA[$j] => $wA[$j], ";
        }
        print "\n";
    }
    if ($i == 3){
        print "Feed the hash $hn: ";
        for (my $j=$i; $j<=$#dA; $j++){
            $hn{ $dA[$j] } = $wA[$j];
            print "$dA[$j] => $wA[$j], ";
        }
        print "\n";
    }
    if ($i == 4){
        print "Feed the hash $hn: ";
        for (my $j=$i; $j<=$#dA; $j++){
            $hn{ $dA[$j] } = $wA[$j];
            print "$dA[$j] => $wA[$j], ";
        }
        print "\n";
    }
    if ($i == 5){
        print "Feed the hash $hn: ";
        for (my $j=$i; $j<=$#dA; $j++){
            $hn{ $dA[$j] } = $wA[$j];
            print "$dA[$j] => $wA[$j], ";
        }
        print "\n";
    }
    if ($i == 6){
        print "Feed the hash $hn: ";
        for (my $j=$i; $j<=$#dA; $j++){
            $hn{ $dA[$j] } = $wA[$j];
            print "$dA[$j] => $wA[$j], ";
        }
        print "\n";
    }
    @hk = keys %hn;
    $hsize = @hk;
    print "2. HashName: " . $hn . " Size: " . $hsize . "\n";
}

print "\n";
print "Araay with hashNames: " . @hna . " Array length: " . $#hna . "\n";
print "\n\n\n";

print "Hash info out of the FOR loop\n";

for (my $k=0; $k<=$#hna; $k++){
    @hnaca = keys %{$hna[$k]};
    #@hnaca = keys @{ @hna[$k] };
    #@hnaca = keys \%{ $hna[$k] };
    #@hnaca = keys %{ $hna->[$k] };
    print "Element: " . $k . " HashName: " . $hna[$k] . " Size(\$#): " . $#hnaca . " Size(\@): " . @hnaca . "\n";
}

如何获得期望值?

程序的问题是根本没有保存哈希值。push@hna,$hn;将哈希的名称作为字符串推送到@hna。这是为for外部保存的唯一变量

如果您将名称和在@hna中创建的哈希都保存如下:push@hna,{name=>$hn,hash=>\%hn};你会更成功

 @@ -9,9 +9,7 @@ use Data::Dumper;

  for (my $i=0; $i<=$#wA; $i++){
      $hn = "hash-$wA[$i]";
 -    push(@hna, $hn);
 -    %hn = ();
 -    #my %hn;
 +    my %hn = ();
      $hsize = @hn;
      print "1. HashName: " . $hn . " Size: " . $hsize . "\n";
      print "HashName: $hn\n";
 @@ -73,6 +71,7 @@ for (my $i=0; $i<=$#wA; $i++){
      }
      @hk = keys %hn;
      $hsize = @hk;
 +    push(@hna, {name => $hn, hash => \%hn});
      print "2. HashName: " . $hn . " Size: " . $hsize . "\n";
  }

 @@ -83,9 +82,9 @@ print "\n\n\n";
  print "Hash info out of the FOR loop\n";

  for (my $k=0; $k<=$#hna; $k++){
 -    @hnaca = keys %{$hna[$k]};
 +    @hnaca = keys %{$hna[$k]->{"hash"}};
      #@hnaca = keys @{ @hna[$k] };
      #@hnaca = keys \%{ $hna[$k] };
      #@hnaca = keys %{ $hna->[$k] };
 -    print "Element: " . $k . " HashName: " . $hna[$k] . " Size(\$#): " . $#hnaca . " Size(\@): " . @hnaca . "\n";
 +    print "Element: " . $k . " HashName: " . $hna[$k]->{"name"} . " Size(\$#): " . $#hnaca . " Size(\@): " . @hnaca . "\n";
  }
这为我提供了一个完整的程序:

 #!/usr/bin/perl -w

 use warnings;
 use English;
 use Data::Dumper;

 @wA = ("a", "b", "c", "d", "e", "f");
 @dA = (1, 2, 3, 4, 5, 6);

 for (my $i=0; $i<=$#wA; $i++){
     $hn = "hash-$wA[$i]";
     my %hn = ();
     $hsize = @hn;
     print "1. HashName: " . $hn . " Size: " . $hsize . "\n";
     print "HashName: $hn\n";
     if ($i == 0){
         print "Feed the hash $hn: ";
         for (my $j=$i; $j<=$#dA; $j++){
             $hn{ $dA[$j] } = $wA[$j];
             print "$dA[$j] => $wA[$j], ";
         }
         print "\n";
     }
     if ($i == 1){
         print "Feed the hash $hn: ";
         for (my $j=$i; $j<=$#dA; $j++){
             $hn{ $dA[$j] } = $wA[$j];
             print "$dA[$j] => $wA[$j], ";
         }
         print "\n";
     }
     if ($i == 2){
         print "Feed the hash $hn: ";
         for (my $j=$i; $j<=$#dA; $j++){
             $hn{ $dA[$j] } = $wA[$j];
             print "$dA[$j] => $wA[$j], ";
         }
         print "\n";
     }
     if ($i == 3){
         print "Feed the hash $hn: ";
         for (my $j=$i; $j<=$#dA; $j++){
             $hn{ $dA[$j] } = $wA[$j];
             print "$dA[$j] => $wA[$j], ";
         }
         print "\n";
     }
     if ($i == 4){
         print "Feed the hash $hn: ";
         for (my $j=$i; $j<=$#dA; $j++){
             $hn{ $dA[$j] } = $wA[$j];
             print "$dA[$j] => $wA[$j], ";
         }
         print "\n";
     }
     if ($i == 5){
         print "Feed the hash $hn: ";
         for (my $j=$i; $j<=$#dA; $j++){
             $hn{ $dA[$j] } = $wA[$j];
             print "$dA[$j] => $wA[$j], ";
         }
         print "\n";
     }
     if ($i == 6){
         print "Feed the hash $hn: ";
         for (my $j=$i; $j<=$#dA; $j++){
             $hn{ $dA[$j] } = $wA[$j];
             print "$dA[$j] => $wA[$j], ";
         }
         print "\n";
     }
     @hk = keys %hn;
     $hsize = @hk;
     push(@hna, {name => $hn, hash => \%hn});
     print "2. HashName: " . $hn . " Size: " . $hsize . "\n";
 }

 print "\n";
 print "Araay with hashNames: " . @hna . " Array length: " . $#hna . "\n";
 print "\n\n\n";

 print "Hash info out of the FOR loop\n";

 for (my $k=0; $k<=$#hna; $k++){
     @hnaca = keys %{$hna[$k]->{"hash"}};
     #@hnaca = keys @{ @hna[$k] };
     #@hnaca = keys \%{ $hna[$k] };
     #@hnaca = keys %{ $hna->[$k] };
     print "Element: " . $k . " HashName: " . $hna[$k]->{"name"} . " Size(\$#): " . $#hnaca . " Size(\@): " . @hnaca . "\n";
 }

奇怪的是,这就是你想要的吗

use warnings;
use strict;

my @wA = qw(a b c d e f);
my @dA = qw(1 2 3 4 5 6);

my %hash;

for my $w (@wA){
    $hash{$w} = shift @dA;
}
…或者使用迭代器我们很少需要Perl中的迭代器。注意..的用法。。又称作触发器运算符或正式的运算符:

for my $i (0..$#wA){
    $hash{$wA[$i]} = $dA[$i];
}
…甚至更简洁一点,没有显式定义的迭代器:

for (0..$#wA){
    $hash{$wA[$_]} = $dA[$_];
}
…最终,只要预先检查了每个阵列的长度,您甚至可以得到这样的结果:

for (@wA){
    $hash{$_} = shift @dA; # requires array length checks
}
“@Borodin又提出了一个我忽略的建议,a:

然后,在上述所有情况下,使用自卸车,或:


Bolav,谢谢你的快速解决方案和解释。@stevieb我不会强迫任何人使用strict。不使用strict是可以的。不使用strict,然后在代码不起作用时请求免费帮助——特别是在strict可能会发现的情况下,这是不礼貌的。甚至@hash{@wa}=@daohhh-nice。忘了那个;您的链接是到splice的,这与slice不同。修正了,谢谢你。很好的捕获。可能$hash{$wA[$\u]}=$dA[$\u0]为0$wA这是更好的,因为它是非破坏性的。真的!除了你已经接受的答案之外,你的程序还有很多错误,但是很难理解你想要做什么,以及预期的值可能是什么。您需要从添加use strict和use warnings“all”开始;您肯定在编写的每个Perl程序上都看到过这样做的建议?但是,如果你能更好地解释你的目标,那么你就会得到更好的帮助。你似乎在做一些可怕的事情,这解释了为什么使用变量作为变量名是令人讨厌的。您还应该注意-$hn和%hn没有任何关系。
for (@wA){
    $hash{$_} = shift @dA; # requires array length checks
}
@hash{@wa} = @dA
for my $key (keys %hash){
    print "$key: $hash{$key}\n";
}