如果沒有使用鍵值,Perl中是否可以訪問哈希值(如果它只有一個鍵)?我們假設%h
只有'key_name' => 'value'
。沒有鍵名的Perl哈希值
我可以只通過$h->{key_name}
訪問'value'
嗎?
或者,有可能訪問此'value'
沒有鍵名?
如果沒有使用鍵值,Perl中是否可以訪問哈希值(如果它只有一個鍵)?我們假設%h
只有'key_name' => 'value'
。沒有鍵名的Perl哈希值
我可以只通過$h->{key_name}
訪問'value'
嗎?
或者,有可能訪問此'value'
沒有鍵名?
的散列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
有很多方法可以做到這一點。例如:
my %h=("key_name"=>"value"); print values(%h)
或
my %h=("key_name"=>"value"); print((%h)[1])
但在我看來並不十分好看......
你有兩個選擇 - 你可以優化的空間,或優化時間。如果你需要得到該值的鍵,你不關心它需要多長時間,你可以遍歷關聯數組中的每個條目:
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" ]
);
當你的第二個建議,在這種情況下(只有一個鍵=值對)的作品。只有密鑰保證是唯一的,所以你可能會失去使用匹配值的對使用這種方法 – SkryneSaver 2012-03-14 10:55:31
@SkryneSaver:是的,顯然如果你有多個唯一鍵值相同的值,那麼你需要添加一個間接級別。仍比循環查看整個哈希值更快。 – 2012-03-14 16:46:31