为什么reverse()不会改变我的数组?

She*_*per 7 perl reverse push

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

@array=qw(Nick Susan Chet Dolly Bill);
@array = reverse(@array);
Run Code Online (Sandbox Code Playgroud)

为什么这与使用不同push(),pop()或者shift()您可以只调用该函数并且数组将被更改?

@array=qw(Nick Susan Chet Dolly Bill);
push(@array, "Bruce");
Run Code Online (Sandbox Code Playgroud)

那么这些"功能"究竟有什么区别呢?

Zai*_*aid 14

perldoc perlfunc 提供了一个主要线索:

真正的@ARRAYs的功能

each, keys, pop, push, shift, splice, unshift, values

列表数据的功能

grep, join, map, qw//, reverse, sort, unpack


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

列表和数组有什么区别?

(由brian d foy提供)

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

...

数组运算,这改变了标量,重新排列它们,或 一些标量,只能在阵列工作.这些不能在列表上工作,这是固定的.数组操作包括 shift,unshift,push,pop,和splice.


简而言之,列表操作就像reverse是为列表设计的,无法修改.

他们可以接受数组的事实仅仅是列表支持的副作用.

  • 换句话说,你可以"逆转(qw(尼克苏珊切特多莉比尔))`但你不能推(qw(尼克苏珊切特多莉比尔),"布鲁斯") (7认同)

Joh*_*n C 1

只需使用:

@array = reverse(@array)
Run Code Online (Sandbox Code Playgroud)

我可能不会推荐这个,但如果你真的愿意,你可以修复它......:

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'];
Run Code Online (Sandbox Code Playgroud)

  • 除了现在 `reverse` 不适用于列表:`my @array =verse(1..6); print Dumper \@array;` 返回 `main::reverse 的 arg 1 类型必须是数组(非空操作)` (3认同)