perl:为什么引用匿名数组标量?

时间:2015-12-10 14:49:27

标签: arrays perl reference scalar

我还没有在Perl中编程超过10年,所以对于经验丰富的Perl程序员来说,这可能是显而易见的。我搜索了一个答案,但没有找到任何答案。

我的问题是:为什么引用匿名数组标量?

例如,在以下代码中:

null

结果是:

#!/usr/bin/perl

use strict;
use feature qw(say);

my @array1 = ('one');
say 'array ref 1: ' . \@array1;
my @array2 = ('one', 'two');
say 'array ref 2: ' . \@array2;
say 'array ref 3: ' . \('one');
say 'array ref 4: ' . \('one', 'two');

exit 0;

为什么数组引用3和数组引用4是标量?

3 个答案:

答案 0 :(得分:14)

所有引用都是标量。对字符串化引用时,它包含引用的类型。这意味着您可以引用标量。

[ ]是构造数组的运算符。 ( )不会创建任何数组。

你想要

say 'array ref 3: ' . ['one'];
say 'array ref 4: ' . ['one', 'two'];

通常,parens只会改变优先权。如果这是真的,

\('one', 'two')

等同于

('one', \'two')

那是因为标量上下文中的逗号/列表运算符通常返回其最后一个表达式求值的运算符/列表运算符。但是\(...)是特殊的,等同于以下更有用的结构:

(\'one', \'two')
  

引用枚举列表与使用方括号不同 - 相反,它与创建引用列表相同!

@list = (\$a, \@b, \%c);
@list = \($a, @b, %c);      # same thing!

这意味着

say 'array ref 4: ' . \('one', 'two');

相当于

say 'array ref 4: ' . (\'one', \'two');

相当于

say 'array ref 4: ' . \'two';

答案 1 :(得分:8)

来自perlref

  

对枚举列表的引用与使用方括号不同 - 而是与创建引用列表相同!

@list = (\$a, \@b, \%c);
@list = \($a, @b, %c);      # same thing!

您会得到标量引用,因为列表中以其引用传递给LHS的项目是标量。

答案 2 :(得分:3)

好像你期望它们是等价的:

my @array1 = ('one', 'two');
my $array2 = \('one', 'two');

但这不是获取匿名数组的正确语法。您需要使用方括号来创建匿名数组。

my $array3 = ['one', 'two'];  # a reference to an anonymous array
my $array4 = \['one', 'two']; # a reference to a reference to an anonymous array