Perl:Special array@uu实际上不是别名?

Perl:Special array@uu实际上不是别名?,perl,Perl,特殊数组@,其中存在传递给函数的所有参数,实际上是传递参数的别名。因此,我们直接对这个特殊数组@所做的任何更改也将反映在main中。这是清楚的 #!/usr/bin/perl use warnings; use strict; $\="\n"; sub func { print \@_; $_++ for(@_); } my @arr=(2..4); print \@arr; func(@arr); print "@arr"; 对于上面的程序,我希望@a

特殊数组
@
,其中存在传递给函数的所有参数,实际上是传递参数的别名。因此,我们直接对这个特殊数组
@
所做的任何更改也将反映在main中。这是清楚的

#!/usr/bin/perl

use warnings;
use strict;

$\="\n";

sub func {
        print \@_;
        $_++ for(@_);
}

my @arr=(2..4);
print \@arr;
func(@arr);
print "@arr";
对于上面的程序,我希望
@arr
@
的引用指向相同的位置,因为它是一个别名。但事实并非如此

在运行上述程序时:

ARRAY(0x1b644d0)
ARRAY(0x1b644e0)
3 4 5
如果它们指向两个不同的位置,则在
@
中所做的更改如何反映在
@arr


我看到什么不对劲了吗?请给出建议。

这可能会回答您的问题:

use warnings;
use strict;

$\="\n";

sub func {
        print \@_;
        $_++ for(@_);
        print \$_ for @_; 
}

my @arr=(2..4);
print \@arr;
func(@arr);
print "@arr";
print \$_ for @arr;
输出

ARRAY(0x17fcba0)
ARRAY(0x1824288)
SCALAR(0x17fcc48)
SCALAR(0x18196f8)
SCALAR(0x1819710)
3 4 5
SCALAR(0x17fcc48)
SCALAR(0x18196f8)
SCALAR(0x1819710)

如您所见,各个参数具有相同的地址,但容器不同。如果在
func
中将项目推到
@
中,则
@arr
不会更改(因此您可以在
func
中执行
shift
)。因此,每个参数都是一个别名,数组元素作为单个项传递<代码>@包含传递到子例程的所有项。如果要修改数组参数,需要通过引用传递它。

@
没有别名;其要素是:

记得吗

func(@arr);

func($arr[0], $arr[1], ...);
local @_;
alias $_[0] = $arr[0];
alias $_[1] = $arr[1];
...
&func;
因为唯一可以传递给子对象的是一个标量列表,数组的计算结果是列表上下文中的元素列表

这意味着

func(@arr);
基本上与

func($arr[0], $arr[1], ...);
local @_;
alias $_[0] = $arr[0];
alias $_[1] = $arr[1];
...
&func;
更改
@
的元素将更改
@arr
的元素,但添加和删除
@
的元素不会更改
@arr
,因为它们是不同的数组

>perl -E"@a=(4..6); sub { $_[0] = '!';        say @_; }->(@a); say @a;"
!56
!56

>perl -E"@a=(4..6); sub { splice(@_,0,1,'!'); say @_; }->(@a); say @a;"
!56
456

@
不是任何东西的别名。文件上不是这么说的。
@
的各个元素都是别名。