2016-09-04 4 views
3

처럼 두 개의 스칼라 값을 교환하는 것이 매우 간단 그것은 tmp` :스왑 두 배열`@

다음
($ours, $theirs) = ($theirs, $ours); 

, 어떻게 배열 변수를 사용하여이 작업을 수행해야합니까?

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

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

답변

2

는 펄은 모든 목록을 평평하게, 당신은 (@ours, @theirs)에 할당하지 않고 아무것도 얻을 @theirs을 기대 않을 수 있습니다 목록 할당, 욕심이다. 다른 말로하면 ... 서브 루틴에 '배열'을 전달할 수 없습니다. Perl의 서브 루틴은 0 개 이상의 스칼라 목록 만받을 수 있습니다.

당신은 개별 (스칼라) 루프 내부 배열의 요소를 교환 할 수 있지만,이 두 배열이

for my $i (0 .. $#ours) { 
    ($ours[$i], $theirs[$i]) = ($theirs[$i], $ours[$i]); 
} 

펄 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)

실제로 두 개의 배열에서 오는 요소를 새 목록으로 만듭니다. 마지막으로 하나의 목록이 있습니다. 목록 데이터가 첫 번째 배열 (@ar)로 이동했음을 나타냅니다. 두 번째 배열은 비어 있어야합니다 (@br).