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

Perl에서 마법 변수(예: $_, @_ 및 %SIG)와 관련된 작업의 특성은 무엇입니까? 이러한 변수를 사용할 때의 오류가 프로그램의 논리에 어떤 영향을 미칠 수 있습니까?

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

답변

Perl에는 프로그램 실행에 영향을 미치는 여러 마법 변수(일반적으로 "특수" 또는 "시스템"이라고도 함)가 있습니다:

  • $_ — 많은 연산자( foreach, map, grep, while <> 등)의 기본 변수입니다.
  • @_ — 서브루틴 내에서의 입력 인수를 저장하는 배열입니다.
  • %SIG — OS 신호의 핸들러와 관련된 해시입니다.
my @nums = (1,2,3); foreach (@nums) { $_ *= 2; # 원본 배열이 변경됩니다! } sub show_args { print "첫 번째: ", $_[0], " "; } show_args('a','b'); # $_[0] = 'a' $SIG{INT} = sub { print "Ctrl-C 포착됨 "; exit; };

주의: 많은 마법 변수는 암묵적으로 변경됩니다; 잘못된 접근은 프로그램의 전역 상태에 영향을 미칠 수 있습니다.

함정 질문

여러 중첩된 루프나 서브루틴에서 전역 변수 $_를 안전하게 사용할 수 있습니까?

답변: 아니요, 중첩된 루프나 서브루틴이 종종 $_를 덮어쓰므로 외부 컨텍스트에서 값 손실이 발생할 수 있습니다. 명시적인 변수를 사용하는 것이 좋습니다:

foreach my $x (@a) { foreach my $y (@b) { ... } }

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


이야기

대규모 로그를 처리하기 위한 스크립트에서 while(<FH>) {...} 루프가 사용되었습니다. 루프 내부에서 함수가 호출되어 자체 변수를 명시하지 않고 map을 실행함으로써 외부 루프에서 $_가 손상되어 줄이 누락되었습니다.


이야기

%SIG를 통한 신호 처리 중, 개발자는 __DIE__ 핸들러를 대체했지만, 이것이 외부 모듈을 포함한 전체 프로세스의 동작에 영향을 미친다는 것을 간과하여 타인의 코드에서 오류 시 비관리 종료를 발생시켰습니다.


이야기

서브루틴 내에서 배열의 참조를 통해 인수를 전달하는 최적화가 이루어졌고, 명시적인 복사 없이 해당 값을 직접 수정하려고 하여 외부 코드의 변수에 예기치 않은 변화를 일으켰습니다.