2010-01-06 3 views
4

저는 스칼라와 배열을 포함한 다양한 배열을 가지고 있습니다. 나는 그것의 복사본을 만들고 싶어, 다음과 같은 시도 : 나는 B에서 스칼라 값 중 하나를 읽으려고 할 때Perl에서 왜 @b = @ {dclone ( @ a)}해야합니까? 왜 그냥 @b = dclone ( @ a) 할 수 없습니까?

@b = dclone(\@a) 

하지만 그때, 내가 다시 아무것도 얻을 수 없다.

모든하지만, 내가 이런 식으로 복사 할 때 작업 표시 :

@b = @{dclone(\@a)} 

이유는 무엇입니까?

답변

14

dclone은 참조를 받아 들여 반환합니다.

#! /usr/bin/perl 

use Storable qw/ dclone /; 

my @array = ([1 .. 3], qw/ apple orange banana /); 
my $copy = dclone \@array; 

print ref($copy), "\n"; 

위의 프로그램의 출력은 그래서, 깊은 복제 배열을 얻을 참조 해제하지 않고

my @copy = dclone \@array; 

for (0 .. 4) { 
    print "$_: ", 
     (defined $copy[$_] ? $copy[$_] : "<undef>"), 
     "\n"; 
} 
의 출력을 무슨 일이 있었는지 보여주기 위해

my @copy = @{ dclone \@array }; 

를 사용하는, ARRAY입니다

0: ARRAY(0x1d396c8) 
1: <undef> 
2: <undef> 
3: <undef> 
4: <undef> 
입니다 0

dclone의 결과를 배열에 할당하면 단일 요소 배열이 생성되고 0 번째 이외의 값을 가져 오려고하면 정의되지 않은 값이 반환됩니다.

2

포인터 (참조) 인 dclone의 반환 값을 역 참조 할 필요가 있습니다.

2

두 사람이 말한 것처럼 dclone은 참조를 가져오고 반환합니다. 그 정도면 충분하지만, 의 질문이 있다고 생각합니까? Storable 설명서로서

dclone(...)thawthaw(freeze(...))과 같은 freeze의 조성물의 상당 나타낸다. thaw 유형의 인코딩 된 구조를 녹일 수 있습니다. 참조는 Perl의 모든 것을 참조 할 수 있습니다. 배열의 해시 배열, 배열의 해시 해쉬 .... 에 의존하여 요청한 내용을 알고 있어야합니다. 그렇다면 적어도 퍼즐을 풀어야합니다. 약간. 당신이 정말로 구문을 싫어하고 배열을 사용할 경우

그러나, -> 충분히 ARRAY 관용구가 더 잘 보이게하려는, 당신과 같이 래퍼 함수를 ​​작성할 수 있습니다

sub dclone_array (\@) { 
    use Storable 'dclone'; 
    my $in = shift; 
    my $out = dclone($in); 
    return @$out; 
} 

및 사용 좋아요 :

my @copy = dclone_array(@orig); 
관련 문제