2012-03-09 21 views
6

en Perl, podemos hacer:uso lib con si pragma en Perl

uso LISTA lib;

para incluir una lista de rutas en @INC. Del mismo modo, podemos hacer:

use if CONDITION, MODULE => ARGUMENTS;

para incluir un módulo condicionalmente.

¿Es posible hacer una mezcla de ambos, algo así como

uso lib Si la condición, LISTA;

para incluir una lista de rutas condicionalmente. Esto no parece funcionar.

Edit: Lo siento, pero todavía no puedo hacerlo funcionar. Así es como lo estoy haciendo, pero no está funcionando. ¿Puedes sugerir por favor lo que está mal?

use Data::Dumper; 

BEGIN { 
    my $env=$ENV{'ENV'}; 
    use if $env eq 'OLD', lib => '/home/vivek/OLD'; 
    use if $env eq 'NEW', lib => '/home/vivek/NEW'; 
} 

print Dumper \@INC; 
+2

Su condición debe resolverse en tiempo de compilación. – tchrist

+0

Veo que funciona si en lugar de asignar $ ENV {'ENV'} a una variable y luego usarla, en su lugar, uso $ ENV {'ENV'} directamente. Pero no se puede calcular $ env en el bloque BEGIN. – Vivek

+0

Su ejemplo no funcionará. La asignación 'my $ env = ...' se ejecutará después de 'use if'. El 'uso si' va primero. Tendría que tener un bloque 'BEGIN' totalmente cerrado que se asignara a una variable que no sea mi, y luego fuera y debajo de ese bloque, tenga su' uso si' que involucra dicha variable. – tchrist

Respuesta

10

if es un módulo separado (estrictamente un pragma) que lleva el resto de la línea como parámetros. lib es también un pragma separado. Echar un vistazo a la sintaxis documentada use if CONDITION, MODULE => ARGUMENTS y verá que lo que debe escribir es

use if CONDITION, lib => LIST; 

que funciona muy bien.

+4

La gente siempre está olvidando que la condición solo puede involucrar expresiones en tiempo de compilación. – tchrist

+0

@tchrist - la expresión podría ser simplemente una variable calculada en un bloque 'BEGIN {}', ¿correcto? – DVK

+0

La * CONDICIÓN * puede ser cualquier cosa que esté disponible en el punto relevante en la compilación, por lo que cualquier elemento en un bloque anterior 'COMENZAR' incluye variables de paquete y subrutinas. (Tenga en cuenta que dicha subrutina obviamente también debe tener dependencias disponibles en el momento en que se la llama.) – Borodin

Cuestiones relacionadas