Псевдоним функции в Perl - PullRequest
       13

Псевдоним функции в Perl

15 голосов
/ 22 декабря 2010

В Perl, если я хочу, чтобы foo() делал именно то, что делает bar(), я могу сделать это:

sub foo {return bar(@_);} 

Есть ли лучший способ?Что-то ближе к "псевдониму" оператора Руби?

Ответы [ 4 ]

28 голосов
/ 22 декабря 2010

Лучше всего использовать Exporter и аналогичные модули , чтобы отредактировать таблицу символов:

*foo = \&bar;

(отредактировано, потому что это Perl, о котором мы говорим)

13 голосов
/ 22 декабря 2010

Есть еще один способ сделать это:

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.
12 голосов
/ 22 декабря 2010
*foo = \&bar;

Назначение ссылки на глобус заменяет эту часть глобуса упомянутой вещью. Так что это делает & foo точно таким же, как & bar.

*foo = *bar;  # or \*bar

Это также работает, но также объединяет скаляр, массив, хэш, дескриптор файла и формат между foo и bar.

4 голосов
/ 22 декабря 2010

Предоставлено Perlmonks :

sub bar { print( "Hello World\n" ); }

BEGIN { *foo = \&bar; }

foo();
bar();
...