我怎么能要求'一个由子程序返回的路径寻址的Perl库?

时间:2017-10-11 14:29:48

标签: perl

我可以使用它来包含文件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()");

......但那不是很漂亮。

2 个答案:

答案 0 :(得分:8)

require(fn());

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

答案 1 :(得分:0)

以下内容可能会出现"现代"但不够正确/标准/ POLA

require fn->();

或许匿名子程序在某种程度上更具可读性/效率:

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