Perl Language Es.29 PDF
Perl Language Es.29 PDF
#perl
Tabla de contenido
Acerca de 1
Observaciones 2
Versiones 2
Examples 3
Capítulo 2: Aleatoriedad 5
Observaciones 5
Examples 5
Examples 7
Observaciones 12
Examples 12
Solicitud de GTK 12
Parámetros 13
Observaciones 13
Examples 13
Leyendo de un archivo 13
Escribir en un archivo 14
autodie permite trabajar con archivos sin tener que verificar explícitamente las fallas de 17
Capítulo 6: Bailarín 20
Introducción 20
Examples 20
Capítulo 7: Clasificación 21
Introducción 21
Sintaxis 21
Examples 21
Orden numérico 22
Orden inverso 22
La transformada de Schwartzian 22
Capítulo 8: Comandos Perl para Windows Excel con Win32 :: módulo OLE 24
Introducción 24
Sintaxis 24
Parámetros 24
Observaciones 24
Examples 25
3. Manipulación de células. 26
Examples 29
Comentarios multilínea 29
Capítulo 10: Compilar el módulo sapnwrfc de Perl cpan a partir del código fuente 30
Introducción 30
Observaciones 30
Examples 31
Observaciones 33
Examples 33
Doble cita 33
Heredocs 35
Examples 37
Condicionales 37
Declaraciones If-else 37
Bucles 37
Examples 39
Examples 40
parse_line () 40
NOTAS 40
Examples 45
Cuerdas a juego 45
Examples 48
Examples 50
Formato de fecha 50
Introducción 51
Examples 51
Linux 51
OS X 51
Windows 52
Examples 53
Ejecute Perl CPAN en su terminal (Mac y Linux) o en el símbolo del sistema (Windows) 53
Línea de comando 53
Shell interactivo 53
Parámetros 56
Examples 56
Módulo DBI 56
Examples 58
Interpolación básica 58
Lo que se interpola 58
Examples 61
La forma manual 61
Camino :: Diminuto 61
Archivo :: Slurper 62
Archivo :: Slurp 62
Examples 64
Examples 68
eval y muere 68
Examples 70
Instalación 70
Uso básico 70
Políticas de visualización 71
Ignorando el código 72
Conclusión 73
Examples 75
Examples 77
Creando objetos 77
Definiendo clases 77
Roles 83
Sintaxis 85
Examples 85
Usando un modulo 86
CPAN.pm 87
Examples 89
Examples 92
Introducción 94
Observaciones 94
Examples 94
Fuente ~/.bashrc : 95
Examples 96
Muestra de datos 98
Observaciones 100
Examples 100
Los argumentos de subrutina se pasan por referencia (excepto los de las firmas) 101
Subrutinas 102
Examples 104
Examples 105
Use perldoc para verificar la ruta de instalación del paquete Perl 105
Observaciones 106
Examples 108
E / S estándar 110
E / S estándar 111
Examples 115
Escalares 115
Arrays 116
Hashes 117
Sigilos 124
Observaciones 127
Examples 127
Sintaxis 128
Observaciones 128
Los siguientes operadores se tratan normalmente para devolver un valor booleano en context 128
Examples 129
Creditos 130
Acerca de
You can share this PDF with anyone you feel could benefit from it, downloaded the latest version
from: perl-language
It is an unofficial and free Perl Language ebook created for educational purposes. All the content
is extracted from Stack Overflow Documentation, which is written by many hardworking individuals
at Stack Overflow. It is neither affiliated with Stack Overflow nor official Perl Language.
The content is released under Creative Commons BY-SA, and the list of contributors to each
chapter are provided in the credits section at the end of this book. Images may be copyright of
their respective owners unless otherwise specified. All trademarks and registered trademarks are
the property of their respective company owners.
Use the content presented in this book at your own risk; it is not guaranteed to be correct nor
accurate, please send your feedback and corrections to [email protected]
https://riptutorial.com/es/home 1
Capítulo 1: Empezando con Perl Language
Observaciones
Perl es el camello de las lenguas: útil, pero no siempre bello. Tiene una buena documentación
propia a la que se puede acceder usando el comando perldoc desde su shell / comando. También
está disponible en línea en perldoc.perl.org .
Versiones
1.000 1987-12-18
2.000 1988-06-05
3.000 1989-10-18
4.000 1991-03-21
5.000 1994-10-17
5.001 1995-05-13
5.002 1996-02-29
5.003 1996-06-25
perl581delta ,
perl582delta ,
perl583delta ,
perl584delta ,
5.8.8 2006-02-01
perl585delta ,
perl586delta ,
perl587delta ,
Perl588delta
https://riptutorial.com/es/home 2
Versión Notas de lanzamiento Fecha de lanzamiento
Examples
Empezando con Perl
Los dos bits difíciles son el punto y coma al final de la línea y el \n , que agrega una nueva línea
(avance de línea). Si tiene una versión relativamente nueva de perl, puede usar say lugar de print
para que el retorno de carro se agregue automáticamente:
5.10.0
La función say también se habilita automáticamente con una use v5.10 (o superior):
use v5.10;
say "Hello World";
https://riptutorial.com/es/home 3
5.10.0
Por supuesto, también puede guardar el script en un archivo. Simplemente elimine la opción de
línea de comando -e y use el nombre de archivo del script: perl script.pl . Para programas más
largos que una línea, es aconsejable activar un par de opciones:
use strict;
use warnings;
No hay una desventaja real más que hacer el código un poco más largo. A cambio, el estricto
pragma le impide usar código potencialmente inseguro y las advertencias le notifican muchos
errores comunes.
Observe que el punto y coma de fin de línea es opcional para la última línea, pero es una buena
idea en caso de que luego agregue al final de su código.
Para obtener más opciones sobre cómo ejecutar Perl, vea perlrun o escriba perldoc perlrun en un
símbolo del sistema. Para obtener una introducción más detallada de Perl, vea perlintro o escriba
perldoc perlintro en el símbolo del sistema. Para un tutorial interactivo peculiar, prueba Perl .
https://riptutorial.com/es/home 4
Capítulo 2: Aleatoriedad
Observaciones
Documentación para la función rand () de perl: http://perldoc.perl.org/functions/rand.html
Examples
Generar un número aleatorio entre 0 y 100.
Entrada:
my $upper_limit = 100;
my $random = rand($upper_limit);
Salida:
45.8733038119139
Entrada:
my $range = 10;
Salida:
https://riptutorial.com/es/home 5
my @letters = ( 'a' .. 'z' ); # English ascii-bet
Cómo funciona
• rand EXPR espera un valor escalar, por lo que @letters se evalúa en un contexto escalar
• Una matriz en contexto escalar devuelve el número de elementos que contiene (26 en este
caso)
• rand 26 devuelve un número fraccionario aleatorio en el intervalo 0 ≤ VALUE < 26 . (Nunca
puede ser 26 )
• Los índices de matriz son siempre enteros, por lo que $letters[rand @letters] ≡ $letters[int
rand @letters]
• Las matrices de Perl están indexadas en cero, por lo que $array[rand @array] devuelve
$array[0] , $array[$#array] o un elemento intermedio
https://riptutorial.com/es/home 6
Capítulo 3: Análisis XML
Examples
Analizando con XML :: Twig
#!/usr/bin/env perl
use strict;
use warnings 'all';
use XML::Twig;
#we can use the 'root' method to find the root of the XML.
my $root = $twig->root;
#children can optionally take an element 'tag' - otherwise it just returns all of them.
foreach my $element ( $list->children ) {
#this combines quite well with `map` to e.g. do the same thing on multiple items
print "All IDs:\n", join ( "\n", map { $_ -> att('id') } $twig -> get_xpath('//item'));
#note how this also finds the item under 'summary', because of //
https://riptutorial.com/es/home 7
__DATA__
<?xml version="1.0" encoding="utf-8"?>
<root>
<title>some sample xml</title>
<first key="value" key2="value2">
<second>Some text</second>
</first>
<third>
<fourth key3="value">Text here too</fourth>
</third>
<list>
<item id="1">Item1</item>
<item id="2">Item2</item>
<item id="3">Item3</item>
<item id="66">Item66</item>
<item id="88">Item88</item>
<item id="100">Item100</item>
<item id="1000">Item1000</item>
<notanitem>Not an item at all really.</notanitem>
</list>
<summary>
<item id="no_id">Test</item>
</summary>
</root>
Con XML::Rabbit es posible consumir archivos XML fácilmente. Usted define de forma declarativa
y con una sintaxis de XPath lo que está buscando en XML y XML::Rabbit devolverá los objetos de
acuerdo con la definición dada.
Definición:
package Bookstore;
use XML::Rabbit::Root;
has_xpath_object_list books => './book' => 'Bookstore::Book';
finalize_class();
package Bookstore::Book;
use XML::Rabbit;
has_xpath_value bookid => './@id';
has_xpath_value author => './author';
has_xpath_value title => './title';
has_xpath_value genre => './genre';
has_xpath_value price => './price';
has_xpath_value publish_date => './publish_date';
has_xpath_value description => './description';
has_xpath_object purchase_data => './purchase_data' => 'Bookstore::Purchase';
finalize_class();
package Bookstore::Purchase;
use XML::Rabbit;
has_xpath_value price => './price';
has_xpath_value date => './date';
finalize_class();
https://riptutorial.com/es/home 8
Consumo de XML:
use strict;
use warnings;
use utf8;
package Library;
use feature qw(say);
use Carp;
use autodie;
Notas:
1. La primera clase debe ser XML::Rabbit::Root . Te colocará dentro de la etiqueta principal del
documento XML. En nuestro caso nos colocará dentro de <catalog>
2. Clases anidadas que son opcionales. Es necesario acceder a esas clases a través de un
bloque try / catch (o eval / $@ check). Los campos opcionales simplemente devolverán null
. Por ejemplo, para purchase_data el bucle sería:
sample.xml
<?xml version="1.0"?>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications
with XML.</description>
</book>
<book id="bk102">
https://riptutorial.com/es/home 9
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2000-12-16</publish_date>
<description>A former architect battles corporate zombies,
an evil sorceress, and her own childhood to become queen
of the world.</description>
</book>
<book id="bk103">
<author>Corets, Eva</author>
<title>Maeve Ascendant</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2000-11-17</publish_date>
<description>After the collapse of a nanotechnology
society in England, the young survivors lay the
foundation for a new society.</description>
</book>
<book id="bk104">
<author>Corets, Eva</author>
<title>Oberon's Legacy</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2001-03-10</publish_date>
<description>In post-apocalypse England, the mysterious
agent known only as Oberon helps to create a new life
for the inhabitants of London. Sequel to Maeve
Ascendant.</description>
<purchase_data>
<date>2001-12-21</date>
<price>20</price>
</purchase_data>
</book>
</catalog>
https://riptutorial.com/es/home 10
my $root = $dom->getDocumentElement;
if(defined $title) {
# Get the first matched node out of the nodeList
my $node = $title->get_node(1);
if(defined $match) {
# Get the first matched node out of the nodeList
my $node = $match->get_node(1);
https://riptutorial.com/es/home 11
Capítulo 4: Aplicaciones GUI en Perl
Observaciones
Tk es uno de los kits de herramientas GUI más utilizados para Perl. Otros kits de herramientas
comunes son GTK + 2 y 3, WxWidgets y widgets Win32. Menos comúnmente utilizados son Qt4,
XUL, Prima y FLTK.
Tk, GTK + 3, Wx, Win32, Prima, FLTK y XUL se actualizan activamente. Qt4 y GTK + 2 ya no se
desarrollan activamente, pero pueden tener versiones de mantenimiento.
Examples
Solicitud de GTK
use strict;
use warnings;
my $window = Gtk2::Window->new();
$window->show();
Gtk2->main();
0;
https://riptutorial.com/es/home 12
Capítulo 5: Archivo I / O (lectura y escritura
de archivos)
Parámetros
Modo Explicacion
Observaciones
chomp se utiliza a menudo cuando se lee de un archivo. Por defecto, recorta el carácter de nueva
línea, aunque para su funcionalidad completa, refiérase a los perldocs .
Tenga cuidado con la diferencia entre caracteres y bytes: no todas las codificaciones,
especialmente UTF-8, utilizan caracteres de 1 byte. Si bien esto se maneja de manera casi
perfecta por PerlIO, hay un posible escollo:
Así que no uses aritmética basada en estos valores mixtos. En su lugar, use, por ejemplo,
Encode::encode('utf8',$value_by_read) para obtener los octetos (bytes) de un resultado de read ,
cuya cuenta puede usar con tell y seek .
Examples
Leyendo de un archivo
my $filename = '/path/to/file';
https://riptutorial.com/es/home 13
open my $fh, '<', $filename or die "Failed to open file: $filename";
# You can then either read the file one line at a time...
while(chomp(my $line = <$fh>)) {
print $line . "\n";
}
Otra forma más rápida de leer un archivo es usar File :: Slurper Module. Esto es útil si trabajas
con muchos archivos.
use File::Slurper;
my $file = read_text("path/to/file"); # utf8 without CRLF transforms by default
print $file; #Contains the file body
Escribir en un archivo
Este código abre un archivo para escribir. Devuelve un error si no se pudo abrir el archivo.
También cierra el archivo al final.
#!/usr/bin/perl
use strict;
use warnings;
use open qw( :encoding(UTF-8) :std ); # Make UTF-8 default encoding
# Open "output.txt" for writing (">") and from now on, refer to it as the variable $fh.
open(my $fh, ">", "output.txt")
# In case the action failed, print error message and quit.
or die "Can't open > output.txt: $!";
Ahora tenemos un archivo abierto listo para la escritura que se accede a través de $fh (esta
variable se denomina gestor de archivo). A continuación podemos dirigir la salida a ese archivo
usando el operador de print :
https://riptutorial.com/es/home 14
El operador open tiene una variable escalar ( $fh en este caso) como su primer parámetro. Como
se define en el operador open , se trata como un identificador de archivo . El segundo parámetro
">" (mayor que) define que el archivo está abierto para escritura. El último parámetro es la ruta
del archivo para escribir los datos.
Para escribir los datos en el archivo, el operador de print se utiliza junto con el identificador de
archivo. Observe que en el operador de print no hay una coma entre el identificador de archivo y
la declaración en sí, solo el espacio en blanco.
Este es el lenguaje básico para el archivo IO "predeterminado" y hace que $filehandle archivo sea
un flujo de entrada legible de bytes , filtrado por un decodificador predeterminado específico del
sistema, que puede configurarse localmente con el pragma open
Perl en sí no maneja los errores en la apertura del archivo, por lo que debe manejarlos usted
mismo al verificar la condición de salida de open . $! se rellena con el mensaje de error que hizo
que la apertura falle.
Esto especifica que Perl no debe realizar una traducción de CRLF en Windows.
Esto especifica que Perl debe evitar la traducción de CRLF y luego decodificar los bytes resultantes
en cadenas de caracteres (implementados internamente como matrices de enteros que pueden
exceder de 255), en lugar de cadenas de bytes
https://riptutorial.com/es/home 15
Leer y escribir en un archivo.
Antes de leer y escribir archivos de texto, debe saber qué codificación utilizar. Consulte la
documentación de Perl Unicode para obtener más detalles sobre la codificación . Aquí mostramos
la configuración de UTF-8 como la codificación y decodificación predeterminadas para la función
open . Esto se hace usando el pragma open cerca de la parte superior de su código (justo después
de su use strict; y use warnings; sería apropiado):
use strict;
use warnings;
use open qw( :encoding(UTF-8) :std );
La función open crea un identificador de archivo que se utiliza para leer y / o escribir en un archivo.
La función open tiene la firma.
open(FILEHANDLE, MODE, FILEPATH) y devuelve un valor falso si la operación falla. La descripción del
error se almacena en $! .
Leyendo
#!/usr/bin/perl
use strict;
use warnings;
use open qw( :encoding(UTF-8) :std ); # Make UTF-8 default encoding
my $file_path = "/path/to/file";
open(my $file_handle, '<', $file_path) or die "Could not open file! $!";
close $file_handle
or warn "Close failed!";
Escritura
#!/usr/bin/perl
use strict;
use warnings;
use open qw( :encoding(UTF-8) :std ); # Make UTF-8 default encoding
my $file_path = "/path/to/file";
open(my $file_handle, '>', $file_path) or die "Could not open file! $!";
close $file_handle
or warn "Close failed!";
Lectura de trozos
Abrir y leer archivos grandes puede llevar tiempo y recursos. Si solo se requiere una pequeña
https://riptutorial.com/es/home 16
parte del contenido, puede ser una buena idea leer el contenido en fragmentos utilizando la
función de read que tiene la firma
FILEHANDLE debe ser un identificador de archivo abierto, SCALAR mantendrá los datos de lectura
después de la operación. LENGTH especifica el número de caracteres que se leerán a partir de la
OFFSET . La función devuelve el número de caracteres leídos, 0 si se alcanzó el final del archivo y
undef en caso de error.
Aquí hay un ejemplo en el que todas las líneas de un archivo se leen y luego se escriben al final
de un archivo de registro.
use 5.010; # 5.010 and later enable "say", which prints arguments, then a newline
use strict; # require declaring variables (avoid silent errors due to typos)
use warnings; # enable helpful syntax-related warnings
use open qw( :encoding(UTF-8) :std ); # Make UTF-8 default encoding
use autodie; # Automatically handle errors in opening and closing files
while (my $line = readline $fh_in) # also works: while (my $line = <$fh_in>)
{
# remove newline
chomp $line;
Por cierto, técnicamente siempre debe verificar print declaraciones de print . Muchas personas
no lo hacen, pero perl (el intérprete de Perl) no lo hace automáticamente y tampoco lo hace el
https://riptutorial.com/es/home 17
autodie .
# identify current position in file, in case the first line isn't a comment
my $current_pos = tell;
# Step back a line so that it can be processed later as the first data line
seek $fh, $current_pos, 0;
use strict;
use warnings;
use open qw( :encoding(UTF-8) :std ); # Make UTF-8 default encoding
use IO::Compress::Gzip;
my $fh_out = IO::Compress::Gzip->new("hello.txt.gz");
close $fh_out;
use IO::Compress::Gzip;
https://riptutorial.com/es/home 18
#!/bin/env perl
use strict;
use warnings;
use open qw( :encoding(UTF-8) :std ); # Make UTF-8 default encoding
use IO::Uncompress::Gunzip;
my $fh_in = IO::Uncompress::Gunzip->new("hello.txt.gz");
print $line;
Este pragma cambia el modo predeterminado de lectura y escritura de texto (archivos, entrada
estándar, salida estándar y error estándar) a UTF-8, que suele ser lo que desea al escribir nuevas
aplicaciones.
ASCII es un subconjunto de UTF-8, por lo que no se espera que cause ningún problema con los
archivos ASCII heredados y le ayudará a protegerse contra la corrupción accidental de archivos
que puede ocurrir cuando se tratan archivos UTF-8 como ASCII.
Sin embargo, es importante que sepa cuál es la codificación de sus archivos con los que está
tratando y los maneje en consecuencia. ( Razones por las que no debemos ignorar Unicode ) .
Para un tratamiento más profundo de Unicode, consulte el tema Perl Unicode .
https://riptutorial.com/es/home 19
Capítulo 6: Bailarín
Introducción
Acerca de:
Dancer2 (el sucesor de Dancer) es un marco de aplicación web simple pero potente para Perl.
Características principales: ••• Dead Simple: sintaxis intuitiva, minimalista y muy expresiva. •••
Flexible: la compatibilidad con PSGI, los complementos y el diseño modular permiten una gran
escalabilidad. ••• Pocas dependencias: Dancer depende de la menor cantidad posible de módulos
CPAN, lo que facilita su instalación.
Examples
Ejemplo mas facil
#!/usr/bin/env perl
use Dancer2;
dance;
https://riptutorial.com/es/home 20
Capítulo 7: Clasificación
Introducción
Para ordenar las listas de cosas, Perl tiene una sola función, como es lógico que se llame sort .
Es lo suficientemente flexible como para ordenar todo tipo de elementos: números, cadenas en
cualquier número de codificaciones, estructuras de datos anidadas u objetos. Sin embargo,
debido a su flexibilidad, hay bastantes trucos e idiomas que aprender para su uso.
Sintaxis
• ordenar la LISTA DE NOMBRES
• ordenar la lista de bloqueo
• Lista Ordenada
Examples
Ordenación léxica básica
Los tres ejemplos anteriores hacen exactamente lo mismo. Si no proporciona ninguna función o
bloque de comparador, la sort asume que desea que la lista esté ordenada de forma léxica. Esta
suele ser la forma que desea si solo necesita sus datos en un orden predecible y no le importa la
corrección lingüística.
sort pasa pares de elementos en @list a la función de comparación, que le dice a sort qué
elemento es más grande. El operador cmp hace esto para cadenas mientras que <=> hace lo
mismo para los números. El comparador se llama con bastante frecuencia, en promedio n * log ( n
) veces, siendo n el número de elementos a clasificar, por lo que es importante que sea rápido.
Esta es la razón por la que la sort usa variables globales predefinidas del paquete ( $a $b ) para
pasar los elementos que se compararán con el bloque o función, en lugar de los parámetros de
función adecuados.
https://riptutorial.com/es/home 21
Orden numérico
Orden inverso
La transformada de Schwartzian
Este es probablemente el ejemplo más famoso de una optimización de ordenación que utiliza las
funciones de programación funcional de Perl, para usarse donde el orden de los elementos
depende de una función costosa.
El problema con el primer ejemplo es que el comparador se llama muy a menudo y sigue
recalculando los valores usando una función lenta una y otra vez. Un ejemplo típico sería ordenar
los nombres de los archivos por su tamaño de archivo:
use File::stat;
@sorted = sort { stat($a)->size <=> stat($b)->size } glob "*";
Esto funciona, pero en el mejor de los casos incurre en la sobrecarga de dos llamadas al sistema
por comparación, en el peor, tiene que ir al disco dos veces para cada comparación y ese disco
puede estar en un servidor de archivos sobrecargado en el otro lado del planeta.
https://riptutorial.com/es/home 22
acceder a la clave de clasificación mirando en la lista. Como no nos importan las claves de
clasificación, sino que solo necesitamos los elementos originales en orden, el map final elimina las
listas de dos elementos de la lista ya ordenada que recibe de @sort y devuelve una lista de solo
sus primeros miembros .
La técnica tradicional para hacer sort ignorar caso es pasar cadenas a lc o uc para la
comparación:
Esto funciona en todas las versiones de Perl 5 y es completamente suficiente para el inglés; No
importa si usas uc o lc . Sin embargo, presenta un problema para idiomas como el griego o el
turco, donde no hay correspondencia 1: 1 entre las letras mayúsculas y minúsculas, por lo que
obtiene diferentes resultados dependiendo de si usa uc o lc . Por lo tanto, Perl 5.16 y superior
tienen una función de plegado de caja llamada fc que evita este problema, por lo que la
clasificación multilingüe moderna debería usar esto:
https://riptutorial.com/es/home 23
Capítulo 8: Comandos Perl para Windows
Excel con Win32 :: módulo OLE
Introducción
Estos ejemplos presentan los comandos más utilizados de Perl para manipular Excel a través del
módulo Win32 :: OLE.
Sintaxis
• $ Hoja-> Rango ( Celda1 , [ Celda2 ]) #Seleccione una celda o un rango de celdas
• $ Del tipo de hoja> Celdas (rowIndex, columnIndex) #Seleccione una célula por índice de
fila y columna
Parámetros
Parámetros Detalles
El nombre del rango. Esta debe ser una referencia de estilo A1 en el idioma
Celda 1
de la macro. Puede incluir el operador de rango (dos puntos), el operador
(requerido)
de intersección (un espacio) o el operador de unión (una coma).
Observaciones
Enlace para obtener información sobre Colors en Excel:
http://dmcritchie.mvps.org/excel/colors.htm
https://riptutorial.com/es/home 24
Enlace para obtener información sobre las constantes de Excel: http://msdn.microsoft.com/en-
us/library/aa221100%28office.11%29.aspx
Examples
1. Abrir y guardar Excel / Workbooks
#Modules to use
use Cwd 'abs_path';
use Win32::OLE;
use Win32::OLE qw(in with);
use Win32::OLE::Const "Microsoft Excel";
$Win32::OLE::Warn = 3;
https://riptutorial.com/es/home 25
|| Win32::OLE->new('Excel.Application', 'Quit');
#Freeze Pane
$Excel -> ActiveWindow -> {FreezePanes} = "True";
#Delete Sheet
$Sheet -> Delete;
3. Manipulación de células.
https://riptutorial.com/es/home 26
#Edit the format of the text (font)
$Sheet->Range("G7:H7")->Font->{Bold} = "True";
$Sheet->Range("G7:H7")->Font->{Italic} = "True";
$Sheet->Range("G7:H7")->Font->{Underline} = xlUnderlineStyleSingle;
$Sheet->Range("G7:H7")->Font->{Size} = 8;
$Sheet->Range("G7:H7")->Font->{Name} = "Arial";
$Sheet->Range("G7:H7")->Font->{ColorIndex} = 4;
#Align text
$Sheet -> Range("G7:H7") -> {HorizontalAlignment} = xlHAlignCenter; # Center
text;
$Sheet -> Range("A1:A2") -> {Orientation} = 90; # Rotate
text
#Activate Cell
$Sheet -> Range("A2") -> Activate;
$Sheet->Hyperlinks->Add({
Anchor => $range, #Range of cells with the hyperlink; e.g. $Sheet->Range("A1")
Address => $adr, #File path, http address, etc.
TextToDisplay => $txt, #Text in the cell
ScreenTip => $tip, #Tip while hovering the mouse over the hyperlink
});
NB: para recuperar la lista de hipervínculos, eche un vistazo a la siguiente publicación Obtención
de la lista de hipervínculos de una hoja de cálculo de Excel con Perl Win32 :: OLE
#Delete a row
$Sheet->Rows("22:22")->Delete();
https://riptutorial.com/es/home 27
my $last_col = $Sheet -> UsedRange -> Find({What => "*", SearchDirection => xlPrevious,
SearchOrder => xlByColumns}) -> {Column};
Lea Comandos Perl para Windows Excel con Win32 :: módulo OLE en línea:
https://riptutorial.com/es/perl/topic/3420/comandos-perl-para-windows-excel-con-win32----modulo-
ole
https://riptutorial.com/es/home 28
Capítulo 9: Comentarios
Examples
Comentarios de una sola línea
Los comentarios de una sola línea comienzan con un signo de # y van al final de la línea:
# This is a comment
Comentarios multilínea
Los comentarios de varias líneas comienzan con = y con la instrucción =cut . Estos son
comentarios especiales llamados POD (Documentación antigua simple).
=begin comment
=end comment
=cut
https://riptutorial.com/es/home 29
Capítulo 10: Compilar el módulo sapnwrfc de
Perl cpan a partir del código fuente
Introducción
Me gustaría describir los requisitos previos y los pasos de cómo construir el módulo Perl CPAN
sapnwrfc con el entorno de Strawberry Perl en Windows 7 x64. Debería funcionar también para
todas las versiones posteriores de Windows como 8, 8.1 y 10.
Uso Strawberry Perl 5.24.1.1 de 64 bits, pero también debería funcionar con versiones anteriores.
Me tomó algo de tiempo para tener éxito con varios intentos (instalación de Perl, SAP NW RFC
SDK de 32 vs. 64 bits, compilador de MinGW vs. Microsoft C). Así que espero que algunos se
beneficien de mis hallazgos.
Observaciones
Instale un paquete actual de Strawberry Perl de 64 bits desde http://strawberryperl.com . En mi
caso fue 5.24.1.1.
Puede encontrarlo con la siguiente traza: Paquetes de soporte y parches => Por categoría =>
Componentes adicionales => SDK SAP NW RFC => SDK 7.20 SAP NW RFC
Cree archivos .def y .a para el compilador / enlazador MinGW con los siguientes comandos en el
directorio C: \ nwrfcsdk_x64:
gendef *.dll
dlltool --dllname icuin34.dll --def icuin34.def --output-lib icuin34.a
dlltool --dllname icudt34.dll --def icudt34.def --output-lib icudt34.a
dlltool --dllname icuuc34.dll --def icuuc34.def --output-lib icuuc34.a
dlltool --dllname libsapucum.dll --def libsapucum.def --output-lib libsapucum.a
dlltool --dllname libicudecnumber.dll --def libicudecnumber.def --output-lib libicudecnumber.a
dlltool --dllname sapnwrfc.dll --def sapnwrfc.def --output-lib sapnwrfc.a
icudt34.a
icudt34.def
https://riptutorial.com/es/home 30
icudt34.dll
icuin34.a
icuin34.def
icuin34.dll
icuuc34.a
icuuc34.def
icuuc34.dll
libicudecnumber.a
libicudecnumber.def
libicudecnumber.dll
libsapucum.a
libsapucum.def
libsapucum.dll
libsapucum.lib
sapdecfICUlib.lib
sapnwrfc.a
sapnwrfc.def
sapnwrfc.dll
sapnwrfc.lib
Inicie el comando get sapnwrfc para descargar el módulo Perl sapnwrfc desde CPAN.
Construye los Makefile (s) con el siguiente comando. Adapte los nombres de las carpetas de
acuerdo a su configuración.
Ejecute los comandos dmake y dmake install para compilar e instalar el módulo.
Examples
Ejemplo simple para probar la conexión RFC.
use strict;
use warnings;
use utf8;
use sapnwrfc;
SAPNW::Rfc->load_config('sap.yml');
my $conn = SAPNW::Rfc->rfc_connect;
my $rd = $conn->function_lookup("RPY_PROGRAM_READ");
my $rc = $rd->create_function_call;
$rc->PROGRAM_NAME("SAPLGRFC");
https://riptutorial.com/es/home 31
eval {
$rc->invoke;
};
if ($@) {
die "RFC Error: $@\n";
}
Lea Compilar el módulo sapnwrfc de Perl cpan a partir del código fuente en línea:
https://riptutorial.com/es/perl/topic/9775/compilar-el-modulo-sapnwrfc-de-perl-cpan-a-partir-del-
codigo-fuente
https://riptutorial.com/es/home 32
Capítulo 11: Cuerdas y métodos de citar.
Observaciones
La sintaxis de la versión no nos permite proteger las versiones que aún no existen, por lo que este
es un recordatorio para que alguien pueda volver atrás y editarlas una vez que llegue (RE: Perl
5.26). Los guardias de la versión necesitan tener una clasificación "futura" para las características
tentativas que podrían estar disponibles para las personas lo suficientemente valientes como para
realizar una comprobación de la fuente.
Examples
Cotizaciones literales de cuerdas
print 'This literal contains a \'postraphe '; # emits the ' but not its preceding \
print q/This is is a literal \' <-- 2 characters /; # prints both \ and '
print q^This is is a literal \' <-- 2 characters ^; # also
Doble cita
my $greeting = "Hello!\n";
print $greeting;
# => Hello! (followed by a linefeed)
El qq es útil aquí, para evitar tener que escapar de las comillas. Sin él, tendríamos que escribir ...
https://riptutorial.com/es/home 33
... lo que no es tan bonito.
Perl no lo limita a la utilización de una barra / con qq ; Puedes usar cualquier caracter (visible).
Por defecto, los valores están separados por espacios, porque la variable especial $"
predeterminada en un solo espacio. Esto, por supuesto, se puede cambiar.
Para algo más complejo que esto, debes usar un bucle en su lugar.
https://riptutorial.com/es/home 34
use feature 'say';
El llamado "operador de carro" hace que perl se elimine la referencia @{ ... } la referencia de la
matriz que contiene la [ ... ] expresión que desea interpolar, 2 + 2 . Cuando usas este truco,
Perl construye una matriz anónima, luego la desactualiza y la descarta.
La versión ${\( ... )} es algo menos desperdiciadora, pero aún requiere asignar memoria y es
aún más difícil de leer.
Heredocs
my $variable = <<'EOF';
this block of text is interpreted literally,
no \'quotes matter, they're just text
only the trailing left-aligned EOF matters.
EOF
NB: asegúrese de ignorar el resaltador de sintaxis de la pila de desbordamientos: está muy mal.
Pendiente en 5.26.0 * es una sintaxis "Heredoc con sangría" que recorta el relleno izquierdo para
usted
5.26.0
my $variable = <<~"MuchNicer";
this block of text is interpreted.
quotes\nare interpreted, and $interpolations
get interpolated...
but still, left-aligned "I Want it to End" matters.
MuchNicer
https://riptutorial.com/es/home 35
La función chomp eliminará un carácter de nueva línea, si está presente, de cada escalar que se le
pasa. chomp mutará la cadena original y devolverá el número de caracteres eliminados
Pero por lo general, a nadie le preocupa la cantidad de nuevas líneas que se eliminaron, por lo
que chomp generalmente se ve en un contexto vacío, y generalmente debido a que se leyeron las
líneas de un archivo:
https://riptutorial.com/es/home 36
Capítulo 12: Declaraciones de control
Examples
Condicionales
Perl admite muchos tipos de sentencias condicionales (sentencias que se basan en resultados
booleanos). Las declaraciones condicionales más comunes son if-else, menos, y declaraciones
ternarias. given declaraciones given se introducen como una construcción similar a un interruptor
de lenguajes derivados de C y están disponibles en las versiones Perl 5.10 y superiores.
Declaraciones If-else
if (EXPR) BLOCK
if (EXPR) BLOCK else BLOCK
if (EXPR) BLOCK elsif (EXPR) BLOCK ...
if (EXPR) BLOCK elsif (EXPR) BLOCK ... else BLOCK
Para las sentencias if simples, el if puede preceder o suceder al código que se ejecutará.
$number = 7;
if ($number > 4) { print "$number is greater than four!"; }
Bucles
Perl admite muchos tipos de construcciones de bucle: for / foreach, while / do-while y hasta.
@numbers = 1..42;
for (my $i=0; $i <= $#numbers; $i++) {
print "$numbers[$i]\n";
}
El bucle while evalúa el condicional antes de ejecutar el bloque asociado. Entonces, a veces el
bloque nunca se ejecuta. Por ejemplo, el siguiente código nunca se ejecutaría si el $fh fuera el
identificador de archivo para un archivo vacío, o si ya estaba agotado antes del condicional.
https://riptutorial.com/es/home 37
Los bucles do / while y do / until , por otro lado, evalúan el condicional después de cada vez que
se ejecuta el bloqueo. Por lo tanto, un bucle do / while o do / until siempre se ejecuta al menos
una vez.
my $greeting_count = 0;
do {
say "Hello";
$greeting_count++;
} until ( $greeting_count > 1)
# Hello
# Hello
https://riptutorial.com/es/home 38
Capítulo 13: Depuración de scripts Perl
Examples
Ejecutar script en modo de depuración
Para ejecutar el script en modo de depuración, debe agregar la opción -d en la línea de comando:
$perl -d script.pl
$perl -d:MOD script.pl ejecuta el programa bajo el control de un módulo de depuración, creación
de perfiles o seguimiento instalado como Devel::MOD .
Módulos recomendados:
https://riptutorial.com/es/home 39
Capítulo 14: Dividir una cadena en
separadores sin comillas
Examples
parse_line ()
use 5.010;
use Text::ParseWords;
Salida:
use Text::CSV; # Can use Text::CSV which will switch to _XS if installed
$sep_char = ",";
my $csv = Text::CSV->new({sep_char => $sep_char});
my $line = q{"a quoted, comma", word1, word2};
$csv->parse($line);
my @fields = $csv->fields();
print join("\n", @fields)."\n";
Salida:
a quoted, comma
word1
word2
NOTAS
• De forma predeterminada, Text :: CSV no elimina los espacios en blanco alrededor del
carácter separador, como lo hace Text::ParseWords . Sin embargo, al agregar
allow_whitespace=>1 a los atributos del constructor se logra ese efecto.
https://riptutorial.com/es/home 40
Salida:
a quoted, comma
word1
word2
https://riptutorial.com/es/home 41
Capítulo 15: Empacar y desempacar
Examples
Conversión manual de estructuras C para empaquetar sintaxis
Si alguna vez está tratando con API Binary B desde Perl Code, a través de las syscall , ioctl o
fcntl , necesita saber cómo construir memoria de una manera compatible con C.
Por ejemplo, si alguna vez estuvo tratando con alguna función que esperaba una timespec ,
buscaría en /usr/include/time.h y encontraría:
struct timespec
{
__time_t tv_sec; /* Seconds. */
__syscall_slong_t tv_nsec; /* Nanoseconds. */
};
Y toma 8 bytes. Así que 64bit firmó int. Y estoy en un procesador de 64 bits. =)
sub packtime {
my ( $config ) = @_;
return pack 'qq', @{$config}{qw( tv_sec tv_nsec )};
}
sub unpacktime {
my ( $buf ) = @_;
https://riptutorial.com/es/home 42
my $out = {};
@{$out}{qw( tv_sec tv_nsec )} = unpack 'qq', $buf;
return $out;
}
later ...
syscall( ..., $timespec ); # some syscall that writes timespec
print Dumper( unpacktime( $timespec ));
A veces hay que tratar con estructuras definidas en términos de tipos de datos C de Perl. Una de
esas aplicaciones es la creación de paquetes de red sin procesar, en caso de que quiera hacer
algo más sofisticado que lo que ofrece la API de socket normal. Esto es justo para lo que está
disponible pack() (y unpack() por supuesto).
Suponiendo que tenemos las siguientes variables para incluir en nuestro encabezado:
Podríamos probar y usar operaciones de bits para construir, por ejemplo, los primeros 32 bits:
Este enfoque sólo funciona hasta el tamaño de un entero sin embargo, que suele ser de 64 bits,
pero puede ser tan bajo como 32. Peor aún, depende de la CPU endianness por lo que funciona
en algunas CPUs y dejar a los demás. Probemos pack() :
https://riptutorial.com/es/home 43
my $hdr = pack('H2B8n', '45', sprintf("%06b%02b", $dscp, $ecn), $length);
La plantilla primero especifica H2 , una cadena hexadecimal de 2 caracteres, primero nybble alto .
El argumento correspondiente al paquete es "45": versión 4, longitud 5. La siguiente plantilla es B8
, una cadena de bits de 8 bits, orden de bits descendente dentro de cada byte . Necesitamos usar
cadenas de bits para controlar el diseño a trozos más pequeños que un nybble (4 bits), por lo que
el sprintf() se utiliza para construir una cadena de bits de 6 bits desde $dscp y 2 desde $ecn . El
último es n , un valor sin signo de 16 bits en Orden de bytes de red , es decir, siempre big-endian
sin importar cuál sea el formato de entero nativo de su CPU, y se llena desde $length .
Esos son los primeros 32 bits del encabezado. El resto se puede construir de manera similar:
n $id
sprintf("%03b%013b",
B16
$flags, $frag_off) Igual que DSCP / ECN
my $hdr = pack('H2B8n2B16C2nN2',
'45', sprintf("%06b%02b", $dscp, $ecn), $length,
$id, sprintf("%03b%013b", $flags, $frag_off),
$ttl, $proto, 0,
$src_ip, $dst_ip
);
https://riptutorial.com/es/home 44
Capítulo 16: Expresiones regulares
Examples
Cuerdas a juego
El operador =~ intenta hacer coincidir una expresión regular (separada por / ) con una cadena:
/^hello/ es la expresión regular real. ^ Es un carácter especial que le dice a la expresión regular
que comience con el principio de la cadena y que no coincida en el medio en algún lugar. Luego,
la expresión regular trata de encontrar las siguientes letras en orden h , e , l , l y o .
Las expresiones regulares intentan coincidir con la variable predeterminada ( $_ ) si están vacías:
$_ = "hello world";
También puede usar diferentes delimitadores si precede la expresión regular con el operador m :
m~^hello~;
m{^hello};
m|^hello|;
#!/usr/bin/perl
my $str = "hello.it's.me";
my @test = (
"hello.it's.me",
"hello/it's!me",
);
my @match = (
[ general_match=> sub { ismatched /$str/ } ],
https://riptutorial.com/es/home 45
[ qe_match => sub { ismatched /\Q$str\E/ } ],
);
for (@test) {
print "\String = '$_':\n";
Salida
String = 'hello.it's.me':
- general_match: MATCHED!
- qe_match: MATCHED!
String = 'hello/it's!me':
- general_match: MATCHED!
- qe_match: DID NOT MATCH!
En general, no es una buena idea usar una expresión regular para analizar una estructura
compleja . Pero puede hacerse. Por ejemplo, es posible que desee cargar datos en la tabla de la
sección y los campos estén separados por comas, pero los tipos complejos como la matriz están
separados por una "|". Los archivos contienen registros con todos los campos separados por
comas y los tipos complejos están dentro de corchetes. En ese caso, este bit de Perl desechable
podría ser suficiente:
echo "1,2,[3,4,5],5,6,[7,8],[1,2,34],5" | \
perl -ne \
'while( /\[[^,\]]+\,.*\]/ ){
if( /\[([^\]\|]+)\]/){
$text = $1;
$text_to_replace = $text;
$text =~ s/\,/\|/g;
s/$text_to_replace/$text/;
}
} print'
https://riptutorial.com/es/home 46
the variable it's bound to
s/foo/bar/g; # replace all instances
https://riptutorial.com/es/home 47
Capítulo 17: Fechas y hora
Examples
Crear un nuevo DateTime
use DateTime;
$year = $dt->year;
$month = $dt->month;
$day = $dt->day;
$hour = $dt->hour;
$minute = $dt->minute;
$second = $dt->second;
my $dt1 = DateTime->new(
year => 2016,
month => 8,
day => 20,
https://riptutorial.com/es/home 48
);
my $dt2 = DateTime->new(
year => 2016,
month => 8,
day => 24,
);
my $duration = $dt2->subtract_datetime($dt1);
print $duration->days
my $start = time();
my $end = time();
https://riptutorial.com/es/home 49
Capítulo 18: Fechas y hora
Examples
Formato de fecha
use Time::Piece;
my $date = localtime->strftime('%m/%d/%Y');
print $date;
Output
07/26/2016
https://riptutorial.com/es/home 50
Capítulo 19: Instalacion de perl
Introducción
Voy a comenzar esto con el proceso en Ubuntu, luego en OS X y finalmente en Windows. No lo
he probado en todas las versiones de Perl, pero debería ser un proceso similar.
Quiero decir que este tutorial es sobre Perl en su versión de código abierto. Existen otras
versiones como activeperl que tienen ventajas y desventajas, que no forman parte de este
tutorial.
Examples
Linux
wget http://www.cpan.org/src/5.0/perl-version.tar.gz
tar -xzf perl-version.tar.gz
cd perl-version
./Configure -de
make
make test
make install
OS X
• Perlbrew
https://riptutorial.com/es/home 51
• Perlbrew con soporte de hilo:
Después de la instalación de Perlbrew, si desea instalar Perl con soporte para subprocesos,
simplemente ejecute:
• Desde la fuente:
Windows
• Como dijimos antes, vamos con la versión de código abierto. Para Windows puedes elegir
strawberry o DWIM . Aquí cubrimos la versión de strawberry , ya que DWIM se basa en ella. La
manera fácil aquí es instalar desde el ejecutable oficial .
https://riptutorial.com/es/home 52
Capítulo 20: Instalar módulos Perl a través de
CPAN
Examples
Ejecute Perl CPAN en su terminal (Mac y Linux) o en el símbolo del sistema
(Windows)
Línea de comando
Puede usar cpan para instalar módulos directamente desde la línea de comando:
Shell interactivo
También puedes ingresar un "shell" así:
cpan[1]>
Luego, puede instalar los módulos que desee con el comando easy install <module> .
Si no tiene permisos para instalar módulos perl, aún puede instalarlos manualmente, indicando
una ruta personalizada donde tenga permisos de escritura.
https://riptutorial.com/es/home 53
Publica, descarga y descomprime el archivo del módulo:
wget module.tar.gz
tar -xzf module.tar.gz
cd module
También debe incluir la ruta del módulo en la variable de entorno PERL5LIB para usarla en su
código:
export PERL5LIB=$HOME/perl
Uso
cpanm Data::Section
cpanm ("cpanminus") se esfuerza por ser menos detallado que cpan pero aún captura toda la
información de instalación en un archivo de registro en caso de que sea necesario. También
maneja muchas "preguntas interactivas" para usted, mientras que cpan no lo hace.
cpanm también es popular para instalar dependencias de un proyecto desde, por ejemplo, GitHub.
El uso típico es primero cd en la raíz del proyecto, luego ejecutar
cpanm --installdeps .
https://riptutorial.com/es/home 54
• MYMETA.json
• MYMETA.yml (si MYMETA.json falta)
instalacion cpanm
cpan App::cpanminus
Configuración de cpanm
No hay ningún archivo de configuración para cpanm . Más bien, se basa en las siguientes
variables de entorno para su configuración:
https://riptutorial.com/es/home 55
Capítulo 21: Interacción simple con la base
de datos a través del módulo DBI.
Parámetros
Columna Columna
$driver Controlador para DB, "Pg" para Postgresql y "mysql" para MySQL
Examples
Módulo DBI
Debe asegurarse de que el módulo DBI se haya instalado en su PC, luego siga los siguientes
pasos:
use DBI;
my $driver = "MyDriver";
my $database = "DB_name";
my $dsn = "DBI:$driver:dbname=$database";
my $userid = "your_user_ID";
my $password = "your_password";
my $tablename = "your_table";
4. Prepara tu consulta
https://riptutorial.com/es/home 56
Ex:
my $query = $dbh->prepare($my_query);
my $table_name = "table";
my $filter_value = 2;
5. Ejecuta tu consulta
$query->execute();
* Nota: Para evitar un ataque por inyección, debes usar marcadores de posición ? En lugar de
poner tu variable en la consulta.
Ejemplo: desea mostrar todos los datos de la "tabla" donde column1 = $ value1 y column2 = $
value2:
$query->execute($value1, $value2);
7. Terminar y desconectar DB
$sth->finish;
$dbh->disconnect();
Lea Interacción simple con la base de datos a través del módulo DBI. en línea:
https://riptutorial.com/es/perl/topic/5917/interaccion-simple-con-la-base-de-datos-a-traves-del-
modulo-dbi-
https://riptutorial.com/es/home 57
Capítulo 22: Interpolación en Perl
Examples
Interpolación básica
Interpolación significa que el intérprete de Perl sustituirá los valores de las variables por su
nombre y algunos símbolos (que son imposibles o difíciles de escribir directamente) por
secuencias especiales de caracteres (también se conoce como escape). La distinción más
importante es entre comillas simples y dobles: las comillas dobles interpolan la cadena encerrada,
pero las comillas simples no.
my $name = 'Paul';
my $age = 64;
print "My name is $name.\nI am $age.\n"; # My name is Paul.
# I am 64.
Pero:
Puede usar q{} (con cualquier delimitador) en lugar de comillas simples y qq{} lugar de comillas
dobles. Por ejemplo, q{I'm 64} permite usar un apóstrofe dentro de una cadena no interpolada (de
lo contrario terminaría la cadena).
Declaraciones:
haga lo mismo, pero en el primero no necesita escaparse de comillas dobles dentro de la cadena.
Si el nombre de su variable coincide con el texto que lo rodea, puede usar la sintaxis ${var} para
desambiguar:
my $decade = 80;
print "I like ${decade}s music!" # I like 80s music!
Lo que se interpola
my $name = 'Paul';
print "Hello, $name!\n"; # Hello, Paul!
https://riptutorial.com/es/home 58
my %map = (a => 125, b => 1080, c => 11);
print "$map{a}\n"; # 125
Las matrices pueden interpolarse como un todo, sus elementos están separados por espacios:
use constant {
PI => '3.1415926'
};
print "I like PI\n"; # I like PI
print "I like " . PI . "\n"; # I like 3.1415926
\t horizontal tab
\n newline
\r return
\f form feed
\b backspace
\a alarm (bell)
\e escape
La interpolación de \n depende del sistema en el que funciona el programa: producirá uno o más
caracteres de nueva línea de acuerdo con las convenciones actuales del sistema.
o nombres de Unicode:
Los caracteres con códigos de 0x00 a 0xFF en la codificación nativa se pueden abordar de una
forma más corta:
\x0a hexadecimal
https://riptutorial.com/es/home 59
\012 octal
\c@ chr(0)
\ca chr(1)
\cb chr(2)
...
\cz chr(26)
\c[ chr(27)
\c\ chr(28) # Cannot be used at the end of a string
# since backslash will interpolate the terminating quote
\c] chr(29)
\c^ chr(30)
\c_ chr(31)
\c? chr(127)
La interpretación de todas las secuencias de escape excepto para \N{...} puede depender de la
plataforma, ya que utilizan códigos dependientes de la plataforma y la codificación.
https://riptutorial.com/es/home 60
Capítulo 23: Leyendo el contenido de un
archivo en una variable
Examples
La forma manual
Después de abrir el archivo (lea man perlio si desea leer codificaciones de archivo específicas en
lugar de bytes sin procesar), el truco está en el bloque do : <$fh> , el identificador de archivo en un
operador de diamante, devuelve un solo registro del archivo . La variable "separador de registro
de entrada" $/ especifica qué es un "registro"; de forma predeterminada, se establece en un
carácter de nueva línea, por lo que "un registro" significa "una sola línea". Como $/ es una
variable global, local hace dos cosas: crea una copia local temporal de $/ que desaparecerá al
final del bloque y le otorga el valor (no-) undef (el "valor" que Perl da a variables sin inicializar).
Cuando el separador de registro de entrada tiene ese (no) valor, el operador de diamante
devolverá el archivo completo. (Considera que todo el archivo es una sola línea).
Usando do , incluso puede moverse manualmente abriendo un archivo. Para la lectura repetida de
archivos,
puede ser usado. Aquí, otra variable global ( @ARGV ) se localiza para simular el mismo proceso
utilizado al iniciar un script perl con parámetros. $/ sigue siendo undef , ya que la matriz que está
frente a él "come" todos los argumentos entrantes. A continuación, el operador Diamond <>
nuevamente entrega un registro definido por $/ (el archivo completo) y regresa del bloque do , que
a su vez regresa del sub.
El sub no tiene un manejo explícito de errores, lo cual es una mala práctica. Si se produce un
error al leer el archivo, recibirá undef como valor de retorno, en lugar de una cadena vacía de un
archivo vacío.
Otra desventaja del último código es el hecho de que no puede usar PerlIO para diferentes
codificaciones de archivos: siempre obtiene bytes sin procesar.
Camino :: Diminuto
Usar el idioma de The Manual Way varias veces en una secuencia de comandos pronto se vuelve
tedioso, por lo que es posible que desee probar un módulo.
https://riptutorial.com/es/home 61
use Path::Tiny;
my $contents = path($filename)->slurp;
Puede pasar una opción binmode si necesita control sobre las codificaciones de archivos, finales
de línea, etc. - vea man perlio :
también tiene muchas otras funciones para tratar con archivos, por lo que puede ser
Path::Tiny
una buena opción.
Archivo :: Slurper
Este es un módulo minimalista que solo absorbe archivos en variables, nada más.
read_text() toma dos parámetros opcionales para especificar la codificación del archivo y si los
finales de línea deben traducirse entre los estándares LF de Unixish o CRLF de DOSish:
Archivo :: Slurp
No lo uses Aunque ha existido durante mucho tiempo y sigue siendo el módulo que la mayoría de
los programadores sugerirán, está roto y no es probable que se solucione .
Cuando se evalúa en el contexto de la lista, el operador de diamante devuelve una lista que
consta de todas las líneas del archivo (en este caso, asignando el resultado a un contexto de lista
de suministros de matriz). El terminador de línea se conserva, y se puede eliminar mediante la
masticación:
https://riptutorial.com/es/home 62
perl -0777 -e 'my $file = <>; print length($file)' input.txt
Yendo más allá con el minimalismo, al especificar -n modificador hace que Perl lea
automáticamente cada línea (en nuestro caso, el archivo completo) en la variable $_ .
https://riptutorial.com/es/home 63
Capítulo 24: Liza
Examples
Array como lista
La matriz es uno de los tipos de variables básicas de Perl. Contiene una lista, que es una
secuencia ordenada de cero o más escalares. La matriz es la variable que contiene (y
proporciona acceso a) los datos de la lista, como se documenta en perldata .
my @foo = ( 4, 5, 6 );
join '-', ( 4, 5, 6 );
join '-', @foo;
Algunos operadores solo trabajan con matrices, ya que mutan la lista que contiene:
shift @array;
unshift @array, ( 1, 2, 3 );
pop @array;
push @array, ( 7, 8, 9 );
Las listas también se pueden asignar a las variables hash. Al crear una lista que se asignará a
una variable hash, se recomienda usar la coma grande => entre las claves y los valores para
mostrar su relación:
El => es realmente solo una coma especial que cita automáticamente el operando a su izquierda.
Entonces, podrías usar comas normales, pero la relación no es tan clara:
También puede usar cadenas entre comillas para el operando de la mano izquierda de la coma
grasa => , que es especialmente útil para las claves que contienen espacios.
https://riptutorial.com/es/home 64
Las listas se pueden pasar a subrutinas
Para pasar la lista a una subrutina, debe especificar el nombre de la subrutina y luego
proporcionarle la lista:
Internamente, Perl @_ alias para esos argumentos y los coloca en la matriz @_ que está disponible
dentro de la subrutina:
sub test_subroutine {
print $_[0]; # item1
print $_[1]; # item2
}
sub test_subroutine {
$_[0] += 2;
}
my $x = 7;
test_subroutine( $x );
print $x; # 9
Para evitar cambios inadvertidos de valores originales pasados a su subrutina, debe copiarlos:
sub test_subroutine {
my( $copy_arg1, $copy_arg2 ) = @_;
$copy_arg1 += 2;
}
my $x = 7;
test_subroutine $x; # in this case $copy_arg2 will have `undef` value
print $x; # 7
sub test_subroutine {
print scalar @_, ' argument(s) passed into subroutine';
}
my @x = ( 1, 2, 3 );
my @y = qw/ a b c /; # ( 'a', 'b', 'c' )
https://riptutorial.com/es/home 65
test_some_subroutine @x, 'hi', @y; # 7 argument(s) passed into subroutine
# @_ = ( 1, 2, 3, 'hi', 'a', 'b', 'c' ) # Done internally for this call
print "@y"; # d b c
sub foo {
my @list1 = ( 1, 2, 3 );
my @list2 = ( 4, 5 );
my @list = foo();
print @list; # 12345
Pero no es la forma recomendada de hacerlo a menos que sepa lo que está haciendo.
Si bien esto está bien cuando el resultado está en el contexto LISTA , en el contexto SCALAR las
cosas no están claras. Echemos un vistazo a la siguiente línea:
1. Debido a que foo() evaluó en el contexto SCALAR , esta lista ( @list1, @list2 ) también se
evaluó en el contexto SCALAR
2. En contexto SCALAR , LIST devuelve su último elemento. Aquí está @list2
3. De nuevo en el contexto SCALAR , array @list2 devuelve el número de sus elementos. Aquí
está el 2 .
En la mayoría de los casos, la estrategia correcta devolverá las referencias a las estructuras
de datos .
Así que en nuestro caso deberíamos hacer lo siguiente:
Luego, la persona que llama hace algo como esto para recibir los dos arrayrefs devueltos:
https://riptutorial.com/es/home 66
El arrayref para @foo es \@foo . Esto es útil si necesita pasar una matriz y otras cosas a una
subrutina. Pasar a @foo es como pasar múltiples escalares. Pero pasar \@foo es un solo escalar.
Dentro de la subrutina:
xyz(\@foo, 123);
...
sub xyz {
my ($arr, $etc) = @_;
print $arr->[0]; # using the first item in $arr. It is like $foo[0]
Se garantiza que los pares clave-valor van juntos. Las claves siempre están indexadas, los
valores son impares. No se garantiza que los pares clave-valor siempre se aplanen en el mismo
orden:
https://riptutorial.com/es/home 67
Capítulo 25: Manejo de excepciones
Examples
eval y muere
Esta es la forma integrada de lidiar con las "excepciones" sin depender de bibliotecas de terceros
como Try :: Tiny .
my $ret;
eval {
$ret = some_function_that_might_die();
1;
} or do {
my $eval_error = $@ || "Zombie error!";
handle_error($eval_error);
};
# use $ret
"Abusamos" del hecho de que die tiene un valor de retorno falso, y el valor de retorno del bloque
de código global es el valor de la última expresión en el bloque de código:
• si $ret se asigna con éxito, entonces el 1; expresión es lo último que sucede en el bloque de
código eval . El bloque de código eval tiene un valor verdadero, por lo que el bloque or do no
se ejecuta.
• si some_function_that_might_die() die , entonces lo último que sucede en el bloque de código
eval es el die . El bloque de código eval tiene un valor falso y el bloque or do se ejecuta.
• Lo primero que debes hacer en el bloque or do es leer $@ . Esta variable global mantendrá
cualquier argumento que se haya pasado para die . El || "Zombie Error" es popular, pero
innecesario en el caso general.
Esto es importante de entender porque algunos no todos los códigos fallan al llamar a die, pero la
misma estructura puede usarse independientemente. Considere una función de base de datos
que devuelve:
En ese caso, puede seguir utilizando el mismo idioma, pero hay que saltar a la final 1; , y esta
función tiene que ser lo último en la evaluación. Algo como esto:
eval {
my $value = My::Database::retrieve($my_thing); # dies on fail
$value->set_status("Completed");
$value->set_completed_timestamp(time());
https://riptutorial.com/es/home 68
$value->update(); # returns false value on fail
} or do { # handles both the die and the 0 return value
my $eval_error = $@ || "Zombie error!";
handle_error($eval_error);
};
https://riptutorial.com/es/home 69
Capítulo 26: Mejores prácticas
Examples
Utilizando Perl :: Crítico
Si desea comenzar a implementar las mejores prácticas, para usted o su equipo, entonces Perl ::
Critic es el mejor lugar para comenzar. El módulo se basa en el libro Perl Best Practices de
Damien Conway y realiza un trabajo bastante bueno implementando las sugerencias que se
hacen en él.
Nota: Debo mencionar (y el mismo Conway dice en el libro) que estas son
sugerencias. He encontrado que el libro proporciona un razonamiento sólido en la
mayoría de los casos, aunque ciertamente no estoy de acuerdo con todos ellos. Lo
importante a recordar es que, independientemente de las prácticas que decida
adoptar, usted permanece consistente. Cuanto más predecible sea su código, más
fácil será mantenerlo.
Instalación
cpan Perl::Critic
Esto instalará el conjunto de reglas básicas y un script perlcritic al que se puede llamar desde la
línea de comandos.
Uso básico
El documento de CPAN para perlcritic contiene documentación completa, por lo que solo revisaré
los casos de uso más comunes para comenzar. El uso básico es simplemente llamar perlcritic en
el archivo:
perlcritic -1 /path/to/script.pl
Perlcritic funciona tanto en scripts como en módulos. El -1 se refiere al nivel de gravedad de las
reglas que desea ejecutar en el script. Hay cinco niveles que corresponden a la cantidad que Perl
:: Critic separará tu código.
-5 es el más suave y solo advertirá sobre problemas potencialmente peligrosos que podrían
causar resultados inesperados. -1 es el más brutal y se quejará de cosas tan pequeñas como que
su código esté ordenado o no. En mi experiencia, mantener el código compatible con el nivel 3 es
lo suficientemente bueno como para mantenerse fuera de peligro sin ponerse demasiado inquieto.
https://riptutorial.com/es/home 70
De manera predeterminada, cualquier falla incluirá la razón y la severidad que la regla activa en:
Debugging module loaded at line 16, column 1. You've loaded Data::Dumper, which probably
shouln't be loaded in production. (Severity: 4)
Private subroutine/method '_sub_name' declared but not used at line 58, column 1. Eliminate
dead code. (Severity: 3)
Backtick operator used at line 230, column 37. Use IPC::Open3 instead. (Severity: 3)
Backtick operator used at line 327, column 22. Use IPC::Open3 instead. (Severity: 3)
Políticas de visualización
Puede ver rápidamente qué reglas se están activando y por qué utilizando la opción --verbose de
perlcritic:
Mientras que un nivel de 11 mostrará las razones específicas por las que existe la regla:
https://riptutorial.com/es/home 71
$trunk_checkout $staging_checkout`;'.
InputOutput::ProhibitBacktickOperators (Severity: 3)
Backticks are super-convenient, especially for CGI programs, but I find
that they make a lot of noise by filling up STDERR with messages when
they fail. I think its better to use IPC::Open3 to trap all the output
and let the application decide what to do with it.
Ignorando el código
Habrá ocasiones en que no pueda cumplir con una política de Perl :: Critic. En esos casos,
puedes envolver comentarios especiales, " ## use critic () " y " ## no critic ", alrededor de tu
código para hacer que Perl :: Critic los ignore. Simplemente agregue las reglas que desea ignorar
entre paréntesis (los múltiplos se pueden separar con una coma).
## no critic (Subroutines::ProhibitExcessComplexity)
sub no_time_to_refactor_this {
...
}
## use critic
Tenga en cuenta que hay ciertas políticas que se ejecutan en el nivel del documento y no pueden
https://riptutorial.com/es/home 72
ser exentas de esta manera. Sin embargo, se pueden desactivar ...
Este archivo le permitirá personalizar no solo las políticas que se ejecutan, sino también cómo se
ejecutan. Su uso es tan simple como colocar el archivo en su directorio de inicio (en Linux, sin
saber si es el mismo lugar en Windows). O bien, puede especificar el archivo de configuración
cuando ejecute el comando usando la opción --profile :
Una vez más, la página CPAN perlcritic tiene una lista completa de estas opciones. Enumeraré
algunos ejemplos de mi propio archivo de configuración:
# do not require checking for print failure ( false positives for printing to stdout, not
filehandle )
[InputOutput::RequireCheckedSyscalls]
functions = open close
Conclusión
Utilizado correctamente, Perl :: Critic puede ser una herramienta invaluable para ayudar a los
https://riptutorial.com/es/home 73
equipos a mantener su codificación constante y fácil de mantener, sin importar las políticas de
mejores prácticas que emplee.
https://riptutorial.com/es/home 74
Capítulo 27: Optimización del uso de la
memoria.
Examples
Lectura de archivos: foreach vs. while
Cuando se lee un archivo potencialmente grande, un while de bucle tiene una ventaja significativa
sobre la memoria foreach . Lo siguiente leerá el registro del archivo por registro (de manera
predeterminada, "registro" significa "una línea", según lo especificado en $/ ), asignando cada uno
a $_ medida que se lee:
while(<$fh>) {
print;
}
El operador Diamond hace algo de magia aquí para asegurarse de que el bucle solo finalice al
final del archivo y no, por ejemplo, en líneas que contengan solo un carácter "0".
El siguiente bucle parece funcionar igual, sin embargo, evalúa el operador Diamond en el
contexto de la lista, lo que hace que todo el archivo se lea de una sola vez:
foreach(<$fh>) {
print;
}
De todos modos, si está operando en un registro a la vez, esto puede resultar en una gran
pérdida de memoria y, por lo tanto, debe evitarse.
Esto está bien, por ejemplo, para el caso común de realizar un procesamiento en $item y luego
escribirlo en un archivo sin mantener la información. Sin embargo, si usted acumula alguna otra
estructura de datos de los artículos, un while de bucle es más eficiente de la memoria:
my @result;
while(@items) {
my $item = shift @items;
push @result, process_item($item);
https://riptutorial.com/es/home 75
}
A menos que una referencia a $item termine directamente en su lista de resultados, los elementos
que eliminó de la matriz @items se pueden liberar y el intérprete puede reutilizar la memoria
cuando ingresa a la siguiente iteración de bucle.
https://riptutorial.com/es/home 76
Capítulo 28: Orientado a objetos Perl
Examples
Creando objetos
A diferencia de muchos otros idiomas, Perl no tiene constructores que asignen memoria para sus
objetos. En su lugar, uno debería escribir un método de clase que cree una estructura de datos y
lo rellene con datos (puede que lo conozca como el patrón de diseño del Método de fábrica).
package Point;
use strict;
sub new {
my ($class, $x, $y) = @_;
my $self = { x => $x, y => $y }; # store object data in a hash
bless $self, $class; # bind the hash to the class
return $self;
}
Siempre que el operador de flecha -> se usa con métodos, su operando izquierdo se antepone a
la lista de argumentos dada. Entonces, @_ en new contendrá valores ('Point', 1, 2.5) .
No hay nada especial en el nombre new . Puede llamar a los métodos de fábrica como prefiera.
No hay nada especial en los hashes. Podrías hacer lo mismo de la siguiente manera:
package Point;
use strict;
sub new {
my ($class, @coord) = @_;
my $self = \@coord;
bless $self, $class;
return $self;
}
En general, cualquier referencia puede ser un objeto, incluso una referencia escalar. Pero la
mayoría de las veces, los hashes son la forma más conveniente de representar datos de objetos.
Definiendo clases
En general, las clases en Perl son solo paquetes. Pueden contener datos y métodos, como los
paquetes habituales.
https://riptutorial.com/es/home 77
package Point;
use strict;
sub new {
...
}
sub polar_coordinates {
...
}
1;
Es importante tener en cuenta que las variables declaradas en un paquete son variables de clase,
no variables de objeto (instancia). El cambio de una variable a nivel de paquete afecta a todos los
objetos de la clase. Cómo almacenar datos específicos de objetos, consulte "Crear objetos".
Lo que hace que los paquetes de clase sean específicos, es el operador de flecha -> . Puede ser
usado después de una sola palabra:
Point->new(...);
my @polar = $point->polar_coordinates;
Lo que está a la izquierda de la flecha se añade a la lista de argumentos dada del método. Por
ejemplo, después de la llamada
Point->new(1, 2);
Los paquetes que representan clases deben tener en cuenta esta convención y esperar que todos
sus métodos tengan un argumento adicional.
Para hacer que una clase sea una subclase de otra clase, use pragma parent :
package Point;
use strict;
...
1;
package Point2D;
use strict;
use parent qw(Point);
...
1;
https://riptutorial.com/es/home 78
package Point3D;
use strict;
use parent qw(Point);
...
1;
package Point2D;
use strict;
use parent qw(Point PlanarObject);
...
1;
La herencia tiene que ver con la resolución de qué método debe llamarse en una situación
particular. Dado que Perl puro no prescribe ninguna regla sobre la estructura de datos utilizada
para almacenar datos de objetos, la herencia no tiene nada que ver con eso.
package GeometryObject;
use strict;
1;
package Point;
use strict;
use parent qw(GeometryObject);
1;
package PlanarObject;
use strict;
use parent qw(GeometryObject);
1;
package Point2D;
use strict;
use parent qw(Point PlanarObject);
1;
1. El punto de partida está definido por el operando izquierdo del operador de flecha.
https://riptutorial.com/es/home 79
• Si es una palabra simple:
Point2D->new(...);
my $class = 'Point2D';
$class->new(...);
• Si el operando izquierdo es una variable escalar que contiene una referencia bendita :
my $point = {...};
bless $point, 'Point2D'; # typically, it is encapsulated into class methods
my @coord = $point->polar_coordinates;
Point2D->new(...);
simplemente lo llamará.
• Point2D
• Point (primer padre de Point2D )
• GeometryObject (padre de Point )
• PlanarObject (segundo padre de Point2D )
my $point = Point2D->new(...);
$point->transpose(...);
https://riptutorial.com/es/home 80
En el ejemplo anterior, puede llamar explícitamente a PlanarObject::transpose así:
my $point = Point2D->new(...);
$point->PlanarObject::transpose(...);
Por ejemplo,
package Point2D;
use strict;
use parent qw(Point PlanarObject);
sub new {
(my $class, $x, $y) = @_;
my $self = $class->SUPER::new;
...
}
1;
En Perl, la diferencia entre los métodos de clase (estática) y objeto (instancia) no es tan fuerte
como en otros lenguajes, pero aún existe.
El operando izquierdo del operador de flecha -> convierte en el primer argumento del método a
llamar. Puede ser una cadena:
my $class = 'Point';
$class->new(...);
Los métodos de clase son solo los que esperan que su primer argumento sea una cadena, y los
métodos de objeto son los que esperan que su primer argumento sea una referencia de objeto.
Los métodos de clase normalmente no hacen nada con su primer argumento, que es solo un
nombre de la clase. En general, Perl solo lo utiliza para la resolución de métodos. Por lo tanto,
también se puede llamar a un método de clase típico para un objeto:
https://riptutorial.com/es/home 81
my $width = Point->canvas_width;
my $point = Point->new(...);
my $width = $point->canvas_width;
Aunque esta sintaxis está permitida, a menudo es engañosa, por lo que es mejor evitarla.
Los métodos de objeto reciben una referencia de objeto como primer argumento, por lo que
pueden abordar los datos del objeto (a diferencia de los métodos de clase):
package Point;
use strict;
sub polar_coordinates {
my ($point) = @_;
my $x = $point->{x};
my $y = $point->{y};
return (sqrt($x * $x + $y * $y), atan2($y, $x));
}
1;
El mismo método puede rastrear ambos casos: cuando se llama como una clase o un método de
objeto:
sub universal_method {
my $self = shift;
if (ref $self) {
# object logic
...
}
else {
# class logic
...
}
}
Aunque está disponible, la definición de una clase desde cero no se recomienda en Perl moderno.
Utilice uno de los sistemas OO auxiliares que proporcionan más características y conveniencia.
Entre estos sistemas se encuentran:
Alce
package Foo;
use Moose;
https://riptutorial.com/es/home 82
has bar => (is => 'ro'); # a read-only property
has baz => (is => 'rw', isa => 'Bool'); # a read-write boolean property
sub qux {
my $self = shift;
my $barIsBaz = $self->bar eq 'baz'; # property getter
$self->baz($barIsBaz); # property setter
}
package Foo;
use Class::Accessor 'antlers';
package Foo;
use base qw(Class::Accessor);
Clase :: Tiny
package Foo;
use Class::Tiny qw(bar baz); # just props
Roles
Un rol proporciona una pieza de funcionalidad que se puede componer (o aplicar ) a cualquier
clase (que se dice que consume el rol). Un rol no puede ser heredado, pero puede ser consumido
por otro rol.
Un rol también puede requerir clases de consumo para implementar algunos métodos en lugar de
implementar los métodos en sí (como las interfaces en Java o C #).
Perl no tiene soporte incorporado para roles, pero hay clases de CPAN que proporcionan dicho
soporte.
Moose :: Role
package Chatty;
https://riptutorial.com/es/home 83
use Moose::Role;
package Parrot;
use Moose;
with 'Chatty';
sub introduce {
print "I'm Buddy.\n";
}
Rol :: Diminuto
package Chatty;
use Role::Tiny;
package Parrot;
use Class::Tiny;
use Role::Tiny::With;
with 'Chatty';
sub introduce {
print "I'm Buddy.\n";
}
https://riptutorial.com/es/home 84
Capítulo 29: Paquetes y módulos
Sintaxis
• requiere Módulo :: Nombre; # Requerir por nombre de @INC
• requiere "ruta / a / archivo.pm"; # Requerir por ruta relativa de @INC
• use Module :: Name; # requiere y la importación por defecto en BEGIN
• use Module :: Name (); # requiere y no importa en BEGIN
• use Module :: Name (@ARGS); # requiere e importa con args en BEGIN
• use Module :: Name VERSION; # requiere, verificación de versión e importación
predeterminada en BEGIN
• use Module :: Name VERSION (); # requiere, verifica versión, y no importa en BEGIN
• use Module :: Name VERSION (@ARGS); # require, version check, import con args en
BEGIN
• hacer "ruta / a / archivo.pl"; # cargar y evaluar el archivo dado
Examples
Ejecutando los contenidos de otro archivo.
do './config.pl';
Esto leerá el contenido del archivo config.pl y lo ejecutará. (Ver también: perldoc -f do .)
NB: Evite do menos que juegue al golf o algo así, ya que no hay comprobación de errores. Para
incluir módulos de biblioteca, use require o use .
require Exporter;
NB: La mayoría de los usuarios deberían use módulos en lugar de require . A diferencia del use ,
require no llama al método de importación del módulo y se ejecuta en tiempo de ejecución, no
durante la compilación.
Esta forma de cargar módulos es útil si no puede decidir qué módulos necesita antes del tiempo
de ejecución, como con un sistema de complementos:
package My::Module;
my @plugins = qw( One Two );
foreach my $plugin (@plugins) {
my $module = __PACKAGE__ . "::Plugins::$plugin";
https://riptutorial.com/es/home 85
$module =~ s!::!/!g;
require "$module.pm";
}
Usando un modulo
use Cwd;
Generalmente esto es lo que hará lo correcto. A veces, sin embargo, deseará controlar qué
símbolos se importan. Agregue una lista de símbolos después del nombre del módulo para
exportar:
Si lo hace, solo se importarán los símbolos que especifique (es decir, el conjunto predeterminado
no se importará).
Algunos módulos exportan un subconjunto de sus símbolos, pero se les puede decir que exporten
todo con :all :
(Tenga en cuenta que no todos los módulos reconocen o utilizan la etiqueta :all ).
use lib 'includes'; agrega el directorio relativo includes/ como otra ruta de búsqueda de módulo
en @INC . Así que suponga que tiene un archivo de módulo MySyperCoolModule.pm en
MySyperCoolModule.pm interior includes/ , que contiene:
https://riptutorial.com/es/home 86
package MySuperCoolModule;
Si lo desea, puede agrupar tantos módulos como desee dentro de un solo directorio y hacer que
se puedan encontrar con un solo use lib .
En este punto, el uso de las subrutinas en el módulo requerirá el prefijo del nombre de la
subrutina con el nombre del paquete:
Para poder usar las subrutinas sin el prefijo, debe exportar los nombres de las subrutinas para
que el programa las reconozca. La exportación se puede configurar para que sea automática, por
lo que:
package MySuperCoolModule;
use base 'Exporter';
our @EXPORT = ('SuperCoolSub_1', 'SuperCoolSub_2');
Luego, en el archivo que use el módulo, esas subrutinas estarán disponibles automáticamente:
use MySuperCoolModule;
SuperCoolSub_1("Super Cool String");
package MySuperCoolModule;
use base 'Exporter';
our @EXPORT_OK = ('SuperCoolSub_1', 'SuperCoolSub_2');
En cuyo caso, debe solicitar explícitamente las subrutinas que desea exportar en el script que use
el módulo:
CPAN.pm
CPAN.pm es un módulo de Perl que permite consultar e instalar módulos desde los sitios de CPAN.
cpan
Módulos de consulta
https://riptutorial.com/es/home 87
Por nombre:
cpan> m MooseX::YAML
cpan> m /^XML::/
Nota: para habilitar un buscapersonas o redirigir a un uso de archivos | o > redirección de shell
(los espacios son obligatorios alrededor de | y > ), por ejemplo: m /^XML::/ | less
Por distribución:
cpan> d LMC/Net-Squid-Auth-Engine-0.04.tar.gz
Instalacion de modulos
Por nombre:
Por distribución:
cpan -l
De un script de Perl:
use ExtUtils::Installed;
my $inst = ExtUtils::Installed->new();
my @modules = $inst->modules();
https://riptutorial.com/es/home 88
Capítulo 30: Perl one-liners
Examples
Ejecutar algún código de Perl desde la línea de comandos
Los sencillos de una línea se pueden especificar como argumentos de línea de comando para
perl usando el -e (piense "ejecuta"):
Debido a las reglas de cotización de Windows, no puede usar cadenas entre comillas simples,
pero tiene que usar una de estas variantes:
Tenga en cuenta que para evitar romper el código antiguo, solo se puede usar la sintaxis
disponible hasta Perl 5.8.x con -e . Para usar algo más nuevo que pueda admitir su versión de
Perl, use -E lugar. Por ejemplo, para usar say disponible desde 5.10.0 en más Unicode 6.0 desde>
= v5.14.0 (también usa -CO para asegurarse de que STDOUT imprima en UTF-8):
5.14.0
Windows usa solo comillas dobles para ajustar los parámetros de la línea de comandos. Para
usar comillas dobles en perl one-liner (es decir, para imprimir una cadena con una variable
interpolada), tiene que escapar de ellas con barras invertidas:
Mayúsculas y minúsculas:
https://riptutorial.com/es/home 89
perl -ne'print if /foo/i' file.txt
O en el lugar:
En Windows:
Ejemplo de CSV:
Imprimir líneas 5 a 10
Con una copia de seguridad old_file.txt.orig en el subdirectorio de backup (siempre que exista
este último):
https://riptutorial.com/es/home 90
perl -0777 -ne'print "The whole file as a string: --->$_<---\n"'
Nota: El -0777 es solo una convención. Cualquier -0400 y superior sería el mismo.
perl -Mojo -E 'p("http://localhost:3000" => form => {Input_Type => "XML", Input_File => {file
=> "d:/xml/test.xml"}})'
En este ejemplo:
Para leer más sobre cómo ejecutar perl, use el comando perldoc perlrun o lea aquí
https://riptutorial.com/es/home 91
Capítulo 31: Perl Testing
Examples
Ejemplo de prueba de unidad Perl
Normalmente, el comando de prueba ejecuta los scripts y resume los resultados de la prueba.
#!/bin/env perl
# CPAN
use Modern::Perl;
use Carp;
use Test::More;
use Test::Exception;
use Const::Fast;
# Custom
BEGIN { use_ok('Local::MyPackage'); }
# Check the result of the method call matches our expected result.
like( $got_file_type, qr{ASCII[ ]text}ix, "$label - result" );
return;
} ## end sub test_file_type_build
# More tests can be added here for method 'file_type_build', or other methods.
MAIN: {
https://riptutorial.com/es/home 92
# More tests of the method can be added here.
done_testing();
};
done_testing();
} ## end MAIN:
Mejores prácticas
Un script de prueba solo debe probar un paquete / clase, pero se pueden usar muchos scripts
para probar un paquete / clase.
Otras lecturas
https://riptutorial.com/es/home 93
Capítulo 32: Perlbrew
Introducción
Perlbrew es una herramienta para administrar múltiples instalaciones de Perl en su directorio
$HOME .
Observaciones
Ver también
Examples
Configurar perlbrew por primera vez
source ~/.perlbrew.sh
curl -L https://install.perlbrew.pl | bash
source "$PERLBREW_ROOT/etc/bashrc"
./install_perlbrew.sh
https://riptutorial.com/es/home 94
Agrega al final de tu ~/.bashrc
Fuente ~/.bashrc :
source ~/.bashrc
https://riptutorial.com/es/home 95
Capítulo 33: Salida de depuración
Examples
Dumping estructuras de datos
use Data::Dumper;
Usar Data :: Dumper es una forma fácil de ver las estructuras de datos o el contenido variable en
tiempo de ejecución. Se envía con Perl y puedes cargarlo fácilmente. La función Dumper devuelve
la estructura de datos serializada de forma que se parece al código Perl.
$VAR1 = {
'foo' => 'bar',
}
Eso lo hace muy útil para observar rápidamente algunos valores en su código. Es una de las
herramientas más útiles que tienes en tu arsenal. Lea la documentación completa en metacpan .
A veces, Data :: Dumper no es suficiente. ¿Tienes un objeto Moose que quieres inspeccionar?
¿Grandes números de la misma estructura? ¿Quieres cosas ordenadas? ¿De colores? Datos ::
La impresora es tu amiga.
use Data::Printer;
p $data_structure;
Datos :: Impresora escribe a STDERR, como warn . Eso hace que sea más fácil encontrar la
salida. Por defecto, ordena las claves hash y mira los objetos.
use Data::Printer;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
p $ua;
Observará todos los métodos del objeto y también enumerará los aspectos internos.
LWP::UserAgent {
https://riptutorial.com/es/home 96
Parents LWP::MemberMixin
public methods (45) : add_handler, agent, clone, conn_cache, cookie_jar, credentials,
default_header, default_headers, delete, env_proxy, from, get, get_basic_credentials,
get_my_handler, handlers, head, is_online, is_protocol_supported, local_address, max_redirect,
max_size, mirror, new, no_proxy, parse_head, post, prepare_request, progress,
protocols_allowed, protocols_forbidden, proxy, put, redirect_ok, remove_handler, request,
requests_redirectable, run_handlers, send_request, set_my_handler, show_progress,
simple_request, ssl_opts, timeout, use_alarm, use_eval
private methods (4) : _agent, _need_proxy, _new_response, _process_colonic_headers
internals: {
def_headers HTTP::Headers,
handlers {
response_header HTTP::Config
},
local_address undef,
max_redirect 7,
max_size undef,
no_proxy [],
protocols_allowed undef,
protocols_forbidden undef,
proxy {},
requests_redirectable [
[0] "GET",
[1] "HEAD"
],
show_progress undef,
ssl_opts {
verify_hostname 1
},
timeout 180,
use_eval 1
}
}
Puede configurarlo más, por lo que serializa ciertos objetos de cierta manera, o para incluir
objetos hasta una profundidad arbitraria. La configuración completa está disponible en la
documentación .
Desafortunadamente, Data :: Printer no se envía con Perl, por lo que necesita instalarlo desde
CPAN o a través de su sistema de administración de paquetes.
El uso de Data :: Dumper permite acceder fácilmente a los valores de la lista de búsqueda. El
Dumper devuelve los valores de lista serializados de forma que se parece al código Perl.
Salida:
$VAR1 = 123;
$VAR2 = 456;
$VAR3 = 789;
$VAR4 = 'poi';
$VAR5 = 'uyt';
https://riptutorial.com/es/home 97
$VAR6 = 'rew';
$VAR7 = 'qas';
Según lo sugerido por el usuario @dgw Cuando se eliminan matrices o hashes, es mejor usar
una referencia de matriz o una referencia de hash, se mostrará mejor el ajuste de la entrada.
$ref_data = [23,45,67,'mnb','vcx'];
print Dumper $ref_data;
Salida:
$VAR1 = [
23,
45,
67,
'mnb',
'vcx'
];
my @data_array = (23,45,67,'mnb','vcx');
print Dumper \@data_array;
Salida:
$VAR1 = [
23,
45,
67,
'mnb',
'vcx'
];
Muestra de datos
La función show se exporta automáticamente cuando se use Data::Show; es ejecutado. Esta función
toma una variable como único argumento y genera:
1. El nombre de la variable
2. El contenido de esa variable (en un formato legible).
3. La línea del archivo que show se ejecuta desde
4. el archivo show se ejecuta desde
use strict;
use warnings;
use Data::Show;
https://riptutorial.com/es/home 98
my %hash = ( foo => 1, bar => { baz => 10, qux => 20 } );
my $href = \%hash;
show @array;
show %hash;
show $href;
[1 .. 10]
https://riptutorial.com/es/home 99
Capítulo 34: Subrutinas
Observaciones
Las subrutinas llevan sus argumentos a la variable mágica llamada @_ . Si bien no tiene que
desempaquetarse, se recomienda, ya que ayuda a la legibilidad y evita cambios accidentales a
medida que los argumentos de @_ se pasan por referencia (se pueden modificar).
Examples
Creando subrutinas
Las subrutinas se crean utilizando la palabra clave sub seguido de un identificador y un bloque de
código entre llaves.
Puede acceder a los argumentos utilizando la variable especial @_ , que contiene todos los
argumentos como una matriz.
sub function_name {
my ($arg1, $arg2, @more_args) = @_;
# ...
}
Como la función shift predeterminada a desplazar @_ cuando se usa dentro de una subrutina, es
un patrón común extraer los argumentos de forma secuencial en variables locales al comienzo de
una subrutina:
sub function_name {
my $arg1 = shift;
my $arg2 = shift;
my @more_args = @_;
# ...
}
sub {
my $arg1 = shift;
# ...
}->($arg);
5.20.0
https://riptutorial.com/es/home 100
parámetros, que se pasan por valor ( no por referencia).
Puede usar cualquier expresión para asignar un valor predeterminado a un parámetro, incluidos
otros parámetros.
Tenga en cuenta que no puede hacer referencia a los parámetros que se definen después del
parámetro actual; por lo tanto, el siguiente código no funciona como se esperaba.
Los argumentos de subrutina en Perl se pasan por referencia, a menos que estén en la firma.
Esto significa que los miembros de la matriz @_ dentro del subgrupo son solo alias de los
argumentos reales. En el siguiente ejemplo, $text en el programa principal se deja modificado
después de la llamada de subrutina porque $_[0] dentro del sub es en realidad solo un nombre
diferente para la misma variable. La segunda invocación genera un error porque un literal de
cadena no es una variable y, por lo tanto, no se puede modificar.
sub edit {
$_[0] =~ s/world/sub/;
}
https://riptutorial.com/es/home 101
Para evitar obstruir las variables de su interlocutor, por lo tanto, es importante copiar @_ a las
variables de ámbito local ( my ... ) como se describe en "Crear subrutinas".
Subrutinas
Algunas incorporaciones como print o say son palabras clave, no funciones, por lo que, por
ejemplo, &say no está definido. También significa que puede definirlos, pero tendrá que especificar
el nombre del paquete para llamarlos
5.18.0
https://riptutorial.com/es/home 102
}
$value = prod 1..6; # 720
say defined ∏ # 1
}
say defined ∏ # 0
5.20.0
Esto no debe confundirse con los prototipos, una instalación que Perl tiene para permitirle definir
funciones que se comportan como integradas. Los prototipos de funciones deben ser visibles en
el momento de la compilación y sus efectos pueden ignorarse especificando el & sigil. Los
prototipos generalmente se consideran una característica avanzada que se utiliza mejor con gran
cuidado.
# This prototype makes it a compilation error to call this function with anything
# that isn't an array. Additionally, arrays are automatically turned into arrayrefs
sub receives_arrayrefs(\@\@) {
my $x = shift;
my $y = shift;
}
my @a = (1..3);
my @b = (1..4);
receives_arrayrefs(@a, @b); # okay, $x = \@a, $y = \@b, @_ = ();
receives_arrayrefs(\@a, \@b); # compilation error, "Type … must be array …"
BEGIN { receives_arrayrefs(\@a, \@b); }
https://riptutorial.com/es/home 103
Capítulo 35: Texto atribuido
Examples
Imprimiendo texto en color
#!/usr/bin/perl
use Term::ANSIColor;
https://riptutorial.com/es/home 104
Capítulo 36: Una forma sencilla de
comprobar los módulos instalados en Mac y
Ubuntu
Examples
Compruebe los módulos perl instalados a través de la terminal
instmodsh
Luego escriba l para enumerar todos los módulos instalados, también puede usar el comando m
<module> para seleccionar el módulo y obtener su información.
$ perldoc -l Time::Local
$ corelist -v v5.23.1
Lea Una forma sencilla de comprobar los módulos instalados en Mac y Ubuntu en línea:
https://riptutorial.com/es/perl/topic/5925/una-forma-sencilla-de-comprobar-los-modulos-instalados-
en-mac-y-ubuntu
https://riptutorial.com/es/home 105
Capítulo 37: Unicode
Observaciones
Nunca es completamente seguro asumir (pero a menudo lo es) que solo porque puede codificar y
escribir en un nombre de archivo dado, que cuando más tarde intente abrir ese mismo nombre de
archivo para leer, aún se llamará la misma cosa.
Por ejemplo, si escribe en un sistema de archivos como FAT16 que no admite Unicode, sus
nombres de archivo podrían traducirse silenciosamente a formularios compatibles con ASCII.
Pero es aún menos seguro suponer que un archivo que puede crear, leer y escribir con nombres
explícitos se llamará de la misma manera cuando se lo solicite a través de otras llamadas, por
ejemplo, readdir puede devolver diferentes bytes para su nombre de archivo de los que especificó
para open .
En algunos sistemas, como VAX, ni siquiera puede asumir siempre que readdir devolverá el
mismo nombre de archivo que especificó con open para los nombres de archivo tan simple como
foo.bar , ya que las extensiones de nombre de archivo pueden ser modificadas por el sistema
operativo.
Además, en UNIX, hay un conjunto muy liberal de caracteres legales para los nombres de archivo
que permite el sistema operativo, excluyendo solo / y \0 , donde, como en Windows, hay rangos
específicos de caracteres que están prohibidos en los nombres de archivo y causarán errores.
Ejercer mucha precaución aquí, evitar trucos de fantasía con los nombres de archivo, si
usted tiene una opción, y siempre tienen pruebas para asegurarse de que los trucos de fantasía
que usted hace uso son consistentes.
Tenga mucho cuidado si está escribiendo código destinado a ejecutarse en plataformas fuera de
su control, como si está escribiendo código destinado a CPAN , y suponga que al menos el 5% de
su base de usuarios se atascará con algunos Tecnología antigua o rota, ya sea por elección, por
accidente o por poderes fuera de su control, y que estos conspirarán para crear errores para
ellos.
A partir de Perl v5.8.7 , "UTF-8" (con guión) significa UTF-8 en su forma estricta y consciente de la
seguridad, mientras que "utf8" significa UTF-8 en su forma liberal y holgada.
Por ejemplo, "utf8" se puede usar para puntos de código que no existen en Unicode, como
0xFFFFFFFF . Correspondientemente, las secuencias de bytes UTF-8 no válidas como
"\x{FE}\x{83}\x{BF}\x{BF}\x{BF}\x{BF}\x{BF}" se decodificarán en una 0xFFFFFFFF código Unicode
no válido (pero Perl válido) ( 0xFFFFFFFF ) cuando se utiliza "utf8" , mientras que la "UTF-8" no
permitiría la decodificación a puntos de código fuera del rango de Unicode válido y le daría un
carácter de sustitución ( 0xFFFD ).
Dado que los nombres de codificación no distinguen entre mayúsculas y minúsculas, "UTF8" es lo
mismo que "utf8" (es decir , variante no estricta ).
Más lectura
Los detalles sobre el manejo de Perl en Unicode se describen con más detalle en las siguientes
fuentes:
• Perlunicode
• perlunitut
• perluniintro
• perlunifaq
• perlunicook
• utf8 pragma
• característica unicode_strings
• pragma abierto
• Perlio
• PerlIO :: codificación
• función abierta
• Codificar
https://riptutorial.com/es/home 107
• perlrun - interruptores de línea de comando
• Capítulo 6, Programación Perl
Videos de Youtube:
Examples
Crear nombres de archivos
Los siguientes ejemplos utilizan la codificación UTF-8 para representar nombres de archivos (y
nombres de directorio) en el disco. Si desea utilizar otra codificación, debe usar
Encode::encode(...) .
use v5.14;
# Make Perl recognize UTF-8 encoded characters in literal strings.
# For this to work: Make sure your text-editor is using UTF-8, so
# that bytes on disk are really UTF-8 encoded.
use utf8;
# Ensure that possible error messages printed to screen are converted to UTF-8.
# For this to work: Check that your terminal emulator is using UTF-8.
binmode STDOUT, ':utf8';
binmode STDERR, ':utf8';
# Note: in the following it is assumed that $filename has the internal UTF-8
# flag set, if $filename is pure ASCII, it will also work since its encoding
# overlaps with UTF-8. However, if it has another encoding like extended ASCII,
# $filename will be written with that encoding and not UTF-8.
# Note: it is not necessary to encode $filename as UTF-8 here
# since Perl is using UTF-8 as its internal encoding of $filename already
https://riptutorial.com/es/home 108
Perl no intenta decodificar los nombres de archivos devueltos por las funciones integradas o los
módulos. Tales cadenas que representan nombres de archivos siempre deben decodificarse
explícitamente, para que Perl los reconozca como Unicode.
use v5.14;
use Encode qw(decode_utf8);
# Ensure that possible error messages printed to screen are converted to UTF-8.
# For this to work: Check that you terminal emulator is using UTF-8.
binmode STDOUT, ':utf8';
binmode STDERR, ':utf8';
https://riptutorial.com/es/home 109
Nota: si le preocupa el UTF-8 no válido en los nombres de archivo, el uso de decode_utf8( ... )
en los ejemplos anteriores probablemente debería ser reemplazado por decode( 'utf-8', ... ) .
Esto se debe a que decode_utf8( ... ) es un sinónimo de decode( 'utf8', ... ) y existe una
diferencia entre las codificaciones utf-8 y utf8 (consulte las Notas a continuación para obtener
más información) donde utf-8 es más estricto en lo que es aceptable que utf8 .
E / S estándar
• I - STDIN estará en UTF-8
• O - STDOUT estará en UTF-8
• E - STDERR estará en UTF-8
• S - taquigrafía para IOE , las secuencias de E / S estándar estarán en UTF-8
echo "Ματαιότης ματαιοτήτων" | perl -CS -Mutf8 -nE 'say "ok" if /Ματαιότης/'
perl -CA -Mutf8 -E 'my $arg = shift; say "anteater" if $arg eq "муравьед"' муравьед
perl -CD -Mutf8 -e 'open my $fh, ">", "utf8.txt" or die $!; print $fh " "'
https://riptutorial.com/es/home 110
-M interruptores -M y -C se pueden combinar:
E / S estándar
La codificación que se utilizará para los identificadores de binmode E / S estándar ( STDIN , STDOUT y
STDERR ) se puede configurar por separado para cada identificador utilizando binmode :
Nota: cuando se lee uno, en general, se prefiere :encoding(utf-8) sobre :utf8 , consulte
Observaciones para obtener más información.
# Setup such that all subsequently opened input streams will use ':encoding(utf-8)'
# and all subsequently opened output streams will use ':utf8'
# by default
use open (IN => ':encoding(utf-8)', OUT => ':utf8');
# Make the (already opened) standard file handles inherit the setting
# given by the IO settings for the open pragma
use open ( :std );
# Now, STDIN has been converted to ':encoding(utf-8)', and
# STDOUT and STDERR have ':utf8'
Alternativamente, para configurar todos los identificadores de archivo (tanto los que aún no se
han abierto como los estándar) para usar :encoding(utf-8) :
Manijas de archivo
my $filename = '/path/to/file';
open my $fh, '<:encoding(utf-8)', $filename or die "Failed to open $filename: $!";
Vea Observaciones para una discusión de las diferencias entre :utf8 y :encoding(utf-8) .
https://riptutorial.com/es/home 111
Configuración de la codificación con
binmode ()
Alternativamente, puede usar binmode () para establecer la codificación para el identificador de
archivo individual:
my $filename = '/path/to/file';
open my $fh, '<', $filename or die "Failed to open $filename: $!";
binmode $fh, ':encoding(utf-8)';
pragma abierto
Para evitar establecer la codificación para cada identificador de archivo por separado, puede usar
el pragma open para establecer una capa de E / S predeterminada utilizada por todas las llamadas
subsiguientes a la función open() y operadores similares dentro del alcance léxico de este
pragma:
El pragma utf8 indica que el código fuente se interpretará como UTF-8. Por supuesto, esto solo
funcionará si su editor de texto también guarda la fuente como codificación UTF-8.
Ahora, los literales de cadena pueden contener caracteres Unicode arbitrarios; los identificadores
también pueden contener caracteres Unicode pero solo de tipo palabra (consulte perldata y
perlrecharclass para obtener más información):
use utf8;
my $var1 = '§я§© '; # works fine
my $я = 4; # works since я is a word (matches \w) character
my $p§2 = 3; # does not work since § is not a word character.
say "ya" if $var1 =~ /я§/; # works fine (prints "ya")
https://riptutorial.com/es/home 112
Nota : al imprimir texto en el terminal, asegúrese de que sea compatible con UTF-8. *
En el primer caso, Perl trata la cadena como bytes en bruto y los imprime así. Como estos bytes
son UTF-8 válidos, se ven correctos aunque Perl realmente no sabe qué caracteres son (por
ejemplo, la length("Møøse") devolverá 7, no 5). Una vez que agrega -Mutf8 , Perl decodifica
correctamente la fuente UTF-8 en caracteres, pero la salida está en modo Latin-1 por defecto y la
impresión de Latin-1 en un terminal UTF-8 no funciona. Solo cuando cambie STDOUT a UTF-8
usando -CO , la salida será correcta.
Por defecto, Perl le warn acerca de la codificación de fallos, pero no abortará su programa. Puede
hacer que su programa aborte haciendo que las advertencias de UTF-8 sean fatales, pero tenga
en cuenta las advertencias en Advertencias fatales .
use strict;
use warnings;
use warnings FATAL => 'utf8';
https://riptutorial.com/es/home 113
binmode STDOUT, ':utf8';
binmode STDERR, ':utf8';
my $bytes = "\x{61}\x{E5}\x{61}"; # 3 bytes in iso 8859-1: aåa
my $fn = 'test.txt';
open ( my $fh, '>:raw', $fn ) or die "Could not open file '$fn': $!";
print $fh $bytes;
close $fh;
open ( $fh, "<:encoding(utf-8)", $fn ) or die "Could not open file '$fn': $!";
my $str = do { local $/; <$fh> };
close $fh;
print "Read string: '$str'\n";
La línea 10 es aquí la segunda última línea, y el error se produce en la parte de la línea con <$fh>
cuando se intenta leer una línea del archivo.
Si no hace que las advertencias sean fatales en el programa anterior, Perl seguirá imprimiendo la
advertencia. Sin embargo, en este caso, intentará recuperarse del byte 0xE5 con formato
incorrecto insertando los cuatro caracteres \xE5 en el flujo y luego continuará con el siguiente
byte. Como resultado, el programa imprimirá:
https://riptutorial.com/es/home 114
Capítulo 38: Variables
Sintaxis
• mi # declaración léxica
• nuestra # declaración global
• $ foo # escalar
• @foo # Array
• $ # foo # Array Last-Index
• % foo # Hash
• $ {$ foo} # Decalar referencia
• @ {$ foo} # Array De-Reference
• $ # {$ foo} # Array-DeRef Last-Index
• % {$ foo} # Hash De-Reference
• $ foo [$ index] # Array se indexa
• $ {$ foo} [$ index] # Array De-Reference y se indexa.
• $ foo -> [$ index] # Array De-Reference y se indexa (simplificado)
• $ foo {$ clave} # Hash obtener valor por clave
• $ {$ foo} {$ clave} # Hash Dereference y obtener valor por clave
• $ foo -> {$ clave} # Hash Dereference y obtener valor por clave (simplificado)
• \ $ x # Referencia a escalar
• \ @x # Referencia a Array
• \% x # Referencia al hash
• = [] # Referencia a una matriz anónima (en línea)
• = {} # Referencia a Hash anónimo (en línea)
Examples
Escalares
Los escalares son el tipo de datos más básico de Perl. Están marcados con el sigil $ y tienen un
solo valor de uno de tres tipos:
my $integer = 3; # number
my $string = "Hello World"; # string
my $reference = \$string; # reference to $string
Perl convierte entre números y cadenas sobre la marcha , según lo que espera un operador
en particular.
https://riptutorial.com/es/home 115
my $meaning = $number + 1; # number 42
my $sadness = '20 apples'; # string '20 apples'
my $danger = $sadness * 2; # number '40', raises warning
Al convertir una cadena en un número, Perl toma tantos dígitos del frente de una cadena como
puede, de ahí que 20 apples se conviertan en 20 en la última línea.
En función de si desea tratar el contenido de un escalar como una cadena o un número, debe
utilizar diferentes operadores. No los mezcle.
Arrays
Las matrices almacenan una secuencia ordenada de valores. Puede acceder a los contenidos por
índice, o iterar sobre ellos. Los valores se mantendrán en el orden en que los completó.
# Use negative indices to count from the end (with -1 being last)
my $last_char_of_hello = $chars_of_hello[-1];
# You can use $# to get the last index of an array, and confuse Stack Overflow
my $last_index_of_array = $#chars_of_hello; # 4
# You can also access multiple elements of an array at the same time
# This is called "array slice"
# Since this returns multiple values, the sigil to use here on the RHS is @
my @some_chars_of_hello = @chars_of_hello[1..3]; # ('H', 'e', 'l')
my @out_of_order_chars = @chars_of_hello[1,4,2]; # ('e', 'o', 'l')
# In Python you can say array[1:-1] to get all elements but first and last
# Not so in Perl: (1..-1) is an empty list. Use $# instead
https://riptutorial.com/es/home 116
my @empty_list = @chars_of_hello[1..-1]; # ()
my @inner_chars_of_hello = @chars_of_hello[1..$#chars_of_hello-1]; # ('e','l','l')
# Access beyond the end of the array yields undef, not an error
my $undef = $chars_of_hello[6]; # undef
# Setting elements beyond the end of an array does not result in an error
# The array is extended with undef's as necessary. This is "autovivification."
my @array; # ()
my @array[3] = 'x'; # (undef, undef, undef, 'x')
Cuando se usan como valores booleanos, las matrices son verdaderas si no están vacías.
Hashes
# You can save some typing and gain in clarity by using the "fat comma"
# syntactical sugar. It behaves like a comma and quotes what's on the left.
my %translations_of_hello = (spanish => 'Hola', german => 'Hallo', swedish => 'Hej');
En el siguiente ejemplo, note los corchetes y el sigilo: accede a un elemento de %hash usando
$hash{key} porque el valor que desea es un escalar. Algunos consideran una buena práctica citar
la clave, mientras que otros encuentran este estilo visualmente ruidoso. Solo se requieren citas
para las claves que podrían confundirse con expresiones como $hash{'some-key'}
my $greeting = $translations_of_hello{'spanish'};
https://riptutorial.com/es/home 117
Mientras que Perl por defecto intentará usar las palabras peladas como cadenas, el modificador +
también se puede usar para indicar a Perl que la clave no debe interpolarse sino ejecutarse, y el
resultado de la ejecución se usa como una clave:
# but this one will execute [shift][1], extracting first element from @_,
# and use result as a key
print $employee{+shift};
Al igual que con las matrices, puede acceder a varios elementos hash al mismo tiempo. Esto se
llama una porción de hash . El valor resultante es una lista, así que use @ sigil:
Iterar sobre las claves de un hash con keys keys devolverá los elementos en un orden aleatorio.
Combina con el sort si lo deseas.
Si no necesita las claves como en el ejemplo anterior, los values devuelven los valores de hash
directamente:
También puede usar un bucle while con each para iterar sobre el hash. De esta manera, obtendrá
la clave y el valor al mismo tiempo, sin una búsqueda de valor por separado. Sin embargo, se
desaconseja su uso, ya que each puede romper en formas de confusión.
# DISCOURAGED
while (my ($lang, $translation) = each %translations_of_hello) {
say $translation;
}
map y el aplanamiento de listas se pueden utilizar para crear hashes a partir de matrices. Esta es
una forma popular de crear un 'conjunto' de valores, por ejemplo, para verificar rápidamente si un
valor está en @elems . Esta operación generalmente toma tiempo O (n) (es decir, proporcional al
número de elementos) pero se puede hacer en tiempo constante (O (1)) al convertir la lista en un
hash:
https://riptutorial.com/es/home 118
@elems = qw(x y x z t);
my %set = map { $_ => 1 } @elems; # (x, 1, y, 1, t, 1)
my $y_membership = $set{'y'}; # 1
my $w_membership = $set{'w'}; # undef
Esto requiere alguna explicación. El contenido de @elems se lee en una lista, que se procesa por
map . map acepta un bloque de código al que se llama para cada valor de su lista de entrada; El
valor del elemento está disponible para su uso en $_ . Nuestro bloque de código devuelve dos
elementos de lista para cada elemento de entrada: $_ , el elemento de entrada y 1 , solo un valor.
Una vez que tenga en cuenta el aplanamiento de listas, el resultado es que el map { $_ => 1 }
@elems convierte qw(xyxzt) en (x => 1, y => 1, x => 1, z => 1, t => 1) .
A medida que esos elementos se asignan al hash, los elementos impares se convierten en claves
hash e incluso los elementos se convierten en valores hash. Cuando se especifica una clave
varias veces en una lista para asignarla a un hash, el último valor gana. Esto efectivamente
descarta los duplicados.
Una forma más rápida de convertir una lista en un hash usa la asignación a una porción de hash.
Utiliza el operador x para multiplicar la lista de un solo elemento (1) por el tamaño de @elems , por
lo que hay un valor de 1 para cada una de las claves en el sector en el lado izquierdo:
La siguiente aplicación de hashes también explota el hecho de que los hashes y las listas a
menudo se pueden usar indistintamente para implementar la función nombrada args:
sub hash_args {
my %args = @_;
my %defaults = (foo => 1, bar => 0);
my %overrides = (__unsafe => 0);
my %settings = (%defaults, %args, %overrides);
}
Cuando se usan como valores booleanos, los hashes son verdaderos si no están vacíos.
Referencias escalares
Una referencia es una variable escalar (una prefijada por $ ) que "se refiere a" algunos otros
datos.
my $value = "Hello";
my $reference = \$value;
print $value; # => Hello
print $reference; # => SCALAR(0x2683310)
https://riptutorial.com/es/home 119
Para obtener los datos referidos, usted de referencia .
5.24.0
use v5.24;
say $reference->$*; # New postfix notation
Este "valor sin referencia" se puede cambiar como si fuera la variable original.
${$reference} =~ s/Hello/World/;
print ${$reference}; # => World
print $value; # => World
Una referencia es siempre veraz , incluso si el valor al que se refiere es falsy (como 0 o "" ).
• Desea evitar explícitamente que Perl copie implícitamente el contenido de una cadena
grande en algún punto de su paso de funciones (especialmente relevante en Perls
anteriores sin cadenas de copia en escritura)
• Desea desambiguar los valores de tipo cadena con un significado específico, a partir de
cadenas que transmiten contenido, por ejemplo:
• Desea implementar un modelo de objetos ligero de adentro hacia afuera, donde los objetos
entregados al código de llamada no lleven metadatos visibles para el usuario:
our %objects;
my $next_id = 0;
sub new {
my $object_id = $next_id++;
$objects{ $object_id } = { ... }; # Assign data for object
my $ref = \$object_id;
return bless( $ref, "MyClass" );
}
Referencias de Array
https://riptutorial.com/es/home 120
my @array = ("Hello"); # Creating array, assigning value from a list
my $array_reference = \@array;
my $other_array_reference = ["Hello"];
5.24.0
use v5.24;
my @contents = $array_reference->@*; # New postfix notation
Al acceder a los contenidos de un arrayref por índice, puede utilizar el -> azúcar sintáctica.
Hash Referencias
Las referencias de hash son escalares que contienen un puntero a la ubicación de memoria que
contiene los datos de un hash. Debido a que el escalar apunta directamente al hash, cuando se
pasa a una subrutina, los cambios realizados en el hash no son locales a la subrutina como
ocurre con un hash normal, sino que son globales.
Primero, examinemos lo que sucede cuando pasas un hash normal a una subrutina y lo
modificamos allí:
https://riptutorial.com/es/home 121
use strict;
use warnings;
use Data::Dumper;
sub modify
{
my %hash = @_;
$hash{new_value} = 2;
return;
}
my %example_hash = (
old_value => 1,
);
modify(%example_hash);
Observe que después de salir de la subrutina, el hash permanece inalterado; todos los cambios
fueron locales a la subrutina de modificación, porque pasamos una copia del hash, no el hash en
sí.
En comparación, cuando se pasa un hashref, se pasa la dirección al hash original, por lo que
cualquier cambio realizado dentro de la subrutina se hará al hash original:
use strict;
use warnings;
use Data::Dumper;
sub modify
{
my $hashref = shift;
https://riptutorial.com/es/home 122
return;
}
# Create a hashref
my $example_ref = {
old_value => 1,
};
Un typeglob *foo contiene referencias a los contenidos de las variables globales con ese nombre:
$foo , @foo , $foo , &foo , etc. Puedes acceder a él como un hash y asignarlo para manipular las
tablas de símbolos directamente (¡malvado!).
Los typeglobs se manejan más comúnmente cuando se trata de archivos. open , por ejemplo,
produce una referencia a un typeglob cuando se le pide que cree un identificador de archivo no
global:
# You can dereference this globref, but it's not very useful.
say ref $log; # GLOB
say (*{$log}->{IO} // 'undef'); # undef
https://riptutorial.com/es/home 123
close $log or die $!;
Los typeglobs también se pueden usar para hacer variables globales de solo lectura, aunque el
use constant es un uso más amplio.
# use constant instead defines a parameterless function, therefore it's not global,
# can be used without sigils, can be imported, but does not interpolate easily.
use constant (FALSE => 0);
say FALSE; # 0
say &FALSE; # 0
say "${\FALSE}"; # 0 (ugh)
say *FALSE{CODE}; # CODE(0xMA1DBABE)
# Of course, neither is truly constant when you can manipulate the symbol table...
*TRUE = \('');
use constant (EVIL => 1);
*FALSE = *EVIL;
Sigilos
\@array; # \ returns the reference of what's on the right (so, a reference to @array)
$#array; # this is the index of the last element of @array
Puedes usar llaves después del sigilo si así lo deseas. Ocasionalmente, esto mejora la legibilidad.
say ${value} = 5;
Mientras usa diferentes sigilos para definir variables de diferentes tipos, se puede acceder a la
misma variable de diferentes maneras en función de los sigilos que use.
https://riptutorial.com/es/home 124
# (this gives key-value pairs: 'it', 'ciao', 'fr', 'salut')
Esto es especialmente cierto de las referencias. Para utilizar un valor de referencia, puede
combinar los sigilos juntos.
Aquí hay una manera quizás menos confusa de pensar en ello. Como vimos anteriormente,
puedes usar llaves para envolver lo que está a la derecha de un sigilo. Así que puedes pensar en
@{} como algo que toma una referencia de matriz y te da la matriz de referencia.
my $values = undef;
say pop @{ $values }; # ERROR: can't use undef as an array reference
say pop @{ $values // [5] } # undef // [5] gives [5], so this prints 5
# This is not an example of good Perl. It is merely a demonstration of this language feature
my $hashref = undef;
for my $key ( %{ $hashref // {} } ) {
"This doesn't crash";
}
say $$scalar_reference;
say pop @$array_reference;
for keys (%$hash_reference) { ... };
Las cosas pueden volverse excesivamente extravagantes. Esto funciona, pero por favor Perl
responsablemente.
https://riptutorial.com/es/home 125
Para el uso más normal, puede usar nombres de subrutina sin un sigilo. (Las variables sin un
sigilo generalmente se llaman "palabras peladas"). El & sigil solo es útil en un número limitado de
casos.
• Combinado con goto, como una llamada de función un poco rara que tiene el marco de
llamada actual reemplazado con la persona que llama. Piense en la llamada a la API de
Linux exec() , pero para las funciones.
https://riptutorial.com/es/home 126
Capítulo 39: Variables especiales
Observaciones
PARA HACER: Añadir más contenidos.
Examples
Variables especiales en perl:
Ejemplo 1:
my @array_variable = (1 2 3 4);
foreach (@array_variable){
print $_."\n"; # $_ will get the value 1,2,3,4 in loop, if no other variable is
supplied.
}
Ejemplo 2:
while (<FH>){
chomp($_); # $_ refers to the iterating lines in the loop.
}
Ejemplo 1:
sub example_sub {
my ( $test1, $test2, $test3 ) = @_;
}
Dentro de una subrutina, la matriz @_ contiene los argumentos pasados a esa subrutina. Dentro
de una subrutina, @_ es la matriz default para los operadores de matriz pop y shift .
https://riptutorial.com/es/home 127
Capítulo 40: Verdadero y falso
Sintaxis
• undef # falso
• '' # Definido, falso
• 0 # Definido, Tiene Longitud, Falso
• '0' # definido, tiene longitud, falso
Observaciones
Perl no tiene un tipo de datos booleano, ni tiene ninguna false clave true o false como muchos
otros idiomas. Sin embargo, cada valor escalar se evaluará como verdadero o falso cuando se
evalúe en un contexto booleano (la condición en una instrucción if o un bucle while, por ejemplo).
• grep
https://riptutorial.com/es/home 128
devuelve si se encontraron elementos coincidentes o no
• @a = LIST y (LIST) = LIST devuelve si la LISTA del lado derecho produjo o no escalas
Examples
Lista de valores verdaderos y falsos
https://riptutorial.com/es/home 129
Creditos
S.
Capítulos Contributors
No
Aplicaciones GUI en
4 oldtechaa
Perl
Archivo I / O (lectura Christopher Bottoms, Denis Ibaev, Håkon Hægland, Kemi, Kent
5 y escritura de Fredric, matt freake, Nagaraju, rbennett485, SajithP, Sebi,
archivos) SREagle, Tim Hallyburton, yonyon100
Compilar el módulo
sapnwrfc de Perl
10 flotux
cpan a partir del
código fuente
Cuerdas y métodos badp, Christopher Bottoms, Denis Ibaev, digitalis_, Kent Fredric,
11
de citar. mbethke, svarog
Declaraciones de
12 callyalater, Christopher Bottoms, oals, Stephen Leppik
control
Depuración de
13 4444, Eugen Konkov
scripts Perl
https://riptutorial.com/es/home 130
Empacar y
15 Denis Ibaev, Kent Fredric, mbethke
desempacar
18 Instalacion de perl fanlim, flamey, Håkon Hægland, Iván Rodríguez Torres, luistm
Instalar módulos Perl Christopher Bottoms, Kemi, luistm, Ngoan Tran, Peter
19
a través de CPAN Mortensen, Randall
Interacción simple
con la base de datos
20 Ngoan Tran
a través del módulo
DBI.
Leyendo el
contenido de un Alien Life Form, Christopher Bottoms, digitalis_, Jeff Y, Kemi,
22
archivo en una mbethke, mob, pwes, rlandster, SREagle
variable
Manejo de
24 badp, simbabque
excepciones
Orientado a objetos
27 badp, Dmitry Egorov, Ruslan Batdalov, simbabque
Perl
https://riptutorial.com/es/home 131
badp, Christopher Bottoms, dave, digitalis_, interduo, mbethke,
33 Subrutinas
Michael Carman, msh210, Wolf, xfix, xtreak
https://riptutorial.com/es/home 132