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