2017-10-11 8 views
5

我可以用它来包括文件a.pl如何'需要'由子例程返回的路径寻址的Perl库?

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()"); 

解决问题...但这并不是非常漂亮。

回答

8
require(fn()); 

多么奇怪的语法错误!添加一个额外的括号以消除优先级可以解决问题。看起来,否则require PACKAGE表格将优先于require EXPR,即fn被解析为指定要加载的模块的裸字。

+2

或你可以添加一个&:) – ysth

+3

哦,我没有想到这一点!是的,任何阻止在'require'之后直接输入裸字符的东西(除了一元'+',出于某种原因?)。但是我们应该坚持使用Modern Perl,并且再也不会提及'&foo()'风格调用:D – amon

+0

是的,~~也可以工作:) – ysth

0

下可能出现的 “现代”,但不够正确/标准/ POLA

require fn->();

或者,也许一个匿名的子程序是更可读/效率以某种方式:

my $fn = sub { return "a.pl"; } ; 
require $fn->();