개체가 인스턴스화 된 현재 패키지의 기호 테이블에 어떻게 액세스 할 수 있습니까? 개체가 현재 패키지의 기호 테이블에 어떻게 액세스합니까?
my $object = MyModule->new;
# this looks in the current package, to see if there's a function named run_me
# I'd like to know how to do this without passing a sub reference
$object->do_your_job;
내가 __PACKAGE__
를 사용 do_your_job
의 구현의 경우
MyModule
패키지를 검색합니다 예를 들어, 나는 이런 식으로 뭔가가있다. 올바른 패키지로 보이게하려면 어떻게해야합니까?
편집 :이 내용을 명확하게하려고 노력할 것입니다.
package MyMod;
sub new {
return bless {},$_[0]
}
sub do_your_job {
my $self = shift;
# of course find_package_of is fictional here
# just for this example's sake, $pkg should be main
my $pkg = find_package_of($self);
if(defined &{ $pkg . '::run_me' }) {
# the function exists, call it.
}
}
package main;
sub run_me {
print "x should run me.\n";
}
my $x = MyMod->new;
# this should find the run_me sub in the current package and invoke it.
$x->do_your_job;
지금, $x
어떻게 든 main
현재 패키지 통지하고, 심볼 테이블을 검색한다 : 나는 다음과 같은 코드가 있다고 가정. 나는 Scalar::Util
의 축복을 사용하여 시도했지만, 여전히 main
대신 MyModule
을주었습니다. 바라기를, 이것은 지금 조금 더 명확하다.
이와 같은 문제가 발생하면 내가 뒤집은 첫 번째 장소 중 하나는 perlfunc의 카테고리 별 Perl 함수 섹션입니다. 이 문제와 관련이있을 수있는 것들을 쉽게 찾을 수 있도록 내장 된 목록을 멋지게 그룹화했습니다. 이 경우 '범위와 관련된 키워드'섹션에는 8 가지 항목이 있습니다. 첫 번째는'호출자 (caller) '입니다. http://perldoc.perl.org/perlfunc.html#Perl-Functions-by-Category – daotoad
옳은 대답이 무엇인지 확립 했으니 까, 왜이 일을하고 싶은지 궁금합니다. 객체를 인스턴스화 한 패키지의 심볼 테이블에 액세스하는 메서드를 사용하면 대다수 상황에서 매우 나쁜 생각으로 인식됩니다. –
이 튜토리얼은 Win32 :: GUI 용 http://search.cpan.org/~ROBERTMAY/Win32-GUI/docs/GUI/Tutorial/Part1.pod를 보았고, 이것이'Main_Terminate'가 어떻게 구현되었는지 상상했습니다. – Geo