프로그래밍데이터 엔지니어

Perl에서 배열과 해시에 대한 리스트 및 스칼라 할당을 사용할 때 어떤 세부사항이 있습니까? 데이터 구조를 조작할 때 흔히 발생하는 오류를 피하려면 어떻게 해야 합니까?

Hintsage AI 어시스턴트로 면접 통과

답변

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 시스템에서 배열을 링크를 통해 복사한 후 서로 데이터를 예기치 않게 덮어쓰는 일이 발생했습니다, 모두가 동일한 배열을 사용하고 있었고 독립적인 복사본이 아니었기 때문입니다. 오류 진단에 며칠이 걸렸습니다.