3

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

3 回答 3

6

虽然它需要你发布你的代码来确定,但从输出来看,你似乎在迭代哈希,就好像它是一个数组一样;Perl 会让你这样做,但它几乎从来都不是你想要的。相反,尝试这样的事情:

foreach my $key (keys %read_data) {
  my $value = $read_data{$key};
  print "$key = $value\n";
};
于 2013-08-22T15:15:16.847 回答
6

您遇到的数组和哈希之间存在关系:

my %hash = ( one => 1, two => 2, three => 3 );

这将创建一个三成员散列,其键one为 、two和 `three。这样做也是如此:

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哈希,并将其呈现在列表上下文中,每个后跟它的

有几种方法可以解决这个问题。一种是使用提取散列中的所有键并返回键的数组。这通常与sort结合使用,以将键排序为某种顺序。

for my $k1 ( sort keys %read_data ) {

另一种是使用each返回一系列两个成员数组,其中一个键和一个值。

于 2013-08-22T15:57:37.010 回答
3

使用 a foreachover a hash 将按顺序获取其键和值,所以不要这样做。

这对我有用:

while (my ($k, $v) = each %read_data) {
    print "$k = $v\n";
}

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

于 2013-08-22T15:17:08.027 回答