别名为Perl中的函数

时间:2010-12-22 17:54:54

标签: perl function alias

在Perl中,如果我希望foo()完全按照bar()执行操作,我可以这样做:

sub foo {return bar(@_);} 

有更好的方法吗?更接近Ruby的“别名”运算符?

4 个答案:

答案 0 :(得分:28)

Exporter和类似模块使用的更好方法是编辑符号表:

*foo = \&bar;

(编辑,因为这是我们正在谈论的Perl)

答案 1 :(得分:13)

还有另一种方法:

sub foo {goto &bar}

即使foo随后被重新定义,这也保留了barbar之间的等效性。

以下是详细演示:

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.

答案 2 :(得分:12)

*foo = \&bar;

分配对glob的引用会将glob的那部分替换为所引用的thingy。因此,这使& foo与& bar完全相同。

*foo = *bar;  # or \*bar

这也有效,但也可以在foo和bar之间对标量,数组,散列,文件句柄和格式进行别名。

答案 3 :(得分:4)

礼貌Perlmonks

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

BEGIN { *foo = \&bar; }

foo();
bar();