Perl에서 할당의 결과(그리고 배열과 해시 작업의 결과)는 컨텍스트에 따라 다릅니다.
my @arr = (10, 20, 30); my $count = @arr; # $count == 3 my ($first, $second) = @arr; # $first == 10, $second == 20
해시의 경우:
my %h = (a=>1, b=>2, c=>3); my $size = %h; # $size == 3의 현대 Perl 버전에서, 하지만 예전에는 달랐습니다!
배열 내용을 복사하는 대신 배열에 대한 링크를 전체 할당하는 것에 유의하십시오!
배열을 링크에 할당하는 것과 배열 내용을 복사하는 것은 어떻게 다릅니까?
답변:
my @a = (1,2,3); my $ref = \@a; # $ref는 배열에 대한 링크로, $ref를 통해 변경한 내용은 @a에 보입니다. my @b = @a; # @b는 새로운 배열로, @b의 변경은 @a에 영향을 주지 않습니다. # 비교: push @$ref, 4; # @a는 이제 (1,2,3,4) push @b, 5; # @a는 (1,2,3,4)로 유지; @b는 (1,2,3,5)
이야기 1
프로젝트에서 링크를 통해 배열을 하위 프로그램으로 전달했을 때, 이것이 바로 링크라는 것을 이해하지 못하여 함수가 호출 시 원본을 변경했습니다. 버그가 발생했으며, 호출하는 코드에서 데이터 구조가 이미 "손상"되었습니다. 복사를 기대했으나 에일리어스를 받았습니다.
이야기 2
엔지니어는 스칼라 할당
%h가 실제 쌍의 수를 반환할 것이라고 예상했습니다. 하지만 예전 버전의 Perl에서는 이 동작이 달랐습니다: 슬롯/버킷의 수가 반환되었고, 길이가 반환되지 않았습니다! 결과적으로 때때로 3 대신 다른 숫자가 반환되어 통계가 깨졌습니다.
이야기 3
대규모 ETL 시스템에서 배열을 링크를 통해 복사한 후 서로 데이터를 예기치 않게 덮어쓰는 일이 발생했습니다, 모두가 동일한 배열을 사용하고 있었고 독립적인 복사본이 아니었기 때문입니다. 오류 진단에 며칠이 걸렸습니다.