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

时间:2014-06-04 09:40:52

标签: 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");

那么这些"功能"

之间的区别到底是什么?

2 个答案:

答案 0 :(得分:14)

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

  

真实@ARRAYs的功能

     

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

     

列表数据的功能

     

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


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

  

列表和数组有什么区别?

     

(由brian d foy提供)

     

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

     

...

     

数组操作更改标量,重新排列它们,或者   添加减去一些标量,仅适用于数组这些无法在列表中使用,已修复。数组操作包括   shiftunshiftpushpopsplice


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

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

答案 1 :(得分:1)

只需使用:

@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'];