我有一个哈希my %read_data = ();
我正在尝试建立像这样的键和值
$read_data{"status"} = 0;
$read_data{"suffix"} = "_SP";
$read_data{"consumption"} = 95;
我所看到的如下,我无法弄清楚我做错了什么。
Key=status
Key=0
Key=suffix
Key=_SP
Key=consumption
Key=95
我正在使用
打印for my $k1 (%read_data)
{
print "Key=".$k1."\n";
}
答案 0 :(得分:6)
虽然它需要你发布你的代码来确定,但是根据输出判断你似乎正在迭代哈希,好像它是一个数组; Perl会让你这样做,但它几乎不是你想要的。相反,尝试这样的事情:
foreach my $key (keys %read_data) {
my $value = $read_data{$key};
print "$key = $value\n";
};
答案 1 :(得分:6)
你正在击中阵列和哈希之间存在关系:
my %hash = ( one => 1, two => 2, three => 3 );
这会创建一个包含键one
,two
和`3的三个成员哈希。这样做:
my %hash = ( "one", 1, "two", 2, "three", 3 );
事实上,这两行完全相同。 =>
是句法糖的一种形式,用于突出显示一个值与另一个值之间的关系。这又是同一条线。我只是在这个中弄乱你的大脑,但它产生了和以前一样的哈希:
my %hash = ( "one", 1 => "two", 2 => "three", 3 );
这是另一种分配相同哈希的方法:
my @array = ( "one", 1, "two", 2, "three", 3 );
my %hash = @array;
这也是有效的:
my @array = %hash;
Perl中的哈希和数组之间存在很强的关系。如果在哈希上下文中使用数组,它将变为哈希。如果在数组上下文中使用哈希,它将成为一个数组。 例如:
mysub (%hash);
sub mysub {
my %subhash = @_;
...
}
这是将哈希传递给子例程的有效(尽管不推荐的方法)。哈希被转换为@_
数组,然后被转换回子例程中的哈希值。
让我们来看看你的循环:
for my $k1 (%read_data) {
(...)
是一个列表/数组上下文,因此将采用您的%read_data
哈希值,并将其显示在列表上下文中,每个键后跟其值的。
有几种方法可以解决这个问题。一种是使用keys拉出哈希中的所有键并返回键的数组。这通常与sort结合使用,可以将键分类为一些相似的顺序。
for my $k1 ( sort keys %read_data ) {
另一种方法是使用each返回一系列两个成员数组,其中包含一个键和一个值。
答案 2 :(得分:3)
在哈希上使用foreach
将按顺序获取其键和值,所以不要这样做。
这对我有用:
while (my ($k, $v) = each %read_data) {
print "$k = $v\n";
}
(我非常喜欢获取哈希条目而不是哈希密钥,然后必须再次查找。)