在Perl中对函数使用别名

在Perl中对函数使用别名,perl,function,alias,Perl,Function,Alias,在Perl中,如果我希望foo()完全像bar()那样做,我可以这样做: sub foo {return bar(@_);} 有更好的办法吗?是不是更接近Ruby的“别名”操作符 导出器和类似模块使用的一种更好的方法是编辑符号表: *foo = \&bar; (由于这是我们讨论的Perl,所以进行了编辑) 将引用指定给glob将用所引用的内容替换glob的该部分。这使得&foo与&bar完全相同 *foo = *bar; # or \*bar 这也可以使用,但也可以在foo和b

在Perl中,如果我希望
foo()
完全像
bar()
那样做,我可以这样做:

sub foo {return bar(@_);} 
有更好的办法吗?是不是更接近Ruby的“别名”操作符

导出器和类似模块使用的一种更好的方法是编辑符号表:

*foo = \&bar;
(由于这是我们讨论的Perl,所以进行了编辑)

将引用指定给glob将用所引用的内容替换glob的该部分。这使得&foo与&bar完全相同

*foo = *bar;  # or \*bar
这也可以使用,但也可以在foo和bar之间使用标量、数组、哈希、文件句柄和格式的别名。

礼貌:


还有另一种方法:

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. 正在执行bar_复制: 这是原始条()。 正在执行bar_链接: 这是原始条()。 子程序main::bar在C:\scripts\temp.pl第19行重新定义。 重新定义后执行bar_复制: 这是原始条()。 重新定义后执行bar_链接: 这是重新定义的bar()。
虽然glob是符号表的条目,但它们根本不是一回事;您可以对glob进行这种赋值,无论它是否在符号表中。@ysth不确定我是否明白您的意思,或者它如何适用于我的答案而不适用于您的答案。当然,glob除了访问符号表(例如文件句柄)之外还有其他用途。但是分配给一个GLUB是编辑符号表的唯一方式(也是我唯一的方式)。我想我不认为这是在访问符号表;它只是改变一个glob,一个恰好是符号表中的值的glob<代码>$:{foo}=*bar正在访问符号表*foo=似乎更像$foo=而不是使用%:::,等等。您是否希望
foo()
继续做与
bar()
相同的事情,不管发生什么,也就是说,即使
bar()
被重新定义?感谢所有回答的人。这两个函数都在一个库中,所以我不打算重新定义它们。“*foo=\&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.