[英]Dereferencing an array key in Perl
考慮以下Perl腳本:
use strict;
my %new;
my $test_ref = [24, 26, 55];
$new{$test_ref} = 10;
foreach my $key (keys %new){
print $key->[0];
}
當我嘗試訪問此元素時,它給出了如下錯誤:
不能使用字符串(“ ARRAY(0x ...)”)作為數組引用
為什么?
因為哈希鍵始終是字符串化的,並且數組REFERENCE( $test_ref
是)的字符串化值恰好是: "ARRAY(0x...)"
。 這與Java映射不同,后者可以將任意對象存儲為鍵。
因此,您的哈希將具有1個ket-value對,其密鑰為字符串“ "ARRAY(0x...)"
“
因此,當您有for
循環時,它將循環所有鍵(全部1個鍵),然后將鍵值(字符串"ARRAY(0x...)"
)分配給$key
變量。
然后,您嘗試對該字符串進行數組解引用-因為它不是數組引用 ,所以當然不能這樣做-它只是一個字符串,其中包含以前使用的數組引用的字符串表示形式。
如果要將“ 24、26、55”作為3個哈希鍵,則可以執行以下操作:
my %new = map { $_ => 10 } @$test_ref;
如果您確實想將列表存儲在哈希鍵中,那么它是可行的,但並非總是如此(在整數列表的情況下,您可以,但是它很慢,笨拙,我無法想象您何時會希望這么做。
# Trivial example:
my $test_ref = [24, 26, 55];
$new{ join(",",@$test_ref) } = 10;
foreach my $key (keys %new){
my @list = split(/,/,$key);
print $list[0];
}
這種方法會有一些性能損失,並且可以進行一些優化(例如,通過記錄拆分結果)。 但是,出於幾乎任何原因,您可能都想這樣做,但也許還有更好的解決方案。
哈希鍵通常是字符串化的,因此它們失去了充當引用的功能。
核心模塊Tie :: RefHash提供了以下功能:
use strict;
use warnings;
use Tie::RefHash;
tie my %new, 'Tie::RefHash';
my $test_ref = [24, 26, 55];
$new{$test_ref} = 10;
foreach my $key (keys %new){
print $key->[0];
}
嚴把好用。 但是警告更為重要。
我猜(您可能錯了),您想將24、26和55分配為%new
的鍵。
如果要執行此操作,請遵循以下內容:
use strict;
my %new;
my $test_ref = [24, 26, 55];
@new{@$test_ref} = (10) x @$test_ref;
print "$new{$_}\n" foreach keys %new;
如果要訪問數組引用$test_ref
, $test_ref
使用數組語法(方括號)
$test_ref->[0];
如果要訪問哈希%new
,請使用哈希語法(大括號)
$new{$key}
您正在做的是使用數組引用$test_ref
作為哈希%new
的鍵$test_ref
所做的是將數組引用轉換為字符串以供鍵使用。 keys
返回的是字符串而不是引用。
您不能將引用用作鍵,然后再次(簡單地)重新獲得引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.