2012-06-29 14 views
7

Busqué en Google aproximadamente #!/usr/bin/perl, pero no pude encontrar ninguna respuesta satisfactoria. Sé que es algo bastante básico, pero aún así, ¿podría explicarme cuál es la importancia de #!/usr/bin/perl en Perl? Además, ¿qué significa -w o -T en #!/usr/bin/perl? Soy un novato para Perl, así que por favor se paciente.¿Cuál es la importancia de -T o -w en #!/Usr/bin/perl?

+2

'#!/Usr/bin/perl' se llama línea shebang. '-w' para advertencias'-T' para modo Taint. –

+4

'-w' no ha sido recomendado por muchos años. Desde Perl 5.6.0 hemos tenido 'use warnings' que es más poderoso y más flexible. –

Respuesta

13

The #! comúnmente se llama "shebang" y le dice a la computadora cómo ejecutar un script. También verá muchos guiones de shell con #!/bin/sh o #!/bin/bash.

Por lo tanto, /usr/bin/perl es su intérprete de Perl y se ejecuta y se le da el archivo para ejecutar.

El resto de la línea son opciones para Perl. El "-T" is tainting (significa que la entrada está marcada como "no confiable" hasta que verifique su formato). La "-w" enciende las advertencias.

Puede encontrar más información ejecutando perldoc perlrun (perldoc es el lector de documentación de Perl, podría estar instalado, podría estar en su propio paquete).

Para los scripts se escribe lo recomendaría empezar con:

#!/usr/bin/perl 
use warnings; 
use strict; 

Esto activa un montón de advertencias y controles adicionales - especialmente útil cuando se está aprendiendo (todavía estoy aprendiendo y yo he estado usando Perl por más de 10 años ahora).

+0

Aquí hay una consulta. Cuando requiero otro archivo .pl a un archivo que tenga #!/Usr/bin/perl -T, arroja un error. Y cuando elimino -T, se ejecuta. ¿Cuál es el motivo? Gracias. – vijay

2

Se llama shebang. En los sistemas basados ​​en Unix (OSX, Linux, etc.) esa línea indica la ruta al intérprete de idioma cuando el script se ejecuta desde la línea de comando. En el caso de perl/usr/bin/perl es la ruta al intérprete de Perl. Si se omite el hashbang, los sistemas * nix no sabrán cómo analizar el script cuando se invoque como un ejecutable. En cambio, tratará de interpretar el script en cualquier shell que el usuario esté ejecutando (probablemente bash) y romperá el script.

http://en.wikipedia.org/wiki/Hashbang

El -W y -T son argumentos que CONTROLL la forma en que el intérprete de Perl opera. Son los mismos argumentos que puede invocar cuando llama al intérprete de Perl directamente desde la línea de comandos.

  • -W muestra advertencias (también conocido como información de depuración).
  • -T activa la comprobación de contaminación/seguridad.
5

Tanto -w y -T son una especie de banderas "a toda prueba".

-w es lo mismo que la declaración use warning en su código, y es una opción de advertencia equivalente en muchos compiladores.Un ejemplo sencillo sería una advertencia sobre el uso de variables sin inicializar:

#!/usr/bin/perl -w 
print "$A\n"; 
print "Hello, world!\n"; 

imprimirá:

Name "main::A" used only once: possible typo at ./perl-warnings line 3. 
Use of uninitialized value $A in concatenation (.) or string at 
./perl-warnings line 3. 

Hello, world! 

significa La bandera -T que cualquier valor que viene del mundo exterior (como opuesta a la que se calcula el interior de la programa) se considera una amenaza potencial y no permite el uso de dichos valores en operaciones relacionadas con el sistema, como escribir archivos, ejecutar comandos del sistema, etc. (Por eso Perl activará el modo "contaminación" cuando el script se ejecuta bajo setuid/setgid.)

El modo "contaminado" lo "obliga" a volver a verificar el valor dentro del script.

Por ejemplo, el código:

#!/usr/bin/perl -T 
$A = shift; 
open FILE, ">$A"; 
print "$A\n"; 
close FILE; 

producirá un error fatal (que termina el programa):

$ ./perl-tainted jkjk 
Insecure dependency in open while running with -T switch at 
./perl-tainted line 3. 

Y eso es sólo porque el valor del argumento vino de "afuera" y no fue " doblemente verificado". El modo "contaminación" está llamando su atención sobre ese hecho. Por supuesto, es fácil engañarlo, por ejemplo:

#!/usr/bin/perl -T 
$A = shift; 
$A = $1 if $A =~ /(^.*$)/; 
open FILE, ">$A"; 
print "$A\n"; 
close FILE; 

En este caso todo funcionó bien. Usted "engañó" el "modo de contaminación". Bueno, la suposición es que las intenciones del programador son hacer que el programa sea más seguro, por lo que el programador no solo solucionará el error, sino que más bien tomará algunas medidas de seguridad. Uno de los apodos de Perl es "el pegamento y la cinta aislante de los administradores del sistema". No es improbable que el administrador del sistema cree el script Perl para sus propias necesidades y lo ejecute con los permisos root. Piense en este guión haciendo algo que los usuarios normales no pueden hacer ... probablemente quiera verificar dos veces las cosas que no son parte del programa, y ​​quiere que Perl le recuerde sobre ellas.

Espero que ayude.

+2

'-w' no es lo mismo que' use warnings; '. El pragma tiene un alcance léxico. – friedo

+2

sobre "-w es lo mismo que advertencia de uso". eso no es exactamente correcto -W enciende las advertencias en cualquier parte (ignorando $^W o sin advertencias), -w activa las advertencias en cualquier lugar, excepto cuando $^W se establece en 0 o no se usa ninguna advertencia. "usar advertencias" tiene un alcance léxico. – tinita

3

sobre el Modo Mancha (-T):
require y use declaraciones cambiar cuando el modo mancha está encendida.
La ruta para cargar bibliotecas/módulos ya no contiene . (el directorio actual) desde su ruta.

Por lo tanto, si carga cualquier biblioteca o módulo relativo al directorio de trabajo actual sin especificar explícitamente la ruta, su secuencia de comandos se romperá en el modo de contaminación.

Por ejemplo: Considere perl_taint_ex.pl

#!/usr/bin/perl -T 

require "abc.pl"; 
print "Done"; 

fallarían como esto

D:\perlex>perl perl_taint_ex.pl 
"-T" is on the #! line, it must also be used on the command line 
at perl_taint_ex.pl line 1. 

D:\perlex>perl -T perl_taint_ex.pl 
Can't locate abc.pl in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib) 
at perl_taint_ex.pl line 3. 

Por eso, cuando el modo de mancha está en, debe informar a la declaración exigir explícitamente dónde cargar la biblioteca desde . se elimina durante el modo de contaminación de la matriz @INC.

@INC contiene una lista de rutas válidas para leer archivos y módulos de bibliotecas.

Si el modo de mancha está en, sólo tiene que hacer lo siguiente:

D:\perlex>perl -ID:\perlex -T perl_taint_ex.pl 
Done 

-ID:\perlex incluirá directorio D:\perlex en @INC.

Puede probar otras formas para agregar la ruta a @INC, este es solo un ejemplo.

+0

Esta explicación proporciona una buena explicación de lo que sucede si no utiliza el parámetro -T correctamente desde la línea de comandos, sino que lo especifica en la línea shebang de un script de Perl. Útil. – pdwalker

Cuestiones relacionadas