Aparentemente, use strict
debería (debe) usarse cuando desee forzar a perl a codificar correctamente, lo que podría ser forzar una declaración, ser explícito en cadenas y subs, es decir, palabras simples o usar referencias con precaución. Nota: si hay errores, use estricto abortará la ejecución si se usa.
Si bien use warnings;
lo ayudará a encontrar errores de escritura en el programa, como si omitió un punto y coma, usó 'elseif' y no 'elsif', está usando una sintaxis o función obsoleta, lo que sea. Nota: las advertencias de uso solo proporcionarán advertencias y continuarán la ejecución, es decir, no abortarán la ejecución.
De todos modos, sería mejor si entramos en detalles, que estoy especificando a continuación.
De perl.com (mi favorito):
use 'vars' estrictas;
lo que significa que siempre debes declarar variables antes de usarlas.
Si no declara, probablemente obtendrá un mensaje de error para la variable no declarada
El símbolo global "$ variablename" requiere un nombre de paquete explícito en la línea 3 scriptname.pl
Esta advertencia significa que Perl no tiene exactamente claro cuál es el alcance de la variable. Por lo tanto, debe ser explícito sobre sus variables, lo que significa declararlas con my
para que estén restringidas al bloque actual, o hacer referencia a ellas con su nombre completo (por ejemplo: $ MAIN :: nombre de la variable).
Por lo tanto, se activa un error en tiempo de compilación si intenta acceder a una variable que no ha cumplido al menos uno de los siguientes criterios:
Predefinido por el propio Perl, como @ARGV,% ENV y todas las variables de puntuación globales como $. o $ _.
Declarado con nuestro (para un global) o my (para un léxico).
Importado de otro paquete. (El uso de vars pragma simula una importación, pero usa nuestro en su lugar).
Completamente calificado usando su nombre de paquete y el separador de paquetes de dos puntos.
use 'subs' estrictos;
Considere dos programas
# prog 1
$a = test_value;
print "First program: ", $a, "\n";
sub test_value { return "test passed"; }
Output: First program's result: test_value
# prog 2
sub test_value { return "test passed"; }
$a = test_value;
print "Second program: ", $a, "\n";
Output: Second program's result: test passed
En ambos casos tenemos un sub test_value () y queremos poner su resultado en $ a. Y, sin embargo, cuando ejecutamos los dos programas, obtenemos dos resultados diferentes:
En el primer programa, en el punto al que llegamos $a = test_value;
, Perl no conoce ningún subtest_value (), y test_value se interpreta como cadena 'test_value'. En el segundo programa, la definición de test_value () viene antes de la $a = test_value;
línea. Perl piensa test_value como una sub-llamada.
El término técnico para palabras aisladas como test_value que podrían ser subs y podrían ser cadenas dependiendo del contexto, por cierto, es bareword . El manejo de Perl de barewords puede ser confuso y puede causar errores en el programa.
El error es lo que encontramos en nuestro primer programa. Recuerde que Perl no esperará encontrarlo test_value()
, así que como aún no ha visto test_value (), asume que quiere una cadena. Entonces, si usted use strict subs;
, causará que este programa muera con un error:
No se permite la palabra clave "test_value" mientras se utilizan "subs estrictos" en ./a6-strictsubs.pl línea 3.
La solución a este error sería
1. Utilice paréntesis para dejar en claro que está llamando a un sub. Si Perl ve $ a = test_value () ;,
2. Declare su sub antes de usarlo por primera vez
use strict;
sub test_value; # Declares that there's a test_value() coming later ...
my $a = test_value; # ...so Perl will know this line is okay.
.......
sub test_value { return "test_passed"; }
3. Y si quiere usarlo como una cadena, cítelo.
Entonces, esta restricción hace que Perl trate todas las palabras desnudas como errores de sintaxis. * Una palabra simple es cualquier nombre o identificador desnudo que no tiene otra interpretación forzada por el contexto. (El contexto a menudo es forzado por una palabra clave o token cercano, o por la predeclaración de la palabra en cuestión). * Entonces, si desea usarlo como una cadena, cítelo y si desea usarlo como una llamada de función, preclarelo o use paréntesis.
Las palabras desnudas son peligrosas debido a este comportamiento impredecible. use strict; (or use strict 'subs';)
los hace predecibles, porque las palabras simples que podrían causar un comportamiento extraño en el futuro harán que su programa muera antes de que puedan causar estragos
Hay un lugar donde está bien usar barewords incluso cuando ha activado subs estrictos: cuando está asignando claves hash.
$hash{sample} = 6; # Same as $hash{'sample'} = 6
%other_hash = ( pie => 'apple' );
Las palabras desnudas en las claves hash siempre se interpretan como cadenas, por lo que no hay ambigüedad.
use 'refs' estrictos;
Esto genera un error en tiempo de ejecución si usa referencias simbólicas, intencionalmente o de otra manera. Un valor que no es una referencia estricta se trata como una referencia simbólica. . Es decir, la referencia se interpreta como una cadena que representa el nombre de una variable global.
use strict 'refs';
$ref = \$foo; # Store "real" (hard) reference.
print $$ref; # Dereferencing is ok.
$ref = "foo"; # Store name of global (package) variable.
print $$ref; # WRONG, run-time error under strict refs.
use advertencias;
Este pragma de ámbito léxico permite un control flexible sobre las advertencias integradas de Perl, tanto las emitidas por el compilador como las del sistema de tiempo de ejecución.
De perldiag
:
Por tanto, la mayoría de los mensajes de advertencia de las clasificaciones siguientes, es decir, W, D & S, se pueden controlar mediante warnings
pragma.
(W) Una advertencia (opcional)
(D) Una desaprobación (habilitada de forma predeterminada)
(S) Una advertencia severa (habilitada de manera predeterminada)
He enumerado algunos de los mensajes de advertencia que aparecen a continuación por clasificaciones. Para obtener información detallada sobre ellos y otros mensajes, consulte perldiag
(W) Una advertencia (opcional):
Falta un argumento en% s
Falta un argumento para -% c
(¿Quisiste decir &% s en su lugar?)
(¿Quisiste decir "local" en lugar de "nuestro"?)
(¿Quisiste decir $ o @ en lugar de%?)
'% S 'no es una
longitud de referencia de código () usada en% s fuera de lugar
_ en número
(D) Una desaprobación (habilitada de forma predeterminada):
definido (@array) está en desuso
definido (% hash) está en desuso
Uso en desuso de my () en condicional falso
$ # ya no es compatible
(S) Una advertencia severa (habilitada por defecto)
elseif debería ser elsif
% s donde se esperaba el operador
(¿Falta el operador antes de% s?)
(¿Falta el punto y coma en la línea anterior?)
% s nunca introducido El
operador o el punto y coma falta antes de% s
Problema de precedencia: abierto% s debería estar abierto (% s)
Desajuste del prototipo:% s vs% s
Advertencia: El uso de "% s" sin paréntesis es ambiguo
No se puede abrir% s:% s
use loose;