2012-07-08 23 views
9

Tengo un script de Perl escrito para la versión 5.6.1 y que tiene dependencias en paquetes de Oracle, paquetes de DBI y más cosas. Todo está correctamente instalado y funciona.¿Cómo especificar en la secuencia de comandos que solo se use una versión específica de perl?

Recientemente se instaló la versión 5.8.4 de Perl y porque esas dependencias no están configuradas correctamente para que la secuencia de comandos falle.

puntos de mando 'perl' a /program/perl_v5.8.4/bin/perl - última versión

Así, cuando tenga que ejecutar mi script de perl que tengo que especificar manualmente en el símbolo del sistema

/program/perl_v5.6.1/bin/perl scriptName.pl 

he intentado añadir siguientes líneas en escritura:

/program/perl_v5.6.1/bin/perl 
use v5.6.1; 

Pero, esto significa que la escritura tiene que tomar la versión de Perl> 5.6.1

me encontré par de pregunta relacionada que sugirió:

  1. Para exportar camino. Pero, quiero la secuencia de comandos para todos los usuarios sin tener que exportar la ruta
  2. Especifique una versión mayor que. Pero, quiero usar solo una versión específica para este script.
  3. use/require commands. Mismo problema que el anterior.

Mi pregunta: ¿Cómo especificar en el script que solo se use una versión específica de perl?

+1

Disculpa si te entendí mal, pero ¿no pudiste especificar el camino a Perl que necesitas en la línea '#!' De tu script? Como '#!/Program/perl_v5.6.1/bin/perl', por ejemplo. – raina77ow

+0

Creo que olvidó el shebang en la línea shebang. –

+0

@ raina77ow Sinan tiene razón. Estoy teniendo '#!/Program/perl_v5.6.1/bin/perl' en mi script. Pero todavía me lleva a la última instalación de Perl (perl -version) – JoshMachine

Respuesta

8

El problema es que el intérprete se especifica en la línea shebang (#!/some/path/to/perl) no se utiliza si el script Perl se llama así:

perl some_script.pl

... como el 'default' (para simplificar) perl es elegido entonces. Se debe utilizar la potencia bruta del tinglado vez, ejecutando el archivo en sí:

./some_script.pl

Por supuesto, eso significa que este archivo se debe hacer ejecutable (con chmod a+x, por ejemplo).

+2

El shebang no es realmente ignorado. Simplemente no usa el intérprete de la línea shebang si ya ha especificado uno. –

+0

Entonces, si se dan opciones allí, ¿todavía se usarán? No sabía eso realmente, actualizó la respuesta. – raina77ow

4

que tengo en mi código:

our $LEVEL = '5.10.1'; 
our $BRACKETLEVEL = sprintf "%d.%03d%03d", split/\./, $LEVEL; 

if ($] != $currentperl::BRACKETLEVEL) 
{ 
    die sprintf "Must use perl %s, this is %vd!\n", $LEVEL, $^V; 
} 

Estas son en realidad dos módulos diferentes, pero esa es la idea básica. Simplemente "uso correctlevel" en la parte superior de mi script en lugar de use 5.10.1; y obtengo este dado si un desarrollador intenta usar el nivel incorrecto de perl para ese producto. Sin embargo, no hace nada más que use 5.10.1; (habilite las funciones estrictas, habilitar, como decir, cambiar, etc.).

+0

Gracias Tanktalus. El problema era que estaba ejecutando el script como 'perl scriptName.pl', así que me llevaba a la última instalación de Perl. Ahora ejecuto el script como 'scriptName.pl' y me lleva a la versión perl mencionada en los comandos 'shebang' y 'use'. – JoshMachine

+0

Sería conveniente poner todo eso en un bloque 'BEGIN {}', para que falle rápidamente, en tiempo de compilación. De lo contrario, hará todas sus declaraciones 'use()' (y otras directivas de tiempo de compilación) primero, antes de fallar. –

+0

En realidad, Ken, ya que está en su propio módulo (odio cortar y pegar, tiene más sentido ponerlo en un módulo de todos modos), está implícitamente en BEGIN ya, siempre y cuando 'use' el módulo en lugar de' require '. Y si 'lo requiero', ningún bloque' BEGIN' va a ayudar. También puse mi línea 'use correctlevel;' cerca de la parte superior de las secuencias de comandos relevantes. – Tanktalus

Cuestiones relacionadas