Perl是否可以访问哈希值,如果它只有一个键,而不使用键值?
我们说,%h
只有'key_name' => 'value'
。
我可以仅通过'value'
访问$h->{key_name}
吗?
或者,可以在没有密钥名称的情况下访问此'value'
吗?
答案 0 :(得分:13)
哈希的values内置函数将返回所有哈希值的列表。您可以使用它来获取或设置带有别名列表结构的任何值,例如foreach
,map
和grep
:
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" ]
);