我可以使用它来包含文件a.pl
:
require 'a.pl';
或者我可以使用它:
$fn = 'a.pl';
require $fn;
但是,子程序不会起作用:
sub fn { return 'a.pl'; }
require fn(); # This is a syntax error
是否有允许这样的语法?我注意到我可以通过
来解决这个问题sub fn { return 'a.pl'; }
require eval("fn()");
......但那不是很漂亮。
答案 0 :(得分:8)
require(fn());
多么奇怪的语法错误!添加额外的括号以消除歧义优先级可以解决问题。看起来,require PACKAGE
形式优先于require EXPR
,即fn
被解析为指定要加载的模块的裸字。
答案 1 :(得分:0)
以下内容可能会出现"现代"但不够正确/标准/ POLA:
require fn->();
或许匿名子程序在某种程度上更具可读性/效率:
my $fn = sub { return "a.pl"; } ;
require $fn->();