[Moscow.pm] функция не из нашего пакета
Alexander Lourier
aml на rulezz.ru
Пн Дек 29 01:59:28 PST 2008
On Monday 29 December 2008 12:53:43 Dmitry E. Oboukhov wrote:
> >> &App::foo и &main::foo это ссылки на одну и ту-же функцию.
> >> так что выяснить что является настоящим именем, а что алиасом -
> >> неоднозначно. можно к примеру пройтись рекурсивно по всем неймспейсам и
> >> найти все имена по равенству ссылок.
>
> AL> Тоже хотел так ответить сначала. А потом подумал, что caller каким-то
> макаром AL> догадывается о настоящем имени.
> это caller вызваный ИЗНУТРИ функции.
> там можно и просто тупо __PACKAGE__ или даже __FILE__ юзать.
> а надо снаружи функции эту же задачу решить
Чуть меняем пример:
==
package Ap;
use base 'Exporter';
our @EXPORT=qw(foo);
sub foo
{
$_[0]->();
}
package main;
Ap->import();
sub foo1
{
my @caller = caller(1);
use Data::Dumper;
print STDERR Dumper(\@caller);
}
foo(\&foo1);
==
$VAR1 = [
'main',
'a.pl',
23,
'Ap::foo',
1,
undef,
undef,
undef,
256,
'',
undef
];
На момент вызова caller __PACKAGE__ уже другой (main), но тем не менее,
функция идентифицирована как Ap::foo. Это значит лишь одно - что в где-то
глубоко в душе Perl помнит исходное имя каждой подпрограммы, даже несмотря на
то, что её экспортировали в другой неймспейс.
Подробная информация о списке рассылки Moscow-pm