[英]Perl - why does my assignment from an array ref give an error
下面的片段A可以工作,通過取消引用數組引用來復制數組。
在某些實際代碼中更深的片段B沒有。 注釋掉的行不是真實代碼的一部分,它可以正常工作(%ips是一個哈希,其中每個鍵是一個IP地址,每個值是對數組的引用)。
但是為什么注釋掉的行會失敗並顯示消息
全局符號“ $ ips”在以下位置需要顯式的程序包名稱。
my $a1 = [1,2,3];
say $$a1[1];
my @a2 = @$a1;
say "@a2";
else {
# Initialise count to 1,
# set both dates:
$ips{$1} = [1, $2, $2];
# my @arr = @$ips{$1}; # error...
}
Perl正在尋找$ips
變量,因為在取消引用%ips
哈希值時犯了錯誤。 您可以
my @arr = @{ $ips{$1} };
要么
my $ref = $ips{$1};
my @arr = @$ref; # or @{ $ref }
使用如下代碼的問題:
@$ips{$1}
就是說您認為“ @”取消了對“ $ ips {$ 1}”的引用(因此可以將其分配給數組),但實際上該行使用“ {$ 1}”從“ @ $ ips”中獲取元素。
“ @”和“ $”信號的綁定比“ {$ 1}”的綁定更緊密,因此以上內容更接近:
(@$ips) {$1}
比您想要的是:
@ ($ips{$1})
為了克服這個問題,您可以通過將“ $ ips {$ 1}”放在大括號中來告訴Perl在$ ips {$ 1}上使用“ @”標記,如下所示:
@{$ips{$1}}
這樣,就不會出現先發生的歧義。
@$ips{$1}
是短的
@{ $ips }{$1} # Hash slice, like @hash{"a", "b", "c"}
但是你想要
@{ $ips{$1} } # Array, like @array
Scalar Direct $NAME $scalar
Scalar By ref (simple) $$NAME $$scalar_ref
Scalar By ref $BLOCK ${ $scalar_ref }
Array Direct @NAME @array
Array By ref (simple) @$NAME @$array_ref
Array By ref @BLOCK @{ $array_ref }
Hash Direct %NAME %hash
Hash By ref (simple) %$NAME %$hash_ref
Hash By ref %BLOCK %{ $hash_ref }
Hash element Direct $NAME{EXPR} $hash{key}
Hash element By ref (simple) $$NAME{EXPR} $$hash_ref{key}
Hash element By ref $BLOCK{EXPR} ${ $hash_ref }{key}
Hash slice Direct @NAME{LIST} @hash{qw( a b c )}
Hash slice By ref (simple) @$NAME{LIST} @$hash_ref{qw( a b c )}
Hash slice By ref @BLOCK{LIST} @{ $hash_ref }{qw( a b c )}
Array element Direct $NAME[EXPR] $array[3]
Array element By ref (simple) $$NAME[EXPR] $$array_ref[3]
Array element By ref $BLOCK[EXPR] ${ $array_ref }[3]
Array slice Direct @NAME[LIST] @array[3..5]
Array slice By ref (simple) @$NAME[LIST] @$array_ref[3..5]
Array slice By ref @BLOCK[LIST] @{ $array_ref }[3..5]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.