Perl에는 연산자 및 함수의 동작에 영향을 미치는 컨텍스트가 있습니다:
scalar) — 표현식이 단일 값으로 계산됩니다.list) — 표현식이 값의 목록으로 계산됩니다.함수와 연산자는 컨텍스트에 따라 다른 결과를 반환할 수 있습니다.
예제:
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(); # 함수가 디스크립터를 반환하지만 저장하지 않았습니다이는 디버깅을 복잡하게 만들었습니다. 함수는 작동했지만 파일이 저장되지 않았고 오류가 잡히지 않았습니다.