2011-01-12 4 views

답변

12
sub f { 
    return [@_]; 
} 

$ref = f(2, 3, 5); 
print "@$ref\n"; 

[@foo] 구조체는, 새로운 익명 어레이 (@foo의 복사본)에 대한 참조를 생성한다.

2

배열로 인수를 반환하는 서브 루틴을 만들 수있는 몇 가지 방법이 있습니다

arraycapture 사이에 몇 가지 중요한 차이가 있습니다
sub array {[@_]} # returns an array reference that is a copy of its argument 

sub array_verbose { # the same as array(), but spelled out 
    my @copy = @_; 
    return \@copy; 
} 

sub capture {\@_} # returns a reference to the actual argument array 

:

my ($x, $y) = (3, 4); 

my $array = array $x, $y; 
my $capture = capture $x, $y; 

say "@$array, @$capture"; # prints '3 4, 3 4' 

$x++; 

say "@$array, @$capture"; # prints '3 4, 4 4' 

$$capture[1] *= 2; 

say "@$array, @$capture"; # prints '3 4, 4 8' 

say "$x $y"; # prints '4 8' 

이러한 예를 보여 바와 같이, array()에 의해 생성 된 배열은 값에 의해 복사되며이 값은 원래 인수와 독립적입니다. capture()에 의해 생성 된 배열은 인수 목록에 대한 양방향 별칭을 유지합니다.

또 다른 차이점은 속도입니다. capture()array()보다 약 40 % 빠릅니다. 배열 요소를 복사 할 필요가 없기 때문입니다. 물론이 속도 차이는 인수 목록의 길이에 따라 달라집니다.

capture() 심지어 요소를 접촉하지의 또 다른 효과는 일반적으로 메모리를 할당 할 인수를 사용하는 경우 인수가 접촉 될 때까지, 그 할당이 일어나지 않을 것입니다 : 내 자신의 코드에서

my %hash; 
my $hashcap = capture $hash{a}, $hash{b}, $hash{c}; 

say join ', ' => keys %hash; # prints nothing 

$_++ for @$hashcap; 

say join ', ' => keys %hash; # prints 'c, a, b' 

, 나는 보통 cap()capture()을 주문하거나 인라인을 쓰기 :

my $y = sub{\@_}->(map $_**2, 1..10); 
관련 문제