Perl新手,我发现Perl标量和列表相当混乱。
下面的代码
$a = ("a", "b", "c");
print "$a n";
结果将是"c">
但是如果我给数组命名
@arr = ("a", "b", "c");
$a = @arr;
print "$a n";
的结果是3,这是元素
的编号。我想第二个是规格,但我不明白为什么它返回&;c&;
上下文影响操作符的返回值。
@arr = ("a", "b", "c");
这是一个列表赋值操作符,因为=
的左侧看起来像列表。列表赋值操作符在列表上下文中计算其右侧。
列表上下文中的逗号操作符计算列表上下文中的每个操作数,并产生由其操作数产生的所有标量。
$a = @arr;
这是一个标量赋值操作符,因为=
的左侧看起来不像列表。标量赋值操作符在标量上下文中计算其右侧。
标量上下文中的数组生成数组中元素的个数。
$a = ("a", "b", "c");
这是一个标量赋值操作符,因为=
的左侧看起来不像列表符。标量赋值操作符在标量上下文中计算其右侧。
逗号操作符在标量上下文中求空上下文中除最后一个操作数外的所有操作数,然后求标量上下文中的最后一个操作数。生成最后一个操作数产生的标量。
这意味着
EXPR, EXPR2, EXPR3 # In scalar context
类似于
do { EXPR; EXPR2; EXPR3 } # In scalar context
(只是没有词法作用域)
裁判:
- 标量对列表赋值运算符
- 逗号操作符
数组使用总结
use strict;
use warnings;
use feature 'say';
my @array = ( 'a', 'b', 'c', 'd' );
my $aref = [ 'a', 'b', 'c', 'd' ];
my $elem = ( 'a', 'b', 'c', 'd' );
my $last = @array[-1];
my @slice = @array[0,2..3];
my $count = scalar @array;
my $index_max = $#array;
say "
@array = @array array
$aref = $aref array reference (holds address of anonymous array)
$elem = $elem last element of array (useless void context warnings)
$last = $last last element of array
@slice = @slice array slice
$count = $count count array elements
$index_max = $index_max max array index
Note: array index starts with 0
";
输出Useless use of a constant ("a") in void context at C:tempworkperlexamplesarray_demo.pl line 7.
Useless use of a constant ("b") in void context at C:tempworkperlexamplesarray_demo.pl line 7.
Useless use of a constant ("c") in void context at C:tempworkperlexamplesarray_demo.pl line 7.
@array = a b c d array
$aref = ARRAY(0x107a790) array reference (holds address of anonymous array)
$elem = d last element of array (useless void context warnings)
$last = d last element of array
@slice = a c d array slice
$count = 4 count array elements
$index_max = 3 max array index
Note: array index starts with 0
数组教程:
- Perl - Arrays Perl数组
- 数组- Perl 101
- Perl Arrays - Perl Maven