“Hay más de una manera de hacerlo” es el famoso lema de Perl. Y a medida que empiezas a programar, vas viendo cuán brillante y peligroso puede ser. Por suerte, existe una herramienta para ayudarte a escribir un código mejor y más seguro: perlcritic.

Perl es extremadamente flexible y te permite hacer un montón de cosas. Además Perl5-Porters, el equipo que gestiona las nuevas versiones de Perl, trabaja muy duro para mantener la compatibilidad con versiones anteriores (mientras tenga sentido). Si sabes lo que estás haciendo, estos dos hechos te irán como un anillo al dedo. No obstante, si aún eres inexperto en el tipo de código que estás escribiendo, o simplemente desconoces algunas de las funcionalidades ocultas de Perl, o si estás usando código viejo publicado en Internet, puedes encontrarte con cierto código vulnerable o insuficiente sin saberlo. Esto es particularmente importante cuando se escribe código en equipo, donde hay personas de distintos niveles y conocimientos contribuyendo al mismo código. Bajo estas circunstancias, suele ser conveniente determinar una serie de normas para asegurarse que el código es seguro y coherente. Evidentemente, Perl tiene lo más adecuado para esto.

perlcritic

Perlcritic

Si buscas perlcritic en Comprehensive Perl Archive Network (o CPAN, los archivos de módulos y distribuciones de Perl en Internet) te encontrarás con la siguiente definición:

“perlcritic es un corrector de código fuente de Perl. Es el front-end ejecutable del motor Perl :: Critic que intenta identificar construcciones raras, difíciles de leer, propensas a errores o poco convencionales en tu código.”

Así que, ¿qué significa y cómo te puede ayudar? Esto básicamente quiere decir que perlcritic es una herramienta que usa un módulo de Perl que analiza tu código y decirte si hay algo que deberías hacer de distinta forma. Las reglas que usa el corrector se basan en el libro de Damian Conway Perl Best Practices, aunque estas se pueden modificar fácilmente quitándolas o añadiéndolas por ti mismo.

Veámoslo en acción. Ten en cuenta el siguiente código:

#!/usr/bin/perl
use v5.22;

my $first = "42";
my $second = "314";

my $multiplication = $first * $second;

say "$first times $second is $multiplication";

Este código funciona tal y como debería, y si se ejecuta, imprime 42 veces 314 es 13188. Sin embargo, si lo analizamos con perlcritic obtenemos lo siguiente:

~$ perlcritic mult.pl
[TestingAndDebugging::RequireUseWarnings] Code before warnings are enabled at mult.pl line 4, near 'my $first = "42";'

Nos olvidamos de añadir las señales de alerta al código; pragma que habilita alertas en situaciones peligrosas o confusas en tu código. Evidentemente es un ejemplo muy simple, pero muestra lo fácil que es usar perlcritic por defecto y cómo puede ayudarnos a encontrar errores y códigos potencialmente problemáticos.

Considera ahora algún código heredado (o algún sitio de Internet antiguo) que use la la insegura función abierta de dos argumentos. En perlcritic hay una política específica para detectar este comportamiento para que puedas cambiarlo antes de que te duela:

[InputOutput::ProhibitTwoArgOpen] Two-argument "open" used at read-file.pl line 8, near 'open my $fh, ">$filename"'

Usando perlcritic en la base de código de tu equipo puedes detectarlo antes de que vaya a producción, asegurándote que tu código será seguro, quienquiera que lo haya escrito. En otras palabras, te ayuda a establecer e implementar los estándares de calidad de tu equipo.

Creando un perfil

Perlcritic aplica por defecto un conjunto de normas válidas e importantes. No obstante, es posible que quieras modificar ese comportamiento para que se adapte mejor a tu organización. Como se anunció, perlcritic te permite crear un conjunto de reglas que tengan sentido para ti y tu equipo. Para hacerlo, solo necesitas crear un archivo .perlcriticrc, configurarlo en tu directorio de inicio y perlcritic lo usará. Veamos un ejemplo:

color    = 1
only     = 1
verbose  = [%p] %m at %f line %l, near '%r'\n
severity = 2
color-severity-highest = bold red
color-severity-high    = yellow
color-severity-medium  = bold blue
color-severity-low     = blue
color-severity-lowest  = magenta

