为什么将Perl哈希值添加为键?

时间:2013-08-22 15:10:43

标签: perl

我有一个哈希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";
}

3 个答案:

答案 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 );

这会创建一个包含键onetwo和`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";
}

(我非常喜欢获取哈希条目而不是哈希密钥,然后必须再次查找。)