我已经有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标量?
所有引用都是标量.对字符串化引用时,它包括引用的类型.这意味着你有一个标量的引用.
[ ]
是构造数组的运算符.( )
不会创建任何数组.
你要
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';
来自perlref:
引用枚举列表与使用方括号不同 - 而是与创建引用列表相同!
@list = (\$a, \@b, \%c); @list = \($a, @b, %c); # same thing!
您会得到一个标量引用,因为列表中以其引用传递给LHS的项目是标量.