Perl에는 public/private/protected와 같은 전통적인 접근 수정자 시스템이 없습니다. 함수 및 데이터에 대한 접근 권한 관리는 약속 및 변수 범위를 통해 이루어집니다.
my 키워드(파일 또는 블록 내의 렉시컬 가시성)와 기호 내보내기(Exporter 또는 자체 메커니즘을 통해)를 사용합니다.@EXPORT, @EXPORT_OK)은 기본적으로 모듈의 "내부"로 남아있지만, 원할 경우 패키지 접두사를 붙여 명시적으로 호출할 수 있습니다._internal_sub)로 시작하며, 이는 프라이버시 약속을 나타냅니다.예시:
package MyLib; use Exporter 'import'; our @EXPORT_OK = qw(public_func); my $secret = 123; # 외부에서 접근할 수 없음 sub public_func { _internal_func(); } sub _internal_func { print "This is internal! "; } 1;
Perl 모듈의 비공식 함수가 외부 코드 호출로부터 보호되도록 하는 조치는 무엇인가요? 직접 호출할 수는 없는 건가요?
답변: 사실 모든 패키지의 하위 프로그램은 전체 이름을 사용하여 명시적으로 호출할 수 있습니다: MyLib::_internal_func(). Perl은 기술적으로 이러한 호출을 제한하지 않으며 — 보호는 약속 수준에서만 존재합니다.
이야기
개발자는
@EXPORT_OK를 통해 제한을 잊고 모듈에서 너무 많은 함수를 내보냈습니다. 이로 인해 사용자들이 내부 함수에 무심코 접근하게 되어 이름 충돌과 API 잘못 사용으로 이어졌습니다.
이야기
큰 프로젝트에서 두 팀이 같은 내부 메서드(밑줄로 시작하는)를 사용하면서 이를 비공식적인 것으로 생각했습니다. 나중에 함수 인터페이스가 변경되어 시스템의 다른 부분에서 호출이 중단되었습니다.
이야기
하나의 프로젝트에서 외부 개발자의 모듈을 수정하면서 비공식 메서드를 직접 호출했습니다. 배포판이 업데이트된 후, 내부 함수 이름이 변경되어 모듈이 작동하지 않게 되어 애플리케이션이 다운되었습니다.