2016-09-04 6 views
3

は次のように2つのスカラー値を交換するのは非常に簡単ですそれtmp`:スワップ二つの配列 `@

その後
($ours, $theirs) = ($theirs, $ours); 

、どのように私は配列変数でこれを行う必要がありますか?

# (@ours, @theirs) = (@theirs, @ours); # XXX 

# lame 
my @tmp = @ours; 
@ours = @theirs; 
@theirs = @tmp; 

答えて

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

を行うだろう、あなた

use v5.22; 
use warnings; 
use experimental 'refaliasing'; 
のための警告を扱う experimentalモジュールをインストールするには
3

何らかの論理について

@ar = qw(one two three four); 
@br = (1..5); 
unshift(@ar,@br); 
@br = splice(@ar,scalar @br); 
print "@ar\[email protected]\n"; 

平坦化のためにアレイのスワップができません。 (@ar,@br)=(@br,@ar)

実際には、2つの配列に由来する要素を新しいリストとして作成しています。最後に、1つのリストがあります。リストのデータが最初の配列(@ar)に送られたことを示します。 2番目の配列は空でなければなりません(@br)。