2008-10-21 14 views

Respuesta

31

Utilizando el interruptor permitirá a todas las advertencias en todos módulos utilizados por el programa. Usando pragma, lo habilita solo en ese módulo específico (o script). Idealmente, usa advertencias en todos sus módulos, pero a menudo ese no es el caso. Usar el interruptor puede generarle muchas advertencias cuando usa un módulo de terceros que no es seguro para las advertencias.

Por lo tanto, idealmente no importa, pero pragmáticamente a menudo es preferible que los usuarios finales no usen el interruptor sino el pragma.

17

El modificador de línea de comandos -w activa las advertencias globalmente para todo el intérprete. Por otro lado, use warnings es un "pragma léxico" y solo se aplica en el ámbito léxico en el que se usa. Usualmente, pones eso en la parte superior de un archivo para que se aplique a todo el archivo, pero también puedes extenderlo a bloques particulares. Además, puede usar no warnings para desactivarlos temporalmente dentro de un bloque, en los casos en que necesite hacer un comportamiento de generación de advertencia. No puede hacer eso si tiene activado -w.

Para obtener más información acerca de cómo funcionan las advertencias léxicas, incluido cómo activar y desactivar varios subconjuntos de ellas, consulte el documento perllexwarn.

+2

Su punto de "no hay advertencias" es lo que esperaba, pero una prueba rápida (perl -w -e "no warnings; print $ a;") mostró que, al menos en mi perl, "no warnings" todavía funciona incluso con -w. –

10

"-w" es anterior y solía ser la única forma de activar las advertencias (en realidad "-w" solo habilita la variable global $^W). "usa advertencias"; ahora es preferible (a partir de la versión 5.6.0 y posterior) porque (como ya se mencionó) tiene un alcance léxico en lugar de global, y puede activar/desactivar advertencias específicas. Y no olvides comenzar también con "use strict"; :-)

+0

A partir del 5.6.0. Y hay advertencias :: compatibilidad para ayudar si todavía te preocupa el 5.5. – Schwern

+0

Reparado. Sabía que debería haber dicho "5.6" :-) – runrig

+0

¿Pero por qué alguien querría usar 5.6.0 de todos modos? :-) – runrig

-6

Haga ambas cosas! ¡Siempre!

+0

¿Por qué votas por esto? – JDrago

5

Otra distinción digna de mención, es que el pragma "usar advertencias" también le permite seleccionar advertencias específicas para habilitar (y del mismo modo, "sin advertencias" le permite seleccionar advertencias para deshabilitar).

1

Además de activación/desactivación de las afirmaciones específicas mediante el pragma, también puede promover algunas o todas las advertencias de errores:

use strict; 
use warnings FATAL => 'all', NONFATAL => 'exec'; 
+2

Esa es una buena idea durante el desarrollo, pero puede no ser una buena idea en la implementación. –

Cuestiones relacionadas