질문의 역사:
Perl에서 네임스페이스는 프로그램의 다양한 부분 간에 변수와 함수를 격리하는 주요 방법입니다. package 지시어를 사용하여 서로 독립적인 영역을 생성하며, 각 영역은 고유한 전역 변수와 함수 세트를 가집니다. 이를 통해 이름 충돌 없이 다중 파일 프로젝트를 개발할 수 있습니다.
문제:
스코프(scope)와의 잘못된 작업, 렉시컬 변수와 패키지 변수를 혼합하거나 "main" 네임스페이스를 잘못 다루면 종종 문제가 발생합니다: 예상치 못한 변수 출현, 함수 재정의, 세금 및 테스트에서 불명확한 버그가 발생합니다.
해결책:
package SomeName;을 사용하여 자신의 네임스페이스를 선언합니다.my)는 블록 내에서만 보이고, 전역 변수(our, 이전 use vars)는 전체 패키지에서 보입니다.AnotherPackage::some_function()을 사용합니다.코드 예:
package MyApp::Utils; our $global_var = 10; sub do_something { return $global_var + 1; } package main; print MyApp::Utils::do_something(); # 11
주요 특징:
::를 통해 명시적으로 지정됩니다.main — 스크립트의 기본 전역 네임스페이스입니다.my, our, local의 패키지 간 차이는 무엇입니까?
my — 현재 렉시컬 블록 내에서만 사용됩니다.our — 패키지의 전역 변수를 선언하지만 블록 내에서 렉시컬 참조로 사용할 수 있게 합니다.local — 블록의 존재 기간 동안 패키지의 전역 변수 값을 일시적으로 재정의합니다.명시적으로 패키지를 지정하지 않고 함수를 호출할 수 있습니까?
네, 함수가 Exporter 모듈을 통해 현재 패키지로 내보내지면 가능하지만 그렇지 않으면 전체 이름을 통해서만 호출할 수 있습니다.
하나의 파일에서 여러 package를 선언할 수 있습니까?
네, 하지만 이해하기 어렵습니다 — 각 package 이후의 모든 선언은 새로운 네임스페이스에 속합니다. 각 패키지에 대해 별도의 파일을 사용하는 것이 좋습니다.
커맨드 스크립트에서 여러 package가 연속으로 하나의 파일 내에 사용되었고, 변수들이 혼합되어 때로는 렉시컬, 때로는 전역적으로 나타났습니다.
장점:
단점:
각 package를 별도의 모듈로 분리하고, 함수는 명시적으로 내보냈습니다.
장점:
단점: