我有一个数组@array数组引用.如果我使用范围运算符打印@array的元素1到3,打印@array [1..3],perl将打印元素1到3的数组引用.
为什么当我尝试取消引用索引在1和3之间的数组引用时,@ {@ array [1..3]},perl只取消引用并打印出范围运算符中索引的最后一个元素?
有没有办法在解除引用数组时使用范围运算符?
示例代码
- #!/bin/perl
- use strict;
- use warnings;
- my @array = ();
- foreach my $i (0..10) {
- push @array,[rand(1000),int(rand(3))];
- }
- foreach my $i (@array) {
- print "@$i\n";
- }
- print "\n\n================\n\n";
- print @{@array[1..3]};
- print "\n\n================\n\n";
解决方法
@ {@ array [1..3]}是一个看起来很奇怪的结构. @ {…}是数组解除引用运算符.它需要一个引用,这是一种标量.但是@array […]会产生一个列表.
这是您需要记住标量上下文中的列表评估规则的情况之一.规则是没有一般规则.每个生成列表的运算符都有自己的功能.在这种情况下,显然在标量上下文中使用的数组切片运算符返回列表的最后一个元素.标量上下文中的@array [1..3]与$array [3]相同.
正如您所注意到的,这没有用.数组切片不应在标量上下文中使用
如果要将二维嵌套数组结构展平为一维列表,请使用map:
- print join ' ',map { @$_ } @array[1..3]
您仍然使用范围运算符进行切片.您只需要某种循环结构(例如map)将数组解引用运算符分别应用于外部数组的每个元素.