簡體   English   中英

Perl-為什么我從數組ref的賦值給出錯誤

[英]Perl - why does my assignment from an array ref give an error

下面的片段A可以工作,通過取消引用數組引用來復制數組。

在某些實際代碼中更深的片段B沒有。 注釋掉的行不是真實代碼的一部分,它可以正常工作(%ips是一個哈希,其中每個鍵是一個IP地址,每個值是對數組的引用)。

但是為什么注釋掉的行會失敗並顯示消息

全局符號“ $ ips”在以下位置需要顯式的程序包名稱。

片段A:

my $a1 = [1,2,3];
say $$a1[1];
my @a2 = @$a1;
say "@a2";

片段B:

    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.

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