Ответ 1
Лучшим способом, используемым Exporter
и аналогичными модулями, является редактирование таблицы символов:
*foo = \&bar;
(отредактирован, потому что это Perl, о котором мы говорим)
В Perl, если я хочу, чтобы foo()
выполнял именно то, что делает bar()
, я могу сделать это:
sub foo {return bar(@_);}
Есть ли лучший способ? Что-то ближе к рубину "псевдоним" оператора?
Лучшим способом, используемым Exporter
и аналогичными модулями, является редактирование таблицы символов:
*foo = \&bar;
(отредактирован, потому что это Perl, о котором мы говорим)
Есть и другой способ:
sub foo {goto &bar}
Это сохраняет эквивалентность между foo
и bar
, даже если bar
впоследствии переопределяется.
Ниже приведена подробная демонстрация:
use strict;
use warnings;
sub bar {
print "This is the original bar().\n";
}
*bar_copy = \&bar;
sub bar_link {
goto &bar;
}
print "Executing bar_copy:\n";
bar_copy();
print "Executing bar_link:\n";
bar_link();
*bar = sub {print "This is bar(), redefined.\n"};
print "Executing bar_copy after redefinition:\n";
bar_copy();
print "Executing bar_link after redefinition:\n";
bar_link();
который печатает
Executing bar_copy: This is the original bar(). Executing bar_link: This is the original bar(). Subroutine main::bar redefined at C:\scripts\temp.pl line 19. Executing bar_copy after redefinition: This is the original bar(). Executing bar_link after redefinition: This is bar(), redefined.
*foo = \&bar;
Назначение ссылки на глобус заменяет эту часть глобуса упомянутой штукой. Таким образом, это делает & foo точно таким же, как & bar.
*foo = *bar; # or \*bar
Это также работает, но также псевдонизирует скаляр, массив, хеш, дескриптор файла и формат между foo и bar.
Предоставлено Perlmonks:
sub bar { print( "Hello World\n" ); }
BEGIN { *foo = \&bar; }
foo();
bar();