¿Por qué usar estrictos y advertencias?

Me parece que muchas de las preguntas en la etiqueta de Perl podrían resolverse si la gente utilizara:

use strict; use warnings; 

Creo que algunas personas consideran que son similares a ruedas de entrenamiento o complicaciones innecesarias, lo que claramente no es cierto, ya que incluso los progtwigdores de Perl muy hábiles las usan.

Parece que la mayoría de las personas que son competentes en Perl siempre usan estos dos pragmas, mientras que aquellos que se beneficiarían más de su uso rara vez lo hacen. Por lo tanto, pensé que sería una buena idea tener una pregunta para vincular al animar a las personas a use strict y warnings .

Entonces, ¿por qué debería un desarrollador Perl use strict y warnings ?

Para empezar, use strict; (y en menor medida, use warnings; ) ayuda a encontrar errores tipográficos en nombres de variables. Incluso los progtwigdores experimentados cometen esos errores. Un caso común es olvidar cambiar el nombre de una instancia de una variable al limpiar o refactorizar el código.

Usando el use strict; use warnings; use strict; use warnings; capta muchos errores antes de lo que serían atrapados, lo que hace que sea más fácil encontrar las causas de los errores. La causa principal podría ser la necesidad de un error o una verificación de validación, y eso puede suceder independientemente de la habilidad del progtwigdor.

Lo bueno de las advertencias de Perl es que rara vez son espurias, por lo que no hay costo para usarlas.


Lectura relacionada: ¿Por qué usar my ?

Aparentemente use strict debe (debe) usarse cuando se quiere forzar el código de Perl correctamente, lo que podría forzar la statement, ser explícito en cadenas y subs, es decir, usar palabras sin usar o usar referencias con precaución. Nota: si hay errores use strict abortará la ejecución si se usa.

Mientras use warnings; te ayudará a encontrar errores de tipeo en el progtwig, como haber omitido un punto y coma, has usado ‘elseif’ y no ‘elsif’, estás usando una syntax obsoleta o función, sea 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

Desde perl.com (mi favorito):

use estrictos ‘vars’;

lo que significa que siempre debe declarar las variables antes de usarlas.

Si no declara, probablemente recibirá 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 de scriptname.pl 3

Esta advertencia significa que Perl no tiene exactamente claro cuál es el scope de la variable. Por lo tanto, debe ser explícito con respecto a 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 desencadena un error en tiempo de comstackción si intenta acceder a una variable que no cumple al menos uno de los siguientes criterios:

  • Predefinido por Perl, como @ARGV,% ENV y todas las variables de puntuación globales, como $. o $ _.

  • Declarado con nuestro (por un global) o mi (por un léxico).

  • Importado de otro paquete. (El uso de vars pragma falsifica una importación, pero usa nuestro en su lugar).

  • Totalmente calificado usando su nombre de paquete y el separador de paquete de dos puntos.

usar estrictos ‘subs’;

Considera dos progtwigs

 # 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 progtwigs, obtenemos dos resultados diferentes:

En el primer progtwig, en el punto llegamos a $a = test_value; , Perl no conoce ningún subt de test_value (), y test_value se interpreta como string ‘test_value’. En el segundo progtwig, la definición de test_value () viene antes de $a = test_value; línea. Perl piensa test_value como subllamada.

El término técnico para palabras aisladas como test_value que podrían ser subs y podrían ser cadenas según el contexto, por cierto, es bareword . El manejo de las palabras no autorizadas por Perl puede ser confuso y puede causar errores en el progtwig.

El error es lo que encontramos en nuestro primer progtwig. Recuerde que Perl no test_value() encontrar test_value() , ya que no ha visto test_value (), asume que quiere una cadena. Entonces, si use strict subs; , hará que este progtwig muera con un error:

Bareword “test_value” no está permitido mientras que “strict subs” en uso en ./a6-strictsubs.pl línea 3.

La solución a este error sería
1. Use 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 quieres utilizarlo como una cadena, cíbelo.

Por lo tanto, esta restricción hace que Perl trate todas las palabras sin formato como errores de syntax. * Una palabra clave es cualquier nombre o identificador desnudo que no tenga otra interpretación forzada por el contexto. (El contexto a menudo es forzado por una palabra clave o token cercano, o por prestatement de la palabra en cuestión.) * Entonces, si quieres utilizarlo como una cadena, cíbelo y si quieres utilizarlo como una llamada a función, predecútalo o usa paréntesis

Las palabrejas son peligrosas debido a este comportamiento impredecible. use strict; (or use strict 'subs';) use strict; (or use strict 'subs';) hace predecibles, porque las palabras desprotegidas que pueden causar un comportamiento extraño en el futuro harán que su progtwig muera antes de que puedan causar esgulps

