[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