프로그래밍Perl 프로그래머/백엔드 개발자

Perl에서 컨텍스트(스칼라, 리스트 및 void)는 어떻게 작동합니까? 컨텍스트 선택에 따라 코드 동작이 달라지는 경우의 예를 제시하십시오.

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

답변

Perl에는 연산자 및 함수의 동작에 영향을 미치는 컨텍스트가 있습니다:

  • 스칼라(scalar) — 표현식이 단일 값으로 계산됩니다.
  • 리스트(list) — 표현식이 값의 목록으로 계산됩니다.
  • Void — 결과가 사용되지 않습니다.

함수와 연산자는 컨텍스트에 따라 다른 결과를 반환할 수 있습니다.

예제:

my @arr = (1, 2, 3); my $count = @arr; # 스칼라 컨텍스트: $count = 3 my @copy = @arr; # 리스트 컨텍스트: 전체 배열 복사 my $line = <STDIN>; # 한 줄 읽기 (스칼라) my @lines = <STDIN>; # 모든 줄 읽기 (리스트)

명시적으로 scalar() 함수를 통해 컨텍스트를 설정할 수 있습니다:

my $last_idx = scalar @arr; # 강제로 스칼라 컨텍스트

이 질문의 함정

함수 keys %hash가 스칼라 컨텍스트에서 어떤 값을 반환합니까?

답변: 리스트 컨텍스트에서와 달리 해시의 요소 수를 반환합니다.

my %h = (a=>1, b=>2); my $num = keys %h; # $num = 2 my @keys = keys %h; # @keys = ('a', 'b')

주제에 대한 미세한 차이를 알지 못해 발생한 실제 오류 사례


이야기

한 프로젝트에서 배열의 요소 수를 계산했습니다:

my @items = get_items(); my $cnt = @items;

나중에 누군가가 $cnt = get_items();를 할당하기로 결정했지만, 함수가 목록을 반환한다는 것을 이해하지 못했습니다. 이제 항상 최초의 반환값만 얻어졌고 요소 수가 아닌 첫 번째 값만 얻어졌습니다.


이야기

파일에서 문자열을 읽을 때:

my $lines = <FILE>;

전체 파일을 얻을 것으로 기대했지만 첫 번째 줄만 얻었습니다. 스칼라 컨텍스트에서 단일 줄만 반환된다는 사실을 간과했습니다.


이야기

개발자가 void 컨텍스트에서 함수를 호출하여 반환된 값을 사용하지 않았습니다:

open_my_file(); # 함수가 디스크립터를 반환하지만 저장하지 않았습니다

이는 디버깅을 복잡하게 만들었습니다. 함수는 작동했지만 파일이 저장되지 않았고 오류가 잡히지 않았습니다.