[英]Printing values for hash of arrays in perl
我有一个声明如下的数组哈希:
my %hash;
push @{ $hash{ $value1[$_] } }, [ $value1[$_], $value2[$_], $value3[$_], $value4[$_], $value5[$_] ] for 0 .. $#value1;
我希望能够使用以下方法检查每个键的值:
open KEYS, '>keys.txt' or die "Can't write to 'keys.txt'\n";
for my $key ( sort keys %hash ) {
print KEYS "Key: $key contains the values: ";
for my $value ( @{$hash{$value1}} ) {
print KEYS "$value ";
}
print KEYS "\n";
}
close(KEYS);
虽然我可以使用Data :: Dumper可视化键和关联值,但上面代码的输出为每个键提供了内存位置,而不是值。 例如:
Key: 'Value1' contains the values: ARRAY(0x7fcd8645ba68)
即使我将相同数量的值推送到每个数组上,每个键包含不同数量的值
我这样做的方式有问题吗?
首先,在你的内循环中,你有
for my $value ( @{$hash{$value1}} ) {
print KEYS "$value ";
}
究竟是什么$value1
? 我想你想用$key
。 始终use strict; use warnings
use strict; use warnings
来警告未定义的值和未声明的变量。
接下来,让我们来看看当我们这样做时会发生什么
my %hash;
push @{ $hash{ $value1[$_] } }, "(value$_)" for 0 .. $#value1;
相反,即我们只是将一个字符串推入散列中的arrayref。 然后,输出看起来有点像
Key: Value1 contains the values: (value0)
Key: Value2 contains the values: (value1)
Key: Value3 contains the values: (value2)
啊哈! 无论我们如何推动该阵列都按原样打印出来。 如果你像[...]
那样推送一个匿名的数组,你会得到该引用的字符串: ARRAY(0x1234567)
。
您可能想要该arrayref的内容。 容易:只是取消引用它。
...;
print KEYS "[@$value] ";
或类似的东西。 这里使用"[...]"
只是为了对输出进行可视化分组。
风格笔记:
请考虑使用词法文件句柄open
3-arg:
my $filename = "keys.txt";
open my $keys, "<", $filename or die "Can't open $filename: $!";
或使用自动错误处理:
use autodie;
open my $keys, "<", "keys.txt";
无论哪种方式,通常重要的是你包括失败的原因 $!
在错误消息中,或它几乎无用。
您可以根据自己的喜好使用map
和join
,而不是使用循环。 我可能会把循环写成
use feature 'say';
for my $key ( sort keys %hash ) {
say {$keys} "Key: $key contains the values: "
. join " ", map { "[@$_]" } @{ $hash{$key} };
}
那是因为你正在推送一个arrayref而不是一个值列表。
相比
push @array, [ $foo ];
至
push @array, $foo;
两个@array
都包含一个元素,但前者包含一个包含$foo
的arrayref,而后者只包含$foo
。
如果你在第一次push
争论后失去了方括号,你就会好起来。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.