打印perl中数组哈希的值

fug*_*ugu 3 arrays perl hash key

我有一个声明如下的数组哈希:

my %hash;
push @{ $hash{ $value1[$_] } }, [ $value1[$_], $value2[$_], $value3[$_], $value4[$_], $value5[$_] ] for 0 .. $#value1;
Run Code Online (Sandbox Code Playgroud)

我希望能够使用以下方法检查每个键的值:

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);
Run Code Online (Sandbox Code Playgroud)

虽然我可以使用Data :: Dumper可视化键和关联值,但上面代码的输出为每个键提供了内存位置,而不是值.例如:

Key: 'Value1' contains the values: ARRAY(0x7fcd8645ba68) 
Run Code Online (Sandbox Code Playgroud)

即使我将相同数量的值推送到每个数组上,每个键包含不同数量的值

我这样做的方式有问题吗?

amo*_*mon 6

首先,在你的内循环中,你有

for my $value ( @{$hash{$value1}} ) {
    print KEYS "$value ";
}   
Run Code Online (Sandbox Code Playgroud)

究竟是$value1什么?我想你想用$key.总是use strict; use warnings得到关于未定义值和未声明变量的警告.

接下来,让我们来看看当我们这样做时会发生什么

my %hash;
push @{ $hash{ $value1[$_] } }, "(value$_)" for 0 .. $#value1;
Run Code Online (Sandbox Code Playgroud)

相反,即我们只是将一个字符串推入散列中的arrayref.然后,输出看起来有点像

Key: Value1 contains the values: (value0)
Key: Value2 contains the values: (value1)
Key: Value3 contains the values: (value2)
Run Code Online (Sandbox Code Playgroud)

啊哈!无论我们如何推动该阵列都按原样打印出来.如果您按下匿名arrayref [...],则会得到该引用的字符串:ARRAY(0x1234567).

您可能想要该arrayref的内容.容易:只是取消引用它.

...;
print KEYS "[@$value] ";
Run Code Online (Sandbox Code Playgroud)

或类似的东西.在"[...]"这里只是用来直观地组输出.


风格笔记:

请考虑open使用词法文件句柄3-arg :

my $filename = "keys.txt";
open my $keys, "<", $filename or die "Can't open $filename: $!";
Run Code Online (Sandbox Code Playgroud)

或使用自动错误处理:

use autodie;
open my $keys, "<", "keys.txt";
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,通常重要的是在错误消息中包含失败的原因$!,或者它几乎无用.

而不是使用循环,您的代码可能会更优雅,mapjoin根据您的口味.我可能会把循环写成

use feature 'say';
for my $key ( sort keys %hash ) {
    say {$keys} "Key: $key contains the values: "
      . join " ", map { "[@$_]" } @{ $hash{$key} };
}
Run Code Online (Sandbox Code Playgroud)