6

想着下一个。有一个清单

qw(a b c);

现在,将 LIST 分配给无名(匿名)数组

[ qw(a b c) ]

所以接下来

use 5.016;
use warnings;
use diagnostics;
my $x = [ qw(a b c) ];
say ref $x;  #ARRAY - the $x is an ARRAY reference, and
say $x->[1]; #prints "b", and
say [ qw(a b c) ]->[1]; #works too

但现在会发生什么?

use 5.016;
use warnings 'all';
use diagnostics;
say ${[ qw(a b c) ]}[1];

它打印b,但是

my $y = ${[ qw(a b c) ]};

是一个错误,

Not a SCALAR reference at pepe line 6 (#1)
    (F) Perl was trying to evaluate a reference to a scalar value, but found
    a reference to something else instead.  You can use the ref() function
    to find out what kind of ref it really was.  See perlref.

Uncaught exception from user code:
    Not a SCALAR reference at pepe line 17.

那么,构造 ${.... } 是什么意思

  • 它在say(打印匿名数组的第二个元素)中“工作”,但不明白为什么
  • 但不能将其分配给变量

并且来自的提示diagnostics不是很有帮助,因为ref当我无法分配时我应该如何使用?我错过了perlref什么?

4

3 回答 3

10

${ EXPR1 }[ EXPR2 ]是数组索引取消引用。它返回由返回的EXPR2引用所引用的数组的索引处的元素EXPR1

${ $array_ref }[ ... ]是数组引用,就像$array[...]数组一样。


${ EXPR }后面没有[或者{是标量取消引用。它返回由返回的引用所引用的标量EXPR

${ $scalar_ref }是标量引用,因为$scalar是标量。


如您所见,在处理引用时,您可以使用与通常相同的语法,除了将变量的名称替换为{$ref}(保留前导符号)。

因此,@{ $array_ref }对数组引用就像@array对数组一样。

say @{[ qw(a b c) ]};

这是我之前发表的Mini-Tutorial: Dereferencing Syntax中图表的精髓。也可以看看:


糟糕,我以为你有

say ${[ qw(a b c) ]};   # Want to print a b c

你有

my $y = ${[ qw(a b c) ]};

你要

my $y = [ qw(a b c) ];

[]创建一个数组和对该数组的引用,并返回后者,有点像

my $y = do { my @anon = qw(a b c); \@a };
于 2013-05-13T21:59:20.910 回答
4

给定一个数组@arr和一个数组引用$aref = \@arr,那么在以下表达式组中,所有行都是等价的:

访问整个数组:

@ arr
@{$aref}

访问数组中的单个标量:

$ arr   [$i]
${$aref}[$i]
$ aref->[$i]

访问一个条目切片:

@ arr   [$i .. $j]
@{$aref}[$i .. $j]

(空格用于对齐,不建议用于实际代码)。

, ${}, @{}... 是外接取消引用运算符。但是,访问单个标量会将印记从%或更改@$。没有参考,这是完全有道理的。使用它们,它只是稍微复杂一点,直到您阅读perlreftut(尤其是两个参考使用规则)。

于 2013-05-13T21:58:58.957 回答
1

随着

${$ar}[0]

您对 perl 说:将数组中的第一个元素$ar作为参考点arrayref返回给我。$ar

随着建设

${$sr}

你对 perl 说:$srasSCALAR REF并将标量的值返回到参考$sr点。

因此,从评论中回答您的问题:当 $ar 是数组引用时,${$ar} 是什么?是:

当 $ar 是 $array-ref 时, ${$ar} 是 ERROR

因为您对 perl 说 - 采用标量引用,但 $ar 不是标量引用(它是数组引用)。

下一个示例清楚地显示了您的结构:

use 5.012;
use warnings;

my @arr = qw(a b c);
my $aref = \@arr;

my $myval = "VALUE";
my $sref = \$myval;

say $aref->[0];
say ${$aref}[0];
say ${$sref}; #your construction - here CORRECTLY points to an scalar

#say ${$aref} #ERROR because the ${$xxx} mean: take scalar ref, but the $aref is array ref.
于 2013-05-13T23:25:40.500 回答