Hay un lugar donde está bien usar palabras sin formato incluso cuando has activado sub estrictos: cuando estás asignando claves hash.

 $hash{sample} = 6; # Same as $hash{'sample'} = 6 %other_hash = ( pie => 'apple' ); 

Las palabras brutas en las claves hash siempre se interpretan como cadenas, por lo que no hay ambigüedad.

usar estrictas ‘refs’;

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 difícil 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. 

usa advertencias;

Este pragma de ámbito léxico permite un control flexible sobre las advertencias incorporadas de Perl, tanto las emitidas por el comstackdor como las del sistema de tiempo de ejecución.

Desde perldiag :

De modo que la mayoría de los mensajes de advertencia de las clasificaciones a continuación, es decir, W, D y S, se pueden controlar utilizando las warnings pragma.

(W) Una advertencia (opcional)
(D) Una depreciación (habilitada por defecto)
(S) Una advertencia severa (habilitada por defecto)

He enumerado algunos de los mensajes de advertencia que a menudo aparecen debajo de las clasificaciones. Para obtener información detallada sobre ellos y otros mensajes, consulte perldiag

(W) Una advertencia (opcional):

Falta el argumento en% s
Falta un argumento para -% c
(¿Querías decir &% s en su lugar?)
(¿Quiso decir “local” en lugar de “nuestro”?)
(¿Te refieres a $ o @ en lugar de%?)
‘% s’ no es una referencia de código
length () utilizado en% s
Misplaced _ en número

(D) Una depreciación (habilitada por defecto):

definido (@array) está en desuso
definido (% hash) está en desuso
Uso obsoleto de mi () en falso condicional
$ # ya no es compatible

(S) Una advertencia severa (habilitada por defecto)

elseif debería ser elsif
% s encontrados donde el operador esperaba
(¿Falta el operador antes de% s?)
(¿Falta el punto y coma en la línea anterior?)
% s nunca introducido
Falta el operador o el punto y coma antes de% s
Problema de precedencia: el% abierto debe estar abierto (% s)
Falta de coincidencia de prototipo:% s frente a% s
Advertencia: el uso de “% s” sin paréntesis es ambiguo
No se puede abrir% s:% s

Estos dos pragmas pueden identificar automáticamente errores en tu código.

Siempre uso esto en mi código:

 use strict; use warnings FATAL => 'all'; 

FATAL hace que el código muera en las advertencias, al igual que el strict .

Para obtener información adicional, consulte: Obtenga más estrictas con las advertencias de uso FATAL => ‘all’;

Además … Las restricciones, de acuerdo con Seuss

Hay un buen hilo en perlmonks sobre esta pregunta.

La razón básica obviamente es que las advertencias estrictas y masivas lo ayudan a detectar errores y ayudar a la depuración.

Fuente :: Diferentes blogs

El uso exportará funciones y nombres de variables al espacio de nombres principal llamando a la función import () de los módulos.

Un pragma es un módulo que influye en algún aspecto del tiempo de comstackción o el comportamiento en tiempo de ejecución de perl. Los pragmas dan pistas al comstackdor.

Use advertencias: quejas de Perl sobre variables utilizadas una sola vez, conversiones incorrectas de cadenas en números, .Se requiere escribir en archivos que no están abiertos. Se produce en el momento de la comstackción. Se usa para controlar advertencias.

Utilice el ámbito estricto – declarar variables. Se usa para establecer algún tipo de disciplina en el guión. Si se usan palabras vacías en el código, se interpretarán. Todas las variables deben tener un scope, como mi, nuestro o local.

La directiva “use strict” le dice a Perl que haga comprobaciones adicionales durante la comstackción de su código. El uso de esta directiva le ahorrará tiempo en la depuración de su código Perl porque encuentra errores comunes de encoding que de otro modo podría pasar por alto.

Estricto y las advertencias se aseguran de que sus variables no sean globales.

Es mucho mejor poder tener variables únicas para métodos individuales en lugar de tener que hacer un seguimiento de cada nombre de variable.

$ _, o ninguna variable para ciertas funciones, también puede ser útil para escribir código más compacto más rápido.

Sin embargo, si no usa estrictas y advertencias, ¡$ _ se vuelve global!

 use strict; use warnings; 

Estricto y las advertencias son el modo para el progtwig perl. Está permitiendo que el usuario ingrese el código de manera más liberal y más que eso, ese código perl se verá formal y su estándar de encoding será efectivo.

advertencias significa lo mismo que -w en la línea Perl Shebang, por lo que le proporcionará las advertencias generadas por el progtwig perl, se mostrará en la terminal