Perl 为什么reverse()不更改我的数组?

Perl 为什么reverse()不更改我的数组?,perl,push,reverse,Perl,Push,Reverse,当我使用reverse()或sort()时,如果我想以后使用它,我总是需要将return语句保存到一个变量中 @array=qw(Nick Susan Chet Dolly Bill); @array = reverse(@array); 为什么这不同于使用push()、pop()或shift()调用函数并更改数组 @array=qw(Nick Susan Chet Dolly Bill); push(@array, "Bruce"); 那么这些“功能”之间到底有什么区别呢?只需使用: @a

当我使用
reverse()
sort()
时,如果我想以后使用它,我总是需要将return语句保存到一个变量中

@array=qw(Nick Susan Chet Dolly Bill);
@array = reverse(@array);
为什么这不同于使用
push()
pop()
shift()
调用函数并更改数组

@array=qw(Nick Susan Chet Dolly Bill);
push(@array, "Bruce");
那么这些“功能”之间到底有什么区别呢?

只需使用:

@array = reverse(@array)
我可能不会推荐这个,但如果你真的想,你可以修复它…:

use Data::Dumper;
use strict;
use warnings;
use subs 'reverse';

my @array=qw(Nick Susan Chet Dolly Bill);

sub reverse(\@) {
  my $a = shift;
  @{$a} = CORE::reverse(@{$a})
}

reverse(@array);
print Dumper \@array;

#$VAR1 = ['Bill','Dolly','Chet','Susan','Nick'];
提供了一个主要线索:

实数@数组的函数

,, , , , , , ,

列表数据的函数

,, , , , , ,


并解释数组和列表之间的区别(我自己强调):

列表和数组之间有什么区别? (布莱恩·福伊撰稿)

列表是一个固定的标量集合。数组是一个 保存标量的变量集合。数组可以提供其 用于列表操作的集合,因此列表操作也适用于数组

数组操作,更改标量、重新排列标量或 添加或减去一些标量,仅对数组有效这些无法在列表上工作,列表已修复。数组操作包括
移位
取消移位
推压
弹出
,以及
拼接


简而言之,像
reverse
这样的列表操作是为不能修改的列表设计的


他们可以接受数组的事实只是列表支持的一个副作用。

答案可能是,这样您就可以链接
grep、sort、map、reverse
。如果你担心冗长的问题,你可以对数组进行
@$\uu=reverse$\uuu,但我不会这么做。谢谢,听起来你知道答案,但我不明白。因为
reverse
(比如
排序
grep
映射
和其他)处理列表,而
推送
弹出
shift
unshift
在阵列上工作。数组不是列表。是的,我知道我可以将它分配给同一个数组。但是为什么我必须将它分配给一个数组(同一个数组或另一个数组,没有关系)。因为当我使用pop()时,我只能说:pop(@array);并且数组将被更改,而无需我将其分配给任何对象。除了现在
reverse
将无法处理列表之外:
my@array=reverse(1..6);打印转储程序\@数组
将参数1的类型
返回到main::reverse必须是数组(非空操作)
Aaah是,除此之外!:-)我说过我不推荐它!换句话说,你可以
反转(qw(Nick Susan Chet Dolly Bill))
但是你不能
推(qw(Nick Susan Chet Dolly Bill),“Bruce”)