perl:为什么对匿名数组的引用是标量?
perl: why are references to anonymous arrays scalar?
我已经 10 多年没有用 Perl 编程了,所以对于更有经验的 Perl 程序员来说,这可能是显而易见的。我搜索了答案,但没有找到任何答案。
我的问题是:为什么对匿名数组的引用是标量?
例如在下面的代码中:
#!/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;
结果是:
array ref 1: ARRAY(0x1e1b1c0)
array ref 2: ARRAY(0x1e1b190)
array ref 3: SCALAR(0x1e1b280)
array ref 4: SCALAR(0x1e10c40)
为什么数组引用 3 和数组引用 4 是标量?
来自perlref:
Taking a reference to an enumerated list is not the same as using square brackets--instead it's the same as creating a list of references!
@list = ($a, \@b, \%c);
@list = \($a, @b, %c); # same thing!
您得到一个标量引用,因为列表中以其传递给 LHS 的引用结尾的项目是一个标量。
您似乎认为它们是等价的:
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
所有引用都是标量。当您对引用进行字符串化时,它包括它引用的类型。这意味着您有一个标量的引用。
[ ]
是构造数组的运算符。 ( )
不创建任何数组。
你想要
say 'array ref 3: ' . ['one'];
say 'array ref 4: ' . ['one', 'two'];
通常,parens 只是改变优先级。如果这是真的,
\('one', 'two')
相当于
('one', \'two')
这是因为标量上下文中的 comma/list 运算符通常 returns 其最后一个表达式的计算结果。但是 \(...)
是 special-cased 等同于以下更有用的结构:
(\'one', \'two')
Taking a reference to an enumerated list is not the same as using square brackets--instead it's the same as creating a list of references!
@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';
我已经 10 多年没有用 Perl 编程了,所以对于更有经验的 Perl 程序员来说,这可能是显而易见的。我搜索了答案,但没有找到任何答案。
我的问题是:为什么对匿名数组的引用是标量?
例如在下面的代码中:
#!/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;
结果是:
array ref 1: ARRAY(0x1e1b1c0)
array ref 2: ARRAY(0x1e1b190)
array ref 3: SCALAR(0x1e1b280)
array ref 4: SCALAR(0x1e10c40)
为什么数组引用 3 和数组引用 4 是标量?
来自perlref:
Taking a reference to an enumerated list is not the same as using square brackets--instead it's the same as creating a list of references!
@list = ($a, \@b, \%c); @list = \($a, @b, %c); # same thing!
您得到一个标量引用,因为列表中以其传递给 LHS 的引用结尾的项目是一个标量。
您似乎认为它们是等价的:
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
所有引用都是标量。当您对引用进行字符串化时,它包括它引用的类型。这意味着您有一个标量的引用。
[ ]
是构造数组的运算符。 ( )
不创建任何数组。
你想要
say 'array ref 3: ' . ['one'];
say 'array ref 4: ' . ['one', 'two'];
通常,parens 只是改变优先级。如果这是真的,
\('one', 'two')
相当于
('one', \'two')
这是因为标量上下文中的 comma/list 运算符通常 returns 其最后一个表达式的计算结果。但是 \(...)
是 special-cased 等同于以下更有用的结构:
(\'one', \'two')
Taking a reference to an enumerated list is not the same as using square brackets--instead it's the same as creating a list of references!
@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';