2013-08-22 53 views
3

我有一个哈希my %read_data =();为什么将Perl哈希值添加为关键字?

我试图建立这样

$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"; 
} 
+2

您向我们展示了您的输入,但不是用于生成输出的代码。 – Quentin

+0

我忘了keys关键字以及生成调试输出的内容。所有照顾在OP。 – octopusgrabbus

+1

'使用Data :: Dumper;打印Dumper(\%read_data);' – toolic

回答

6

有之间的关系阵列和散列:

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

这创建在3成员散列,密钥为one,two和`三。那么是这样的:

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

+1

没有这样的“哈希上下文中的数组”。当你说'my%hash = @ array'时,你正在使用一个数组来_initialize_一个散列。 –

+0

关于唯一我要补充的是,有时候你不需要知道密钥,而且顺序无关紧要。在这种情况下,您只需循环['values'](http://perldoc.perl.org/functions/values.html)。 –

6

虽然这将需要你发布你的代码,使某些操作时,输出判断你似乎是迭代散列,就好像是阵列式打印此; Perl会让你做到这一点,但它几乎从来没有你想要的。相反,尝试这样的事:

foreach my $key (keys %read_data) { 
    my $value = $read_data{$key}; 
    print "$key = $value\n"; 
}; 
3

使用foreach通过散列会得到它的键和值顺序,所以不这样做。

这为我工作:

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

(我大大喜欢让哈希而不是哈希然后不得不再次抬头。)

相关问题