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

标签 perl

我有一个数组,@array , 数组引用。如果我使用范围运算符打印 @array 的元素 1 到 3 , 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";

最佳答案

来自 perldata :

Slices in scalar context return the last item of the slice.


@{ ... }将标量值解引用为数组,这意味着被解引用的值在标量上下文中。从上面的 perldata 引用我们知道这将返回最后一个元素。因此结果是最后一个元素。

更合理的方法是遍历切片并打印每个单独的数组引用:
use strict; 
use warnings; 

use feature qw(say);

my @array_of_arrayrefs = (
   [qw(1 2 3)],
   [qw(4 5 6)],
   [qw(7 8 9)],
   [qw(a b c)],
);

foreach my $aref ( @array_of_arrayrefs[1..3] ) {
   say join ',', @$aref;
}

关于perl - 为什么在使用范围运算符时 perl 只取消引用最后一个索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31569777/

相关文章:

perl - 使用 List::MoreUtils::firstidx 的问题

Perl 调试器 - 如何跳出循环

string - 为什么这些值有时未定义?

javascript - Perl DateTime的纪元是毫秒还是秒?

perl - 即使在使用 Memoization 之后,Fibonacci Perl 程序也会耗尽内存,即使是小输入,

perl - = 和 , Perl 中的运算符

regex - 我在 perl 中的正则表达式有什么问题?

windows - 如何使用系统 (Windows) 从 Perl 调用子目录中的脚本

perl - 为什么我的 Perl 程序在 fork 之后不收割子进程?

perl - 打印到终端时,Perl 如何在颜色之间切换?