别名为Perl中的函数

bar*_*ter 16 perl alias function

在Perl中,如果我想做的foo()bar(),我可以这样做:

sub foo {return bar(@_);} 
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?更接近Ruby的"别名"运算符?

mob*_*mob 28

一个更好的方法,通过采用Exporter和类似的模块,是编辑符号表:

*foo = \&bar;
Run Code Online (Sandbox Code Playgroud)

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

  • 我想我不认为这是访问符号表; 它只是改变一个glob,一个碰巧是符号表中的值.`$ :: {foo} =*bar`正在访问符号表.*foo =似乎更类似$ foo =而不是使用%::,等等. (2认同)

Nar*_*son 14

还有另一种方法:

sub foo {goto &bar}
Run Code Online (Sandbox Code Playgroud)

这保留了之间的等价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();
Run Code Online (Sandbox Code Playgroud)

打印

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.


yst*_*sth 12

*foo = \&bar;
Run Code Online (Sandbox Code Playgroud)

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

*foo = *bar;  # or \*bar
Run Code Online (Sandbox Code Playgroud)

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


DVK*_*DVK 6

由佩尔蒙克斯提供:

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

BEGIN { *foo = \&bar; }

foo();
bar();
Run Code Online (Sandbox Code Playgroud)

  • 这里需要 BEGIN 块吗? (4认同)