Perl中如何将内置print函数赋值给变量实现可控调用?
Perl给内置print取引用报错解决方案
错误原因
print是Perl内置的关键字函数,不属于任何命名空间下的可直接引用的自定义子例程,使用\&print语法时,Perl会默认在当前main命名空间查找名为print的自定义子例程,找不到就会抛出Undefined subroutine &main::print错误。
可行解决方案
最通用的实现方式是用匿名子例程包装内置print,再把匿名子的引用赋值给变量即可,修改后可正常运行的代码如下:
#!/usr/bin/perl # test_assign_func.pl use strict; use warnings; sub echo { my ($string) = @_; print "from echo: $string\n"; } my $myprint = \&echo; $myprint->("hello"); # 用匿名子例程包装内置print实现引用赋值 $myprint = sub { print @_ }; $myprint->("world");
运行后输出如下:
from echo: hello world
如果需要兼容print指定文件句柄的调用特性,可以扩展匿名子的逻辑:
$myprint = sub { # 适配带文件句柄的print调用 if (@_ >= 2 && ref $_[0] eq 'GLOB') { my $fh = shift; print $fh @_; return; } print @_; }; # 测试调用 $myprint->("输出到标准输出\n"); $myprint->(*STDERR, "输出到标准错误\n");
内容的提问来源于stack exchange,提问作者oldpride
相关产品推荐
相关产品推荐

