2016-11-29 11 views
3

perl6에서 배열을 다른 배열에 할당하고 결과 배열을 다른 엔티티로 만들려고하지만 직접 할당이나 복제로도 원하는 것을 수행 할 수없는 것 같습니다. 루프 루틴을 작성하는 대신 하나의 표현식으로 배열을 복사하는 방법이 있습니까?perl6 배열 할당 : 포인터 또는 사본?

To exit type 'exit' or '^D' 
> my @a=<a b c d e> 
[a b c d e] 
> my @b = <1 2 3 4 5 6 7> 
[1 2 3 4 5 6 7] 
> my @c = @a 
[a b c d e] 
> @c[3] 
d 
> @c[3]=3; 
3 
> @c 
[a b c 3 e] 
> @a 
[a b c d e] 
> @c === @a 
False 
> @c == @a 
True   # this is unexpected, @c and @a should be different, right? 
> my @[email protected] 
[a b c d e] 
> @x[3]=3 
3 
> @x 
[a b c 3 e] 
> @x === @a 
False 
> @x == @a 
True   # unexpected, @x and @a should be distinct things, right? 
> 

대단히 감사합니다.

lisprog

답변

5

당신은 목록을 물었을 때 이렇게 숫자로 비교하는, 당신이

==

숫자 비교입니다 :) 그것을 알아낼 도움이 있습니다 @b와 비교하지 불운했다 그것은 표현의 요소 수를 골랐다. Perl 5 또는 6의 연산자는 관련 유형을 강요합니다. 배열 요소가 동일하면 테스트하려면 eqv 연산자를 사용하십시오.

배열의 길이를 비교, 그래서 다음 사실이다 :

@a == @c == @x == 5 

보십시오 : 당신은 이러한 연산자 주위에 문서의 일부를 체크 아웃 할 수 있습니다

my @a = <a b c d e>; 
my @b = <1 2 3 4 5>; 
@a eqv @b; 

. 똑똑한 일치 ~~ 연산자는 아마도 ==으로 기대했던 것 이상입니다. https://docs.perl6.org/routine/$TILDE$TILDE

+0

https://docs.perl6.org/routine/$EQUALS_SIGN$EQUALS_SIGN 당신에게 매트 감사! 그래서 한 배열을 다른 배열에 할당하면 내용이 복사되고 별개의 배열이됩니다. – lisprogtor

+0

예, 아니오. 스칼라 유형에 대한 얕은 복사본을 얻습니다. 따라서 컨테이너와 같은 것들은 다른 배열을 말하면서 동일한 목록을 가리키는 새로운 컨테이너 만 가져옵니다. 그래서 당신이 기대하지 않는 것일 수도 있습니다 :'my @a = [1, [2,3]]; 내 @b = @a; @b [1] [0] = 4;'이것은 @a에서 4가되도록 2를 변경합니다! –

+0

깊은 복사본이 필요하면 이전에 여기에서 대답했습니다. http://stackoverflow.com/questions/38582873/does-perl-6-have-a-built-in-tool-to-make-a-deep- 중첩 데이터 구조체의 복사본 –