交换两个标量值非常简单:
($ours, $theirs) = ($theirs, $ours);
那么,我应该如何使用数组变量?
# (@ours, @theirs) = (@theirs, @ours); # XXX
# lame
my @tmp = @ours;
@ours = @theirs;
@theirs = @tmp;
答案 0 :(得分:3)
某些逻辑
@ar = qw(one two three four);
@br = (1..5);
unshift(@ar,@br);
@br = splice(@ar,scalar @br);
print "@ar\n@br\n";
由于扁平化,无法进行阵列交换。 (@ar,@br)=(@br,@ar)
实际上,您正在创建来自两个阵列的新列表。最后你有一个清单。列表数据转到第一个数组(@ar)。第二个数组应为空(@br)。
答案 1 :(得分:2)
Perl会平展所有列表,列表分配也很贪婪,因此您永远不能分配给(@ours, @theirs)
并期望@theirs
获得任何内容。换句话说......你不能将'数组'传递给子程序。 Perl中的子程序只能接收0个或更多标量的列表。
您可以在循环内交换数组的各个(标量)元素,但这假设两个数组的长度相等
for my $i (0 .. $#ours) {
( $ours[$i], $theirs[$i] ) = ( $theirs[$i], $ours[$i] );
}
Perl 5.22确实引入了一个名为reference aliasing的实验性功能,允许您分配给参考。如果您运行的是5.22或更高版本,则可以启用实验性功能,然后执行此操作。
(\@ours, \@theirs) = (\@theirs, \@ours);
要启用此功能,并禁用使用实验性功能的警告,您可以执行此操作
use v5.22;
use warnings;
use feature 'refaliasing';
no warnings 'experimental::refaliasing';
或者,安装处理警告的experimental模块
use v5.22;
use warnings;
use experimental 'refaliasing';