# -----------------
# - Core policies -
# -----------------

# Always use strict
[TestingAndDebugging::RequireUseStrict]
severity           = 5
# Some modules enable strict automatically, so no need to enforce it
equivalent_modules = Moo Moose Moo::Role Moose::Role strictures common::sense
# Use of 'no strict' is forbidden
[TestingAndDebugging::ProhibitNoStrict]

[TestingAndDebugging::RequireUseWarnings]
severity           = 5
# Some modules enable warnings utomatically, so no need to enforce it
equivalent_modules = Moo Moose Moo::Role Moose::Role strictures
# Use of 'no warnings' is forbidden
[TestingAndDebugging::ProhibitNoWarnings]

# No bareword filehandles
[InputOutput::ProhibitBarewordFileHandles]

# Always use three arg open and check the result
[InputOutput::ProhibitTwoArgOpen]
severity                        = 5
[InputOutput::RequireCheckedOpen]

# ---------------------------------
# - 'Avoid human errors' policies -
# ---------------------------------

# Don't use the comma operator as a statement separator
[ValuesAndExpressions::ProhibitCommaSeparatedStatements]
# Allow map and grep blocks to return lists.
allow_last_statement_to_be_comma_separated_in_map_and_grep = 0

# It is unsafe to call: require "string"
# It is wrong to call: eval "string"
[BuiltinFunctions::ProhibitStringyEval]

[BuiltinFunctions::ProhibitStringySplit]
severity = 3

# To avoid confusion if labeled blocks are used
[ControlStructures::ProhibitLabelsWithSpecialBlockNames]

# Do not put in production testing code with 'exit' or 'die' statements in the middle
[ControlStructures::ProhibitUnreachableCode]

En este perfil de ejemplo tenemos dos secciones:

Algunas cosas en el ejemplo pueden no tener sentido para tu propia situación. Por ejemplo, en un equipo con experiencia la prohibición de no usar “no strict” puede ser restrictivo. Pero si no conoces las consecuencias, tenerlo ahí es una buena idea.

YAPC::EU

Perl::Critic

Como se ha mencionado antes, perlcritic es una herramienta de línea de comando que funciona como interfaz de Perl::Critic, el módulo que hace todo el trabajo. Y al ser un módulo como cualquier otro, puedes usarlo directamente de la siguiente forma:

#!/usr/bin/perl
use v5.22;

use strict;
use warnings;

use Perl::Critic;

my $file = shift;
my $critic = Perl::Critic->new();
my @violations = $critic->critique($file);
say @violations;

Si tomamos el ejemplo anterior y lo pasamos como parámetro de este script, obtenemos:

Two-argument "open" used at line 5, column 1. See page 207 of PBP.

Con este método, integrar el análisis de código en tu test suite es fácil.

Instalando perlcritic

Perlcritic viene en un paquete para la mayoría de las distribuciones/sistemas operativos:

Si prefieres usar la versión de módulo, solamente necesitarás instalar el módulo de Perl::Critic con tu método elegido (cpan, cpanm, carton, etc).

Alternativas a perlcritic

Perlcritic se usa ampliamente entre la comunidad Perl, pero no es la única herramienta disponible para este propósito. Dos alternativas más nuevas son Perl::Lint y B::Lint:

Conclusión

A medida que tu código base y tu equipo crezcan, la posibilidad de generar errores inadvertidamente también aumenta. Tener un perfil perlcritic básico utilizado por todos los programadores ayudará a evitar futuros dolores de cabeza y fallos de seguridad. Es fácil de configurar, se puede personalizar fácilmente y puede enseñarte funciones de Perl que desconocías. Es una buena práctica que vale la pena configurar para producir un código mejor y más seguro.

CAPSiDE tiene sus bases en el software de código abierto, especialmente Perl, y siempre hemos estado dispuestos a devolver a la comunidad. Participamos en conferencias y talleres de Perl, sea presentando, patrocinando, asistiendo, etc. y contribuyendo con el SDK de Perl para AWS y Azure. Si estás interesado en trabajar con Perl, ¡no te olvides de escribir a Hermes!

TAGS: Perl, Perl best practices, perl source code analiser, Perlcritic

speech-bubble-13-icon Created with Sketch.
Comentarios

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*
*