2017-10-11 6 views
5

Je peux l'utiliser pour inclure un fichier a.pl:Comment puis-je 'exiger' une bibliothèque Perl adressée par un chemin renvoyé par un sous-programme?

require 'a.pl'; 

Ou je peux l'utiliser:

$fn = 'a.pl'; 
require $fn; 

Cependant, un sous-programme ne fonctionnera pas:

sub fn { return 'a.pl'; } 
require fn(); # This is a syntax error 

est-il une syntaxe pour permettre cela? J'ai remarqué que je peux contourner le problème via

sub fn { return 'a.pl'; } 
require eval("fn()"); 

... mais ce n'est pas très joli.

Répondre

8
require(fn()); 

Quelle étrange erreur de syntaxe! L'ajout d'une parenthèse supplémentaire pour désambiguïser la priorité résout le problème. Il semble que sinon le formulaire require PACKAGE aurait préséance sur require EXPR, c'est-à-dire que le fn est analysé comme le mot brut désignant le module que vous voulez charger.

+2

ou tu pourrais ajouter un & :) – ysth

+3

Oh, je n'y ai pas pensé! Oui, tout ce qui empêche un jeton bareword directement après 'require' fonctionne (sauf unary +', pour une raison quelconque?). Mais restons collés à Modern Perl, et ne parlons plus jamais des appels de style '& foo()': D – amon

+0

oui, ~~ fonctionne aussi :) – ysth

0

Ce qui suit peut apparaître "moderne", mais pas assez correct/standard/POLA:

require fn->();

Ou peut-être un sous-programme anonyme est plus lisible/efficacité d'une certaine façon:

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