0

__PACKAGE__パッケージ名としてコンパイルされることがわかります。

なぜコード:

Foo::bar() 

働ける。しかし、コード:

__PACKAGE__::bar() 

エラーが発生します:

Undefined subroutine &__PACAKGE__::bar called

呼び出し元は Foo パッケージにあるため、__PACKAGE__は Foo になります。

これを説明していただければ幸いです:)

シナリオを説明するために例を追加しましょう。

$ perl -e 'package Foo ; sub bar { print "hello\n" } ; __PACKAGE__::bar()'  
Undefined subroutine &__PACKAGE__::bar called at -e line 1.

$ perl -e 'package Foo ; sub bar { print "hello\n" } ; Foo::bar()'
hello
4

3 に答える 3

3

が特別なリテラル__PACKAGE__として扱われる場合を誤解しているようです。

特別なリテラルは、 「個別のトークン」である場合にのみ特別な意味を持ちます。

use 5.10.0;
use strict;
use warnings;

say 'in package: ', __PACKAGE__;

sub bar{ say 'this is the one you might be expecting' }

__PACKAGE__::bar(); # not a separate token

{
  package __PACKAGE__;
  sub bar{ say 'this is the one you actually get' }
}
in package: main
this is the one you actually get

これを回避するには、いくつかの方法があります。

bar(); # recommended

{
  no strict 'refs';
  *{__PACKAGE__.'::bar'}->(); # symbol ref

  ${__PACKAGE__.'::'}{bar}->(); # magical %package:: variable
}

__PACKAGE__->can('bar')->(); # may get 'bar' from a parent package

__PACKAGE__->bar(); # same as __PACKAGE__->can('bar')->(__PACKAGE__)


our $symbol_table = do{ no strict 'refs'; \%{__PACKAGE__.'::'} };

$symbol_table->{bar}->();

を使用する正当な理由はほとんどありません__PACKAGE__

于 2013-04-24T17:18:46.397 に答える