如何访问子例程返回的列表的最后一项而不先将其复制到数组中?

n.r*_*.r. 4 arrays perl

我正在寻找一种计算成本较低的方法来访问子例程返回的列表的最后一项(而不修改子例程本身)。

正如我所看到的,我在下面所做的实际上是将返回的列表复制到命名数组@list或匿名数组中[],然后访问该数组的最后一个值,而不是直接访问返回列表的最后一项。

这里有什么捷径吗?如何直接访问返回列表的最后一项?

sub range { return 0 .. 10**7 }
Run Code Online (Sandbox Code Playgroud)

根据 GNU ,这需要 0.808 秒的用户时间time:

my @array = range();
print pop @array;
Run Code Online (Sandbox Code Playgroud)

这里是 0.792 秒:

my @array = range();
print $array[$#array], "\n"
Run Code Online (Sandbox Code Playgroud)

0.680 秒:

print pop [ range() ]
Run Code Online (Sandbox Code Playgroud)

Thi*_*Not 5

子程序不返回数组,它们只返回列表。但你是对的

my @array = list();
Run Code Online (Sandbox Code Playgroud)

将 返回的值复制list()到数组中。如果您只关心最后一个值,则可以使用列表切片:

use strict;
use warnings 'all';
use 5.010;

sub range {
    return 0 .. 10**7;
}

my ($last) = ( range() )[-1];
say $last; # 10000000
Run Code Online (Sandbox Code Playgroud)