strawberry logo lane historia example compilador perl

logo - ¿Por qué son advertencias de uso? usar estricto; no predeterminado en Perl?



perl vs python (5)

Bueno, use strict es el predeterminado ahora, más o menos.

Desde Perl 5.12.0 si requiere una versión de Perl> = 5.12.0, entonces su script tendrá todas las funciones incompatibles hacia atrás, 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 activado de forma más amplia porque al hacerlo se romperían muchas secuencias de comandos de las que dependen las personas para "simplemente trabajar".

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

Me pregunto por qué

use warnings; use strict;

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

¿Hay demasiados módulos CPAN mal escritos (usando "mal" para decir 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?


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 una secuencia de comandos especifica una versión mínima de 5.11.0 o superior (por ejemplo, use 5.012 ), entonces el estricto se activa automáticamente . Esto no habilita las advertencias, pero quizás eso se agregará en una versión futura. Además, si realiza programación OO en Perl, debe saber que el uso de Moose activa automáticamente los warnings strict y warnings en esa clase.


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

En primer lugar, 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. Considerar:

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

Ahora, sería fácil agregar un "mi" al @a, pero para un guión de una sola línea, la gente no quiere hacer eso.

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

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


Puede usar el módulo common::sense si necesita:

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);

Reduce el uso de memoria.


Si tiene un Perl moderno, dígalo, solo tiene que habilitarlo. 5.12 se aplica strict excepción de 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.