2012-03-14 132 views
0

如果沒有使用鍵值,Perl中是否可以訪問哈希值(如果它只有一個鍵)?我們假設%h只有'key_name' => 'value'沒有鍵名的Perl哈希值

我可以只通過$h->{key_name}訪問'value'嗎?

或者,有可能訪問此'value'沒有鍵名?

回答

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 
4

有很多方法可以做到這一點。例如:

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

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

但在我看來並不十分好看......

-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" ] 
); 
+0

當你的第二個建議,在這種情況下(只有一個鍵=值對)的作品。只有密鑰保證是唯一的,所以你可能會失去使用匹配值的對使用這種方法 – SkryneSaver 2012-03-14 10:55:31

+0

@SkryneSaver:是的,顯然如果你有多個唯一鍵值相同的值,那麼你需要添加一個間接級別。仍比循環查看整個哈希值更快。 – 2012-03-14 16:46:31