我有一个@array数组引用数组.如果我使用的范围内,通过操作者的3打印元件1 @array,print @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";
Run Code Online (Sandbox Code Playgroud)
小智 3
@{@array[1..3]}是一个看起来很奇怪的结构。@{ ... }是数组取消引用运算符。它需要一个引用,这是一种标量。但@array[ ... ]会产生一个列表。
这是您需要记住标量上下文中列表评估规则的情况之一。规则是没有一般规则。每个列表生成操作符都做自己的事情。在这种情况下,显然标量上下文中使用的数组切片运算符返回列表的最后一个元素。@array[1..3]在标量上下文中与 相同$array[3]。
正如您所注意到的,这没有用。数组切片不适合在标量上下文中使用
如果要将二维嵌套数组结构展平为一维列表,请使用map:
print join ' ', map { @$_ } @array[1..3]
Run Code Online (Sandbox Code Playgroud)
您仍然使用范围运算符进行切片。您只需要某种循环构造(例如map)即可将数组取消引用运算符分别应用于外部数组的每个元素。