2010-08-17 6 views
5

Debido a la presión externa a nuestro grupo, tenemos que exportar más de cien scripts Perl de Sparc a x86. Esto significa cambiar docenas de líneas de shebang de #!/home/Perl/bin/perl -w a otra cosa, lo cual es un verdadero dolor. ¿Cuál es la buena manera de hacer esto (no puedo encontrar nada en Lycos)?Perl Script Portability y Future Proofing

¿Qué sucede cuando nos vemos obligados a pasar de x86 a otra cosa (como Cray, supongo)? ¿Hay alguna manera de "a prueba de futuro"?

+3

Lycos todavía está funcionando? Huh. – Ether

+1

Sí lo es. ¿Por qué? –

+0

@Ether - Lo hacen. IIRC, el último propietario era una compañía coreana. Tienen tanto la búsqueda agregada de HotBot (sus propios resultados de + MSN + ask.com) como el motor LyGO de "búsqueda visual", que suena un poco cool PERO utiliza el mismo viejo y desagradable índice de búsqueda de Lycos. – DVK

Respuesta

4

Cambio de las líneas shebang en masa no es tan malo:

#! /usr/bin/perl 

use warnings; 
use strict; 

use File::Find; 

sub usage { "Usage: $0 dir ..\n" } 

my @todo; 
sub has_perl_shebang { 
    return unless -f; 
    open my $fh, "<", $_ or warn "$0: open $File::Find::name: $!", return; 
    push @todo => $File::Find::name 
    if (scalar(<$fh>) || "") =~ /\A#!.*\bperl/i; 
} 

die usage unless @ARGV; 
find \&has_perl_shebang => @ARGV; 

local($^I,@ARGV) = ("",@todo); 
while (<>) { 
    s[^(\#!.*) $ ][#! /usr/bin/env perl]x 
    if $. == 1; 
    print; 
} 
continue { 
    close ARGV if eof; 
} 

Dependiendo de lo que tienes, la s/// puede necesitar ser un poco más inteligente para manejar switches como -T que deben estar en la línea shebang.

añadir una opción de funcionamiento en seco con algunos cambios, además de un uso interesante de redo:

my $dryrun; 
{ 
    die usage unless @ARGV; 
    $dryrun = shift @ARGV, redo if $ARGV[0] eq "-n"; 
} 

find \&has_perl_shebang => @ARGV; 
if ($dryrun) { 
    warn "$0: $_\n" for @todo; 
    exit 1; 
} 
+0

¡Muy bien! ¿Funciono esto en Sparc o X86? Supongo que X86 será más rápido. –

+0

@Ariel ¡Gracias! Ejecutaría esto en el lado x86 (destino) porque arregla las líneas de shebang en el lugar. –

5

Perl es multiplataforma. A menos que su código haga uso del código compilado XS o rutas, instalaciones, etc., específicos del sistema, debería estar bien.

tiene dos opciones:

  1. No utilice líneas shebang (perl yourscript.pl).
  2. find . -name '*pl' | xargs sed 's/#!\/home\/Perl\/bin\/perl -w/#!\/usr\/bin\/env perl/

En cualquier caso, la línea tinglado no tiene nada que ver con la plataforma de hardware que se está ejecutando, y todo ello con la cáscara se está ejecutando en.

+0

Lo siento. Debería haber declarado mi caparazón. Estoy usando 'tcsh' ¿este es mi problema? –

+1

No, 'tcsh' admite líneas shebang. Si sus sistemas tienen 'env' instalado, solo necesita cambiar sus scripts con la opción 2, arriba. –

+0

No puedo garantizar que los sistemas que ejecutan nuestros scripts tengan 'env' instalado. –

11

Esta es una razón por la que muchas personas defienden el uso #!/usr/bin/env perl en lugar de #!/usr/bin/perl:

+0

¿Cómo hace esto que mis scripts sean portátiles? –

+0

Se ejecutarán en cualquier ejecutable "perl" que encuentre el sistema, a través de '/ usr/bin/env' ... – mfontani

+0

@Ariel: Más específicamente, usar' #!/Usr/bin/env perl' hará que el programa se ejecutará utilizando el primer binario 'perl' encontrado en 'PATH' del usuario que lo controla. Tenga en cuenta que si por "x86" quiere decir "Windows", esto no es relevante de todos modos, ya que Windows pasa por la extensión de archivo y por completo ignora la línea '#!'. –

1

Otra alternativa (podría ser más simple aunque yo dudaría en decir "mejor") es, por supuesto, para vincular /home/Perl/bin/perl al lugar donde esté el binario real de Perl en los nuevos sistemas ... solo es factible si tiene herramientas eficientes de administración de sistemas a granel que la mayoría de las empresas normales deberían.

+0

¿Qué es "herramientas eficientes de administración de sistemas a granel"? No creo que tengamos eso. –

+0

Algo que le permita crear un enlace simbólico en cada uno de los servidores x86 existentes y nuevos sin hacerlo individualmente servidor por servidor (a menos que, por supuesto, solo tenga 2-3 servidores, en cuyo caso es posible hacerlo a mano) – DVK

Cuestiones relacionadas