Arrays Perl:在for循环中馈送的哈希在循环外为空
我对散列函数有一定的了解。通过一个“for”循环,我动态地创建散列和“hashnames”,并向它们提供一些键/值元素。不幸的是,这些值在循环外不再可见。 下面是我正在使用的小代码及其输出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
#!/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";
}