2011-10-29 38 views
-2

我有一个子程序,返回一个散列的引用。我想从该散列获得第一个键,并在子程序返回后为其分配一个变量。现在,我这样做的,这工作,但我觉得应该有一个更聪明/更简单的方法从哈希分配密钥到变量

my $hash = get_value(); # calling my subroutine here which returns a reference to a hash 
foreach my $keys (keys %{$hash}) { 
    my $test_variable = $keys; # Assigning the first key to variable 
    # check if variable is not empty and exit the loop 
    if (!$test_variable) { 
     last; 
    } 
} 
+10

**哈希不存储元素的顺序**如果你需要订单,你使用一个数组。如果你真的需要一个有序的哈希,看看'Tie :: IxHash'模块。 –

+1

正确。没有“第一把钥匙”。 –

回答

1

所有你需要的是:

my($test_variable) = keys %$hash; 
+0

如果我在该散列中获得一个或多个键并且我关心的是进入test_variable的第一个键,该怎么办? – user238021

+0

在这种情况下,'$ test_variable'将只取第一个元素,其他所有元素都将被删除。 – drnewman

+1

Perl在将列表分配给列表方面灵活灵活。 '$ test_variable'周围的括号使得左边是一个元素列表,而不是标量。当列表分配的右侧比右侧多时,Perl会忽略额外的。同样,当左侧的元素比右侧多时,Perl会将剩余的元素设置为“undef”。 –

2
my $test_variable = (keys %{get_value()})[0]; 

由内而外的工作:的get_value()返回一个哈希引用,那么%{}周围将其解除引用到哈希,将键返回为数组,()[0]从该数组中获取第0项。

然而,由于转向散列成一个列表/阵列使您能够在关键项目,价值秩序,这个工程太:

my $test_variable = (%{get_value()})[0]; 
3

还要注意,虽然其他答案给你第一个关键Perl不保证哈希元素的顺序。如果您需要特定的订单,请保留一个单独的关键列表并使用它来访问“第一个”元素。

例如为:

my @fields = qw(a b c); 

my $test_variable = get_value()->{$fields[0]}; 
0
my $hash = get_value(); 
keys %$hash; 
my $test_variable = each %$hash; 
keys %$hash; 

无效的情况下键重置哈希的内部迭代器。标量上下文中的每个返回下一个键。