在上一個answer to a question about hash slices評論,有人想知道如何使用箭頭語法通過散列引用來訪問一個哈希片,心想也許是
@$ref->{@keys}
會這樣做。
是的,正確的語法是@$ref{@keys}
或@{$ref}{@keys}
,但這不在這個問題的重點。
我試圖算出與一個箭頭的表達需要的數據結構:
#! /usr/bin/env perl
use strict;
use warnings;
my $ref = {"a" => 1, "b" => 2, "c" => 3};
my @keys = qw/ a b c /;
#$ref = [ { a => 9, b => 8, c => 7 } ];
#$ref = [ { a => {}, b => {}, c => {} } ];
print @$ref->{@keys}, "\n";
作爲寫入時,代碼失敗
Not an ARRAY reference at ./prog line 12.
有道理:@$ref
想要的參考一個數組,所以我嘗試在一個匿名數組的引用內包裝哈希引用。這些嘗試失敗,
Can't use an undefined value as a HASH reference at ./prog line 12.
跟蹤輸出是
$ debugperl -Dt prog [...] (prog:12) pushmark (prog:12) padsv($ref) (prog:12) rv2av (prog:12) rv2hv Can't use an undefined value as a HASH reference at prog line 12.
爲print
行的語法轉儲
$ debugperl -Dx prog [...] { 484 TYPE = print ===> 2 FLAGS = (VOID,KIDS) { 485 TYPE = pushmark ===> 486 FLAGS = (SCALAR) } { 372 TYPE = helem ===> 371 FLAGS = (SCALAR,KIDS) { 487 TYPE = rv2hv ===> 361 TARG = 5 FLAGS = (SCALAR,KIDS,REF) PRIVATE = (STRICT_REFS) { 373 TYPE = rv2av ===> 487 TARG = 4 FLAGS = (SCALAR,KIDS,REF) PRIVATE = (STRICT_REFS) { 486 TYPE = padsv ===> 373 TARG = 1 FLAGS = (SCALAR,MOD) } } } { 361 TYPE = padav ===> 372 TARG = 2 FLAGS = (SCALAR) } } { 371 TYPE = const ===> 484 TARG = 19 FLAGS = (SCALAR) } } [...]
哪裏是未定義的值是從哪裏來的?程序的$ref
的值是否正常終止?
它是有效的(即使沒有意義),因此它不應該是語法錯誤。不過,這應該是一個嚴格的錯誤。 – ikegami