2011-10-29 77 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; 

無效的情況下鍵重置哈希的內部迭代器。標量上下文中的每個返回下一個鍵。