프로그래밍Perl 개발자 / Perl 프로젝트 지원 수석 개발자

Perl에서 my, local 및 our가 사용될 때 렉시컬 스코프와 동적 스코프가 어떻게 작동하는지 설명하고 이러한 차이를 잘못 이해했을 때의 문제를 예로 들어 보세요.

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

답변

Perl에서 변수는 렉시컬 또는 동적 스코프를 가질 수 있습니다.

  • my렉시컬 스코프로 변수를 생성합니다: 변수는 정의된 블록 내부에서만 보입니다.
  • local동적 스코프로 글로벌(패키지) 변수의 값을 임시로 재정의합니다: 새로운 값은 블록을 벗어날 때까지 호출된 모든 함수에서 보입니다.
  • our은 글로벌(패키지) 변수를 정의하지만 현재 렉시컬 블록 내에서만 보입니다.

예:

our $x = 10; sub test_my { my $x = 20; inner(); } sub test_loc { local $x = 30; inner(); } sub inner { print $x; } test_my(); # 10 출력 - my $x는 inner에서 보이지 않음 $| = 1; test_loc(); # 30 출력 - local $x는 inner에서 보임

local은 $_, $/, $@ 등의 유형의 패키지 변수를 변경하는 데 사용됩니다.

속임수 질문

다음 코드 실행 결과는 무엇이며 그 이유는 무엇입니까?

our $a = 5; sub outer { my $a = 10; inner(); } sub inner { print $a; } outer();

답변: 5가 출력됩니다. 이유는 outer의 my 변수가 $a를 inner에서 볼 수 없기 때문에; 사용되는 것은 our로 선언된 패키지 변수 $a입니다.

주제에 대한 미숙한 이해로 인한 실제 오류 사례


이야기

로그 분석 스크립트에서 통계를 글로벌 해시에 기록하기 위해 local을 사용했는데 블록 내부에서만 값을 변경한다고 생각했습니다. 하지만 local을 통한 변경이 프로그램의 다른 부분으로 퍼져 데이터가 손실되었습니다.

이야기

모듈 테스트에서 많은 개발자들이 my를 통해 글로벌 특수 변수를 수정했고, 그 결과 변경이 발생하지 않아 테스트가 이상하게 부분적으로만 실패했습니다.

이야기

JavaScript 개발 후 Perl로 전환하면서 개발자들은 불필요한 경우에도 everywhere에 our로 변수를 선언하려고 했고, 그 결과 예상치 못한 글로벌 변수가 발생하여 캡슐화에 방해가 되고 이름 충돌이 발생했습니다.