在Perl中,如果我希望foo()
完全按照bar()
执行操作,我可以这样做:
sub foo {return bar(@_);}
有更好的方法吗?更接近Ruby的“别名”运算符?
答案 0 :(得分:28)
Exporter
和类似模块使用的更好方法是编辑符号表:
*foo = \&bar;
(编辑,因为这是我们正在谈论的Perl)
答案 1 :(得分:13)
还有另一种方法:
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.
答案 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();