为什么perl仅在使用范围运算符时取消引用最后一个索引?

Ear*_*ome 6 perl

我有一个@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)即可将数组取消引用运算符分别应用于外部数组的每个元素。

  • ***“规则是没有一般规则”***这不是真的。标量上下文中的 *list* 计算结果为列表的最后一个元素。标量上下文中的 *array* 计算结果为数组中的元素数量。 (4认同)
  • @Borodin,Re <<“规则是没有一般规则”,这是不正确的。>>那么一般规则是什么?您只提到了两个特定的运算符。什么一般规则涵盖了其他数百个规则?OP 使用的那个(数组切片)怎么样?事实是,Wumpus 是正确的。[**没有一般规则**](http://www.perlmonks.org/?node_id=347416)。 (2认同)