在 Perl 中打印哈希值
Printing hash value in Perl
当我打印一个变量时,我得到一个 HASH(0xd1007d0)
值。我需要打印所有键和值的值。但是,我不能,因为控件没有进入循环。
foreach my $var(keys %{$HashVariable}){
print"In the loop \n";
print"$var and $HashVariable{$var}\n";
}
但是控件甚至没有进入循环。我是 perl 新手。
我不能完全回答,因为这完全取决于 $HashVariable
中的内容。
分辨其中内容的最简单方法是:
use Data::Dumper;
print Dumper $HashVariable;
假设这是一个散列 reference - 如果 print $HashVariable
给出 HASH(0xdeadbeef)
作为输出,它将是。
所以这个应该工作:
#!/usr/bin/env perl
use strict;
use warnings;
my $HashVariable = { somekey => 'somevalue' };
foreach my $key ( keys %$HashVariable ) {
print $key, " => ", $HashVariable->{$key},"\n";
}
你犯的唯一错误是 $HashVariable{$key}
不起作用 - 你需要取消引用,因为就目前而言,它指的是 %HashVariable
而不是 $HashVariable
这是两个完全不同的东西。
否则 - 如果它没有进入循环 - 这可能意味着 keys %$HashVariable
没有返回任何东西。这就是 Dumper
测试有用的原因 - 是否有可能您没有正确填充它,或者您正在 将 写入 %HashVariable
。
例如:
my %HashVariable;
$HashVariable{'test'} = "foo";
这里有一个明显的问题,但它不会导致您看到的行为。
您认为您在 $HashVariable
中有一个散列引用,考虑到您在打印时看到的 HASH(0xd1007d0)
输出,这听起来是正确的。
但是设置散列引用和 运行 您的代码会产生稍微奇怪的结果:
my $HashVariable = {
foo => 1,
bar => 2,
baz => 3,
};
foreach my $var(keys %{$HashVariable}){
print"In the loop \n";
print"$var and $HashVariable{$var}\n";
}
我得到的输出是:
In the loop
baz and
In the loop
bar and
In the loop
foo and
请注意,这些值并未打印出来。那是因为我上面提到的问题。将 use strict
添加到程序中(您应该始终这样做)告诉我们问题出在哪里。
Global symbol "%HashVariable" requires explicit package name (did you forget to declare "my %HashVariable"?) at hash line 14.
Execution of hash aborted due to compilation errors.
您正在使用 $HashVariable{$var}
查找哈希中的键。如果您有一个名为 %HashVariable
的散列,那将是正确的,但您没有 - 您有一个名为 $HashVariable
的散列引用(请注意 $
而不是 %
)。要从哈希引用中查找键,您需要使用解引用箭头 - $HashVariable->{$var}
.
修复该问题,您的程序将按预期工作。
use strict;
use warnings;
my $HashVariable = {
foo => 1,
bar => 2,
baz => 3,
};
foreach my $var(keys %{$HashVariable}){
print"In the loop \n";
print"$var and $HashVariable->{$var}\n";
}
我看到了:
In the loop
bar and 2
In the loop
foo and 1
In the loop
baz and 3
获得您描述的结果(HASH(0xd1007d0)
输出但没有循环迭代)的唯一方法是如果您有哈希引用但哈希没有键。
所以(正如我在评论中所说)我们需要查看您的哈希引用是如何创建的。
当我打印一个变量时,我得到一个 HASH(0xd1007d0)
值。我需要打印所有键和值的值。但是,我不能,因为控件没有进入循环。
foreach my $var(keys %{$HashVariable}){
print"In the loop \n";
print"$var and $HashVariable{$var}\n";
}
但是控件甚至没有进入循环。我是 perl 新手。
我不能完全回答,因为这完全取决于 $HashVariable
中的内容。
分辨其中内容的最简单方法是:
use Data::Dumper;
print Dumper $HashVariable;
假设这是一个散列 reference - 如果 print $HashVariable
给出 HASH(0xdeadbeef)
作为输出,它将是。
所以这个应该工作:
#!/usr/bin/env perl
use strict;
use warnings;
my $HashVariable = { somekey => 'somevalue' };
foreach my $key ( keys %$HashVariable ) {
print $key, " => ", $HashVariable->{$key},"\n";
}
你犯的唯一错误是 $HashVariable{$key}
不起作用 - 你需要取消引用,因为就目前而言,它指的是 %HashVariable
而不是 $HashVariable
这是两个完全不同的东西。
否则 - 如果它没有进入循环 - 这可能意味着 keys %$HashVariable
没有返回任何东西。这就是 Dumper
测试有用的原因 - 是否有可能您没有正确填充它,或者您正在 将 写入 %HashVariable
。
例如:
my %HashVariable;
$HashVariable{'test'} = "foo";
这里有一个明显的问题,但它不会导致您看到的行为。
您认为您在 $HashVariable
中有一个散列引用,考虑到您在打印时看到的 HASH(0xd1007d0)
输出,这听起来是正确的。
但是设置散列引用和 运行 您的代码会产生稍微奇怪的结果:
my $HashVariable = {
foo => 1,
bar => 2,
baz => 3,
};
foreach my $var(keys %{$HashVariable}){
print"In the loop \n";
print"$var and $HashVariable{$var}\n";
}
我得到的输出是:
In the loop
baz and
In the loop
bar and
In the loop
foo and
请注意,这些值并未打印出来。那是因为我上面提到的问题。将 use strict
添加到程序中(您应该始终这样做)告诉我们问题出在哪里。
Global symbol "%HashVariable" requires explicit package name (did you forget to declare "my %HashVariable"?) at hash line 14.
Execution of hash aborted due to compilation errors.
您正在使用 $HashVariable{$var}
查找哈希中的键。如果您有一个名为 %HashVariable
的散列,那将是正确的,但您没有 - 您有一个名为 $HashVariable
的散列引用(请注意 $
而不是 %
)。要从哈希引用中查找键,您需要使用解引用箭头 - $HashVariable->{$var}
.
修复该问题,您的程序将按预期工作。
use strict;
use warnings;
my $HashVariable = {
foo => 1,
bar => 2,
baz => 3,
};
foreach my $var(keys %{$HashVariable}){
print"In the loop \n";
print"$var and $HashVariable->{$var}\n";
}
我看到了:
In the loop
bar and 2
In the loop
foo and 1
In the loop
baz and 3
获得您描述的结果(HASH(0xd1007d0)
输出但没有循环迭代)的唯一方法是如果您有哈希引用但哈希没有键。
所以(正如我在评论中所说)我们需要查看您的哈希引用是如何创建的。