没有键名的Perl哈希值

时间:2012-03-14 00:27:11

标签: perl hash

Perl是否可以访问哈希值,如果它只有一个键,而不使用键值?

我们说,%h只有'key_name' => 'value'

我可以仅通过'value'访问$h->{key_name}吗?

或者,可以在没有密钥名称的情况下访问此'value'吗?

3 个答案:

答案 0 :(得分:13)

哈希的values内置函数将返回所有哈希值的列表。您可以使用它来获取或设置带有别名列表结构的任何值,例如foreachmapgrep

for my $value (values %hash) {
    say $value;  # prints the value
    $value++;    # adds one to the value
}

或者您可以将值存储在数组中:

my @vals = values %hash;

返回值的顺序实际上是随机的,但它与相应的keys函数的顺序相同。

哈希本身就是列表,因此您可以访问列表上下文中哈希的任何奇数元素来获取该值,但是这种方法的效率较低,因为整个哈希需要拆分以形成列表,而不仅仅是值。

上述技术适用于任何大小的哈希。如果您只有一个键/值对:

my %hash = qw(foo bar);

然后他们减少到:

{my ($x) = values %hash;    say $x} # bar
{my (undef, $x) = %hash;    say $x} # bar
{my $x = (values %hash)[0]; say $x} # bar
{my $x = (%hash)[1];        say $x} # bar

答案 1 :(得分:4)

有很多方法可以做到这一点。例如:

my %h=("key_name"=>"value"); print values(%h)

my %h=("key_name"=>"value"); print( (%h)[1])

但在我看来,这看起来并不漂亮......

答案 2 :(得分:-2)

这里有两个选项 - 您可以优化空间,也可以优化时间。如果你需要从该值获取密钥并且不关心它需要多长时间,你可以遍历关联数组中的每个条目:

while(($key, $value) = each(%h))
{
    if($value eq 'value')
    {
        return $key;
    }
}

但如果您不介意拥有两份副本,那么最省时的解决方案就是保持一个向前和向后的关联数组 - 即:%h_by_name%h_by_value

在这种情况下,如果您有多个具有相同值的键,则%h_by_value应包含一个数组。那就是:

%h_by_name = (
    "a" => "1",
    "b" => "1",
    "c" => "1",
    "d" => 2"
);

然后你想构建你的%h_by_value,使其成为:

%h_by_value = (
    "1" => [ "a", "b", "c" ],
    "2" => [ "d" ]
);