如何仅将唯一值添加到用作哈希值的匿名数组?

时间:2010-03-25 10:28:20

标签: perl hash

编辑抱歉,我忘记了最重要的部分。每个键可以具有多个值。向那些已经回答的人道歉。稍后将使用printjoin在一行上打印$key的多个值。

在下面的示例代码中,假设值$keyvalue不断变化,我试图使用单行(或类似包含的内容)来测试并查看当前$keyvalue是否已存在。如果确实如此,则什么也不做。如果没有,那就推吧。这一行将驻留在while语句中,这就是为什么它需要包含在几行内。

只要没有重复值,保留顺序无关紧要。

my $key = "numbers";
my $keyvalue = 1;

my %hash = ($key => '1');

push (@{$hash{$key}}, $keyvalue) unless exists $hash{$key};

use strict; use warnings;我没有收到任何错误,但同时这不起作用。在上面的示例中,我希望由于默认值为1$keyvalue不会被推送,因为它也是1。也许我让自己全都转过身来......

是否有调整可以使这个工作或任何替代品可以用来代替完成同样的事情?

3 个答案:

答案 0 :(得分:5)

最简单的方法是在$hash{$key}放置一个匿名哈希。你只关心那个匿名哈希的密钥。

#!/usr/bin/perl

use strict; use warnings;

my %hash;

while ( my $line = <DATA> ) {
    chomp $line;
    my ($key, $val) = split /\s*=\s*/, $line;
    $hash{$key}{$val} = undef;
}

for my $key ( keys %hash ) {
    printf "%s : [ %s ]\n", $key, join(' ', keys %{ $hash{$key} });
}

__DATA__
key = 1
key = 2
other = 1
other = 2
key = 2
key = 3

在输出中,key = 2只出现一次:

C:\Temp> h
other : [ 1 2 ]
key : [ 1 3 2 ]

答案 1 :(得分:3)

你可以这样做:

$hash{$key} = $keyvalue unless exists $hash{$key};

仅当密钥不存在于散列中时,才会添加密钥,值对($key,$keyvalue)

答案 2 :(得分:0)

您没有push值为哈希,因为哈希需要键/值对,而push只会添加一个值。在表达式中,您将$hash{$key}视为要添加值的数组引用。您只需将该值分配给哈希即可。