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
@
不是任何东西的别名。文件上不是这么说的。@
的各个元素都是别名。