2011-05-18 10 views
32

me pregunto por qué¿Por qué son advertencias de uso? usar estricto; no predeterminado en Perl?

use warnings; 
use strict; 

no por defecto en Perl. Se necesitan para cada script. Si alguien (por una buena razón) necesita deshabilitarlos, deben usar no strict y/o usar algún argumento de línea de comando (para líneas simples).

¿Hay demasiados módulos de CPAN mal escritos (con el significado "malo" sin use strict)? ¿O es porque esto puede romper una gran cantidad de código ya en producción? Estoy seguro de que hay una razón y me gustaría saberlo.

En 5.14 IO::File se carga automágicamente a pedido, ¿no sería posible hacer algo así con estos pragmas básicos?

+4

Consulte también esta discusión PerlMonks: [¿Por qué no es C el valor predeterminado?] (Http://www.perlmonks.org/?node_id=403225) – toolic

+0

posible duplicado de [¿Por qué no utilizar estrictas y advertencias en Perl? ] (http://stackoverflow.com/questions/18064509/why-not-use-strict-and-warnings-in-perl) –

Respuesta

50

Es por compatibilidad con versiones anteriores. Perl 4 no tenía nada de estricto, y lo más probable es que todavía haya scripts escritos originalmente para Perl 4 que aún funcionan bien con Perl 5. Hacer estrictamente automático rompería esos scripts. La situación es aún peor para los que tienen una sola línea, muchos de los cuales no se molestan en declarar variables. Hacer que los one-liners sean estrictos por defecto rompería probablemente millones de scripts de shell y Makefiles.

No se puede cargar automágicamente, porque agrega restricciones, no características. Una cosa es cargar IO :: File cuando se invoca un método en Filehandle. Pero activar estrictamente a menos que el código hiciera algo prohibido por estricto no tiene sentido.

Si un script especifica una versión mínima de 5.11.0 o superior (por ejemplo, use 5.012), entonces strict is turned on automatically. Esto no habilita las advertencias, pero quizás eso se agregará en una versión futura. Además, si realiza la programación OO en Perl, debe saber que al usar Moose se encienden automáticamente strict y warnings en esa clase.

+0

Hay muchas cosas en Perl 4 que se rompen en Perl 5, como ticks como especificadores de paquetes. Y no importa que no haya manera de especificar 'strict'; no tenía alcance de variable léxica, por lo que sería imposible que una secuencia de comandos que funciona en Perl 4 también funcione en Perl 5. La principal preocupación son los guiones Perl * 5 * escritos sin 'estricto' en mente, especialmente esos de una línea. –

+1

@MarkReed, las marcas como especificadores de paquetes aún funcionan en Perl 5; simplemente no se recomiendan (p. ej., [Acme :: Do not] (https://metacpan.org/pod/Acme::Don::t)). AFAIK, la mayoría del código de Perl 4 funciona en Perl 5 (siempre que no intentes 'usar strict'). – cjm

+0

Bueno, seré agitado. 'perl -MText :: CSV -E" dice Text'CSV-> new "' produce 'Text :: CSV = HASH (0x7fe1b982ccb0)'. TIL. ¡Gracias! –

17

Si tiene un Perl moderno, dígalo, solo tiene que habilitarlo. 5.12 applies strict except for one-liners. No puede ser predeterminado debido a la compatibilidad con versiones anteriores.

$ cat strict-safe?.pl 
use 5.012; 
$foo 

$ perl strict-safe\?.pl 
Global symbol "$foo" requires explicit package name at strict-safe?.pl line 2. 
Execution of strict-safe?.pl aborted due to compilation errors. 
10

Es una pregunta filosófica, no una pregunta de "no funcionará".

Primero, perl siempre ha estado bajo el tipo de paradigma "puedes hacerlo incorrectamente si quieres". Por eso hay muchos enemigos de Perl. Muchos preferirían que el lenguaje siempre te obligue a escribir un buen código, pero muchos hackers de scripts rápidos no quieren hacerlo. Considere:

perl -e '@a = split(/[,:]/, $_); print $a[1],"\n";' 

Ahora, sería fácil de agregar un 'mi' frente a la @a, pero para una sola línea, la gente de secuencia de comandos de una sola vez no quieren hacer eso.

En segundo lugar, sí, creo que la mayoría de CPAN debería ser reescrito.

No hay una buena respuesta que te guste, me temo.

16

Bueno, use strict es por defecto ahora, más o menos.

Desde Perl 5.12.0 si necesita una versión de Perl> = 5.12.0, su secuencia de comandos tendrá activadas todas las características incompatibles, incluido el estricto por defecto.

use 5.12.0; 
use warnings; 

es lo mismo que:

use strict; 
use warnings; 
use feature ':5.12'; 

No se ha convertido en un sentido más amplio, ya que hacerlo sería romper muchos scripts que dependen las personas a "sólo trabajo".

Moose también activa estrictamente y avisos cuando lo usa. Entonces, si haces un Perl OOP basado en Moose, entonces obtienes un pase gratis aquí también.

+0

Gracias por mencionar a Mooose. Bueno saber. – kobame

-2

Usted puede utilizar el módulo common::sense, si es necesario:

use utf8; 
use strict qw(vars subs); 
use feature qw(say state switch); 
no warnings; 
use warnings qw(FATAL closed threads internal debugging pack 
       portable prototype inplace io pipe unpack malloc 
       deprecated glob digit printf layer 
       reserved taint closure semicolon); 
no warnings qw(exec newline unopened);

que reduce el uso de memoria.

+0

Desafortunadamente, 'common :: sense' no es de sentido común. No hay advertencias o restricciones que se deben desactivar por defecto. – Ether

+7

'common :: sense' no es. Su selección de advertencias y restricciones que no enciende refleja las peculiaridades del autor, no una buena práctica. En particular, no encender las referencias estrictas y las advertencias indefinidas es buscar problemas. En cuanto a la afirmación de uso de la memoria, aunque estrictamente cierto, nunca se ve en la práctica. Una vez que se carga cualquier otro módulo sensible, se cargarán estrictas y advertencias. En la práctica, terminas usando un smidge más memoria. Finalmente, el autor no es alguien con quien desea ponerse en contacto para obtener soporte. – Schwern

+0

@Schwern: También se olvida de activar 'unicode_strings'. Y una lista de advertencias explícitas significa que puede haber olvidado algunos futuros que aún no existen, como las advertencias del paquete. Por último, debe retrasar las muertes hasta el tiempo de ejecución, o el compilador se comporta mal en el informe de errores. – tchrist

Cuestiones relacionadas