2011-12-14 6 views
10

Viniendo de un fondo de C++, que religiosamente utilizan los use strict y use warnings características de Perl:¿Cómo obtengo perl -c para arrojar errores de función no definidos o no declarados?

#!/usr/bin/perl -w 
use strict; 
use warnings; 

$foo = 1; #Throws "$foo" requires explicit package name error 

foobar(1); 

La construcción use strict es inmensamente útil para detectar errores cuando se escribe incorrectamente un nombre de variable. ¿Existe una construcción equivalente para capturar nombres de funciones mal escritas? En el ejemplo anterior, sería genial si hubiera algo como perl -c que captara el hecho de que no hay una función foobar disponible para llamar. Por supuesto, ejecutar el script arroja un error de subrutina indefinida, pero me gustaría verlo antes.

+2

http://www.perlmonks.org/?node_id=391783 – jackdoe

Respuesta

13

Prueba esto:

perl -MO=Lint -cw /path/to/script.pl 

Este utiliza el B::Lint module.

+0

¡Guau, gracias, no sabía ese módulo! –

2

Perl no puede saber en tiempo de compilación que no habrá un sub llamada cuando se llegue a la llamada secundaria, por lo que -c no puede decírselo.

perlcritic es una herramienta diseñada para escanear el código de Perl y conjetura en posibles problemas como este. La regla Perl :: Critic :: StricterSubs perlcritic comprueba este problema.

+0

Sí, 'perlcritic' puede verificar esto. Ver mi respuesta para más detalles. – toolic

6

Al ver respuesta ikegami 's me recordó que perlcritic puede identificar submarinos no declarados, pero hay que instalar la política de Perl::Critic::StricterSubs, que no forma parte del núcleo de la distribución Perl::Critic.

perlcritic -4 mycode.pl

subprogramas "foobar" no se declara explícitamente ni importada en línea 10, columna 1. Esto podría ser un error importante. (Gravedad: 4)

7

El módulo Sub::StrictDecl hace lo que está buscando, y con alcance léxico.

Este módulo proporciona la comprobación opcional de la existencia de subrutinas en tiempo de compilación. Esta comprobación detecta los nombres de subrutinas mal escritos y las subrutinas que el programador olvidó importar. Tradicionalmente, Perl no detecta estos errores hasta el tiempo de ejecución, por lo que es fácil para los errores esconderse en código raramente ejecutado o no probado.

Específicamente, cuando la comprobación está habilitada, se examina cualquier referencia a un nombre de subrutina específico del paquete (constante de tiempo de compilación). Si la subrutina nombrada nunca se ha declarado, entonces un error es señalizado en tiempo de compilación. Esto no requiere que la subrutina esté completamente definida: una declaración directa como "sub foo"; es suficiente para suprimir el error. Las subrutinas importadas califican como declaradas. Las referencias que están marcadas incluyen no solo llamadas de subrutina sino también referencia pura como "\ & foo".

Esta comprobación está controlada por un pragma de ámbito léxico.Es , por lo tanto, se aplica solo al código que explícitamente quiere la verificación, y es posible desactivar la verificación local si es necesario. La comprobación de puede necesitar ser desactivada para el código que hace arreglos especiales para poner una subrutina en su lugar durante el tiempo de ejecución, por ejemplo.

Cuestiones relacionadas