簡體   English   中英

在Perl中解引用數組鍵

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM