[Moscow.pm] функция не из нашего пакета

Vladimir V. Perepelitsa inthrax на gmail.com
Пн Дек 29 02:10:46 PST 2008


2008/12/29 Alexander Lourier <aml на rulezz.ru>:
> 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 помнит исходное имя каждой подпрограммы, даже несмотря на
> то, что её экспортировали в другой неймспейс.

Извините меня...
а что еще может вернуть (caller 1)[3], если мы !внутри! сабы Ap::foo
вызывает другую сабу и проверяем в ней caller(1)?


-- 
Best wishes,
Vladimir V. Perepelitsa aka Mons <inthrax на gmail.com>


Подробная информация о списке рассылки Moscow-pm