gpt4 book ai didi

arrays - 在 perl 中打印数组散列值

转载 作者:行者123 更新时间:2023-12-01 09:00:52 31 4
gpt4 key购买 nike

我有一个数组的散列,声明如下:

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 来警告未定义的值和未声明的变量。

接下来,让我们看看当我们这样做时会发生什么
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)

啊哈!我们推送到那个 arrayref 的任何内容都会按原样打印出来。如果您推送像 [...] 这样的匿名数组引用,则会得到该引用的字符串化: ARRAY(0x1234567)

您可能想要该 arrayref 的内容。简单:只需取消引用它。
...;
print KEYS "[@$value] ";

或类似的东西。这里使用 "[...]" 只是为了直观地对输出进行分组。

样式说明:

请考虑带有词法文件句柄的 3-arg open:
my $filename = "keys.txt";
open my $keys, "<", $filename or die "Can't open $filename: $!";

或使用自动错误处理:
use autodie;
open my $keys, "<", "keys.txt";

无论哪种方式,在错误消息中包含 $! 失败的原因通常都很重要,否则几乎没有用。

使用 mapjoin 代替循环,你的代码可能更优雅,这取决于你的口味。我可能会把循环写成
use feature 'say';
for my $key ( sort keys %hash ) {
say {$keys} "Key: $key contains the values: "
. join " ", map { "[@$_]" } @{ $hash{$key} };
}

关于arrays - 在 perl 中打印数组散列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17341833/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com