15.03.2020 Views

perl-language-es

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Perl Language

#perl


Tabla de contenido

Acerca de 1

Capítulo 1: Empezando con Perl Language 2

Observaciones 2

Versiones 2

Examples 3

Empezando con Perl 3

Capítulo 2: Aleatoriedad 5

Observaciones 5

Examples 5

Generar un número aleatorio entre 0 y 100. 5

Generar un entero aleatorio entre 0 y 9 5

Accediendo a un elemento del array al azar 5

Capítulo 3: Análisis XML 7

Examples 7

Analizando con XML :: Twig 7

Consumiendo XML con XML :: Rabbit 8

Analizando con XML :: LibXML 10

Capítulo 4: Aplicaciones GUI en Perl 12

Observaciones 12

Examples 12

Solicitud de GTK 12

Capítulo 5: Archivo I / O (lectura y escritura de archivos) 13

Parámetros 13

Observaciones 13

Examples 13

Leyendo de un archivo 13

Escribir en un archivo 14

Abriendo una manija de archivo para leer 15

Apertura de archivos de texto ASCII genéricos 15

Apertura de archivos binarios 15


Apertura de archivos de texto UTF8 15

Leer y escribir en un archivo. 16

"use autodie" y no necesitará verificar los errores de apertura / cierre de archivos 17

autodie permite trabajar con archivos sin tener que verificar explícitamente las fallas de 17

Rebobinar un identificador de archivo 18

Lectura y escritura de archivos comprimidos gzip 18

Escribiendo un archivo comprimido 18

Leyendo de un archivo comprimido 18

Configuración de la codificación predeterminada para IO 19

Capítulo 6: Bailarín 20

Introducción 20

Examples 20

Ejemplo mas facil 20

Capítulo 7: Clasificación 21

Introducción 21

Sintaxis 21

Examples 21

Ordenación léxica básica 21

Orden numérico 22

Orden inverso 22

La transformada de Schwartzian 22

Case Insensitive Sort 23

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

1. Abrir y guardar Excel / Workbooks 25

2. Manipulación de hojas de trabajo. 26

3. Manipulación de células. 26

4. Manipulación de Filas / Columnas. 27


Capítulo 9: Comentarios 29

Examples 29

Comentarios de una sola línea 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

Ejemplo simple para probar la conexión RFC. 31

Capítulo 11: Cuerdas y métodos de citar. 33

Observaciones 33

Examples 33

Cotizaciones literales de cuerdas 33

Doble cita 33

Heredocs 35

Eliminando nuevas líneas finales 35

Capítulo 12: Declaraciones de control 37

Examples 37

Condicionales 37

Declaraciones If-else 37

Bucles 37

Capítulo 13: Depuración de scripts Perl 39

Examples 39

Ejecutar script en modo de depuración 39

Utilice un depurador no estándar 39

Capítulo 14: Dividir una cadena en separadores sin comillas 40

Examples 40

parse_line () 40

Texto :: CSV o Texto :: CSV_XS 40

NOTAS 40

Capítulo 15: Empacar y desempacar 42


Examples 42

Conversión manual de estructuras C para empaquetar sintaxis 42

Construyendo un encabezado IPv4 43

Capítulo 16: Expresiones regulares 45

Examples 45

Cuerdas a juego 45

Uso de \ Q y \ E en la coincidencia de patrones 45

Lo que está entre \ Q y \ E se trata como caracteres normales 45

Analizar una cadena con una expresión regular 46

Reemplace una cadena usando expresiones regulares 46

Capítulo 17: Fechas y hora 48

Examples 48

Crear un nuevo DateTime 48

Trabajando con elementos de fecha y hora. 48

Calcular el tiempo de ejecución del código. 49

Capítulo 18: Fechas y hora 50

Examples 50

Formato de fecha 50

Capítulo 19: Instalacion de perl 51

Introducción 51

Examples 51

Linux 51

OS X 51

Windows 52

Capítulo 20: Instalar módulos Perl a través de CPAN 53

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

Instalando módulos manualmente 53

cpanminus, el reemplazo ligero y sin configuración para cpan 54


Capítulo 21: Interacción simple con la base de datos a través del módulo DBI. 56

Parámetros 56

Examples 56

Módulo DBI 56

Capítulo 22: Interpolación en Perl 58

Examples 58

Interpolación básica 58

Lo que se interpola 58

Capítulo 23: Leyendo el contenido de un archivo en una variable 61

Examples 61

La forma manual 61

Camino :: Diminuto 61

Archivo :: Slurper 62

Archivo :: Slurp 62

Slurping un archivo en una variable de matriz 62

Archivo de slurp en una sola línea 62

Capítulo 24: Liza 64

Examples 64

Array como lista 64

Asignando una lista a un hash 64

Las listas se pueden pasar a subrutinas 65

Lista de retorno de subrutina 66

Usando arrayref para pasar array a sub 66

Hash como lista 67

Capítulo 25: Manejo de excepciones 68

Examples 68

eval y muere 68

Capítulo 26: Mejores prácticas 70

Examples 70

Utilizando Perl :: Crítico 70

Instalación 70

Uso básico 70


Políticas de visualización 71

Ignorando el código 72

Creando excepciones permanentes 73

Conclusión 73

Capítulo 27: Optimización del uso de la memoria. 75

Examples 75

Lectura de archivos: foreach vs. while 75

Procesando listas largas 75

Capítulo 28: Orientado a objetos Perl 77

Examples 77

Creando objetos 77

Definiendo clases 77

Herencia y resolución de métodos. 78

Métodos de clase y objeto 81

Definiendo clases en Perl moderno. 82

Roles 83

Capítulo 29: Paquetes y módulos 85

Sintaxis 85

Examples 85

Ejecutando los contenidos de otro archivo. 85

Cargando un módulo en tiempo de ejecución 85

Usando un modulo 86

Usando un módulo dentro de un directorio 86

CPAN.pm 87

Listar todos los módulos instalados 88

Capítulo 30: Perl one-liners 89

Examples 89

Ejecutar algún código de Perl desde la línea de comandos 89

Uso de cadenas entre comillas dobles en las líneas de Windows 89

Líneas de impresión que coinciden con un patrón (PCRE grep) 89

Reemplazar una subcadena con otra (PCRE sed) 90

Imprimir solo ciertos campos 90


Imprimir líneas 5 a 10 90

Editar archivo en el lugar 90

Leyendo todo el archivo como una cadena 90

Subir archivo a mojolicious 91

Capítulo 31: Perl Testing 92

Examples 92

Ejemplo de prueba de unidad Perl 92

Capítulo 32: Perlbrew 94

Introducción 94

Observaciones 94

Examples 94

Configurar perlbrew por primera vez 94

Crear script de configuración ~/.perlbrew.sh : 94

Crear script de instalación install_perlbrew.sh : 94

Ejecutar script de instalación: 94

Agrega al final de tu ~/.bashrc 95

Fuente ~/.bashrc : 95

Capítulo 33: Salida de depuración 96

Examples 96

Dumping estructuras de datos 96

Dumping con estilo 96

Dumping lista de matriz 97

Muestra de datos 98

Capítulo 34: Subrutinas 100

Observaciones 100

Examples 100

Creando subrutinas 100

Los argumentos de subrutina se pasan por referencia (excepto los de las firmas) 101

Subrutinas 102

Capítulo 35: Texto atribuido 104

Examples 104

Imprimiendo texto en color 104


Capítulo 36: Una forma sencilla de comprobar los módulos instalados en Mac y Ubuntu 105

Examples 105

Compruebe los módulos perl instalados a través de la terminal 105

Use perldoc para verificar la ruta de instalación del paquete Perl 105

Cómo comprobar los módulos de la lista de Perl. 105

¿Cómo comprobar la versión de un módulo instalado? 105

Capítulo 37: Unicode 106

Observaciones 106

Una advertencia sobre la codificación de nombre de archivo 106

: encoding (utf8) vs: utf8 106

UTF-8 vs utf8 vs UTF8 107

Más lectura 107

Examples 108

Crear nombres de archivos 108

Leer nombres de archivos 108

Interruptores de línea de comando para one-liners 110

Habilitar pragma utf8 110

Manejo de Unicode con interruptor -C 110

E / S estándar 110

Argumentos del guión 110

Capa PerlIO predeterminada 110

E / S estándar 111

Manijas de archivo 111

Configuración de la codificación con Open () 111

Configuración de la codificación con binmode () 111

pragma abierto 112

Configuración de la codificación con la línea de comando -C bandera 112

El pragma utf8: usando Unicode en tus fuentes 112

Manejo de UTF-8 inválido 113

Lectura inválida de UTF-8 113

Capítulo 38: Variables 115


Sintaxis 115

Examples 115

Escalares 115

Arrays 116

Hashes 117

Referencias escalares 119

Es posible que desee una referencia escalar si: 120

Referencias de Array 120

Hash Referencias 121

Typeglobs, typeglob refs, manejadores de archivos y constantes 123

Sigilos 124

Capítulo 39: Variables especiales 127

Observaciones 127

Examples 127

Variables especiales en perl: 127

Capítulo 40: Verdadero y falso 128

Sintaxis 128

Observaciones 128

Los siguientes valores se consideran falsos: 128

Todos los demás valores son verdaderos: 128

Los siguientes operadores se tratan normalmente para devolver un valor booleano en context 128

Examples 129

Lista de valores verdaderos y falsos 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 info@zzzprojects.com

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

Versión Notas de lanzamiento Fecha de lanzamiento

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

5.004 perl5004delta 1997-05-15

5.005 perl5005delta 1998-07-22

5.6.0 Perl56delta 2000-03-22

5.8.0 perl58delta 2002-07-18

5.8.8

perl581delta ,

perl582delta ,

perl583delta ,

perl584delta ,

perl585delta ,

perl586delta ,

perl587delta ,

Perl588delta

2006-02-01

5.10.0 perl5100delta 2007-12-18

https://riptutorial.com/es/home 2


Versión Notas de lanzamiento Fecha de lanzamiento

5.12.0 Perl5120delta 2010-04-12

5.14.0 perl5140delta 2011-05-14

5.16.0 perl5160delta 2012-05-20

5.18.0 Perl5180delta 2013-05-18

5.20.0 Perl5200delta 2014-05-27

5.22.0 perl5220delta 2015-06-01

5.24.0 perl5240delta 2016-05-09

5.26.0 perl5260delta 2017-05-30

Examples

Empezando con Perl

Perl intenta hacer lo que quieres decir:

print "Hello World\n";

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

use feature 'say';

say "Hello World";

La función say también se habilita automáticamente con una use v5.10 (o superior):

use v5.10;

say "Hello World";

Es bastante común simplemente usar perl en la línea de comandos usando la opción -e :

$ perl -e 'print "Hello World\n"'

Hello World

Agregar la opción -l es una forma de imprimir nuevas líneas automáticamente:

$ perl -le 'print "Hello World"'

Hello World

https://riptutorial.com/es/home 3


5.10.0

Si desea habilitar nuevas funciones , use la opción -E lugar:

$ perl -E 'say "Hello World"'

Hello World

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;

print "Hello World\n";

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 .

Lea Empezando con Perl Language en línea: https://riptutorial.com/es/perl/topic/341/empezandocon-perl-language

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.

Pase un límite superior como argumento a la función rand ().

Entrada:

my $upper_limit = 100;

my $random = rand($upper_limit);

print $random . "\n";

Salida:

Un número aleatorio de punto flotante, como ...

45.8733038119139

Generar un entero aleatorio entre 0 y 9

Emitir su número de punto flotante aleatorio como un int.

Entrada:

my $range = 10;

# create random integer as low as 0 and as high as 9

my $random = int(rand($range)); # max value is up to but not equal to $range

print $random . "\n";

Salida:

Un entero aleatorio, como ...

0

Véase también el perldoc para rand .

Accediendo a un elemento del array al azar

https://riptutorial.com/es/home 5


my @letters = ( 'a' .. 'z' );

# English ascii-bet

print $letters[ rand @letters ] for 1 .. 5; # prints 5 letters at random

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

(El mismo principio se aplica a los hashes)

my %colors = ( red => 0xFF0000,

green => 0x00FF00,

blue => 0x0000FF,

);

print ( values %colors )[rand keys %colors];

Lea Aleatoriedad en línea: https://riptutorial.com/es/perl/topic/6905/aleatoriedad

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;

my $twig = XML::Twig->parse( \*DATA );

#we can use the 'root' method to find the root of the XML.

my $root = $twig->root;

#first_child finds the first child element matching a value.

my $title = $root->first_child('title');

#text reads the text of the element.

my $title_text = $title->text;

print "Title is: ", $title_text, "\n";

#The above could be combined:

print $twig ->root->first_child_text('title'), "\n";

## You can use the 'children' method to iterate multiple items:

my $list = $twig->root->first_child('list');

#children can optionally take an element 'tag' - otherwise it just returns all of them.

foreach my $element ( $list->children ) {

}

#the 'att' method reads an attribute

print "Element with ID: ", $element->att('id') // 'none here', " is ", $element->text,

"\n";

#And if we need to do something more complicated, we an use 'xpath'.

#get_xpath or findnodes do the same thing:

#return a list of matches, or if you specify a second numeric argument, just that numbered

match.

#xpath syntax is fairly extensive, but in this one - we search:

# anywhere in the tree: //

#nodes called 'item'

#with an id attribute [@id]

#and with that id attribute equal to "1000".

#by specifying '0' we say 'return just the first match'.

print "Item 1000 is: ", $twig->get_xpath( '//item[@id="1000"]', 0 )->text, "\n";

#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>

Consumiendo XML con XML :: Rabbit

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;

say "Showing data information";

my $bookstore = Bookstore->new( file => './sample.xml' );

foreach my $book( @{$bookstore->books} ) {

say "ID: " . $book->bookid;

say "Title: " . $book->title;

say "Author: " . $book->author, "\n";

}

Notas:

Por favor tenga cuidado con lo siguiente:

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:

foreach my $book( @{$bookstore->books} ) {

say "ID: " . $book->bookid;

say "Title: " . $book->title;

say "Author: " . $book->author;

try {

say "Purchase price: ". $book->purchase_data->price, "\n";

} catch {

say "No purchase price available\n";

}

}

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>

Analizando con XML :: LibXML

# This uses the 'sample.xml' given in the XML::Twig example.

# Module requirements (1.70 and above for use of load_xml)

use XML::LibXML '1.70';

# let's be a good perl dev

use strict;

use warnings 'all';

# Create the LibXML Document Object

my $xml = XML::LibXML->new();

# Where we are retrieving the XML from

my $file = 'sample.xml';

# Load the XML from the file

my $dom = XML::LibXML->load_xml(

location => $file

);

# get the docroot

https://riptutorial.com/es/home 10


my $root = $dom->getDocumentElement;

# if the document has children

if($root->hasChildNodes) {

# getElementsByLocalName returns a node list of all elements who's

# localname matches 'title', and we want the first occurrence

# (via get_node(1))

my $title = $root->getElementsByLocalName('title');

if(defined $title) {

# Get the first matched node out of the nodeList

my $node = $title->get_node(1);

# Get the text of the target node

my $title_text = $node->textContent;

}

print "The first node with name 'title' contains: $title_text\n";

}

# The above calls can be combined, but is possibly prone to errors

# (if the getElementsByLocalName() failed to match a node).

#

# my $title_text = $root->getElementsByLocalName('title')->get_node(1)->textContent;

# Using Xpath, get the price of the book with id 'bk104'

#

# Set our xpath

my $xpath = q!/catalog/book[@id='bk104']/price!;

# Does that xpath exist?

if($root->exists($xpath)) {

# Pull in the twig

my $match = $root->find($xpath);

if(defined $match) {

# Get the first matched node out of the nodeList

my $node = $match->get_node(1);

# pull in the text of that node

my $match_text = $node->textContent;

}

}

print "The price of the book with id bk104 is: $match_text\n";

Lea Análisis XML en línea: https://riptutorial.com/es/perl/topic/3590/analisis-xml

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;

use Gtk2 -init;

my $window = Gtk2::Window->new();

$window->show();

Gtk2->main();

0;

Lea Aplicaciones GUI en Perl en línea: https://riptutorial.com/es/perl/topic/5924/aplicaciones-guien-perl

https://riptutorial.com/es/home 12


Capítulo 5: Archivo I / O (lectura y escritura

de archivos)

Parámetros

Modo

>

>>

Explicacion

Escribir (trunc) . Sobrescribirá los archivos existentes. Crea un nuevo archivo si no

se encontró ningún archivo

Escribir (adjuntar) . No sobrescribirá los archivos, sino que agregará contenido

nuevo al final. También creará un archivo si se utiliza para abrir un archivo no

existente.

< Leer Abre el archivo en modo de solo lectura.

+< Leer / Escribir . No creará ni truncará el archivo.

+> Lectura / Escritura (trunc) . Creará y truncará el archivo.

+>> Leer / Escribir (añadir) . Creará pero no truncará el archivo.

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:

• read usa caracteres para sus parámetros de longitud y desplazamiento

• seek y tell usar siempre bytes para posicionamiento

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

}

# ...or read whole file into an array in one go

chomp(my @fileArray = <$fh>);

Si sabe que su archivo de entrada es UTF-8, puede especificar la codificación:

open my $fh, '<:encoding(utf8)', $filename or die "Failed to open file: $filename";

Después de terminar de leer el archivo, se debe cerrar el identificador de archivo:

close $fh or warn "close failed: $!";

Ver también: Leer un archivo en una variable.

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

Ver también: [Leyendo un archivo con sorbete]

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 :

# Print "Hello" to $fh ("output.txt").

print $fh "Hello";

# Don't forget to close the file once we're done!

close $fh or warn "Close failed: $!";

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.

Abriendo una manija de archivo para leer

Apertura de archivos de texto ASCII genéricos

5.6.0

open my $filehandle, '<', $name_of_file or die "Can't open $name_of_file, $!";

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.

En Windows, el decodificador predeterminado es un filtro "CRLF", que asigna cualquier secuencia

"\ r \ n" en la entrada a "\ n"

Apertura de archivos binarios

5.8.0

open my $filehandle, '<:raw', 'path/to/file' or die "Can't open $name_of_file, $!";

Esto especifica que Perl no debe realizar una traducción de CRLF en Windows.

Apertura de archivos de texto UTF8

5.8.0

open my $filehandle, '<:raw:encoding(utf-8)', 'path/to/file'

or die "Can't open $name_of_file, $!";

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! $!";

while(my $row = <$file_handle>) {

print chomp($row), "\n";

}

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! $!";

print $file_handle "Writing to a 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

read(FILEHANDLE, SCALAR, LENGTH, OFFSET)

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.

read($file_handle, $data, 16, 0);

Lee 16 caracteres desde el principio del archivo en $data .

"use autodie" y no necesitará verificar los errores de apertura / cierre de

archivos

autodie permite trabajar con archivos sin tener que verificar

explícitamente las fallas de apertura / cierre.

Desde Perl 5.10.1, autodie ha estado disponible en Core Perl. Cuando se utiliza, Perl buscará

automáticamente errores al abrir y cerrar archivos.

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

open(my $fh_in, '<', "input.txt"); # check for failure is automatic

# open a file for appending (i.e. using ">>")

open( my $fh_log, '>>', "output.log"); # check for failure is automatic

while (my $line = readline $fh_in) # also works: while (my $line = <$fh_in>)

{

# remove newline

chomp $line;

}

# write to log file

say $fh_log $line or die "failed to print '$line'"; # autodie doesn't check print

# Close the file handles (check for failure is automatic)

close $fh_in;

close $fh_log;

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 .

Rebobinar un identificador de archivo

A veces es necesario dar marcha atrás después de leer.

# identify current position in file, in case the first line isn't a comment

my $current_pos = tell;

while (my $line = readline $fh)

{

if ($line =~ /$START_OF_COMMENT_LINE/)

{

push @names, get_name_from_comment($line);

}

else {

last; # break out of the while loop

}

$current_pos = tell; # keep track of current position, in case we need to rewind the next

line read

}

# Step back a line so that it can be processed later as the first data line

seek $fh, $current_pos, 0;

Lectura y escritura de archivos comprimidos gzip

Escribiendo un archivo comprimido

Para escribir un archivo comprimido, use el módulo IO::Compress::Gzip y cree un identificador de

archivo creando una nueva instancia de IO::Compress::Gzip para el archivo de salida deseado:

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

print $fh_out "Hello World!\n";

close $fh_out;

use IO::Compress::Gzip;

Leyendo de un archivo comprimido

Para leer un archivo comprimido, use el módulo IO::Uncompress::Gunzip y luego cree un

identificador de archivo creando una nueva instancia de IO::Uncompress::Gunzip para el archivo de

entrada:

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

my $line = readline $fh_in;

print $line;

Configuración de la codificación predeterminada para IO

# encode/decode UTF-8 for files and standard input/output

use open qw( :encoding(UTF-8) :std );

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 .

Lea Archivo I / O (lectura y escritura de archivos) en línea:

https://riptutorial.com/es/perl/topic/1604/archivo-i---o--lectura-y-escritura-de-archivoshttps://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.

Está inspirado en Sinatra y escrito por Alexis Sukrieh.

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;

get '/' => sub {

"Hello World!"

};

dance;

Lea Bailarín en línea: https://riptutorial.com/es/perl/topic/5921/bailarin

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

@sorted = sort @list;

@sorted = sort { $a cmp $b } @list;

sub compare { $a cmp $b }

@sorted = sort compare @list;

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.

Si use locale , cmp tiene en cuenta el orden de intercalación específico de la configuración

regional, por ejemplo, clasificará Å como A en una configuración regional danesa, pero después de

Z en una configuración inglesa o alemana. Sin embargo, no tiene en cuenta las reglas de

clasificación de Unicode más complejas ni ofrece ningún control sobre el pedido; por ejemplo, las

guías telefónicas a menudo se clasifican de forma diferente a los diccionarios. Para esos casos,

se recomiendan los módulos Unicode::Collate y particularmente Unicode::Collate::Locale .

https://riptutorial.com/es/home 21


Orden numérico

@sorted = sort { $a <=> $b } @list;

La comparación de $a y $b con el operador <=> garantiza que se comparen numéricamente y no

textualmente como por defecto.

Orden inverso

@sorted = sort { $b <=> $a } @list;

@sorted = reverse sort { $a <=> $b } @list;

Clasificación de elementos en orden descendente, simplemente se puede lograr mediante el

canje $a y $b en el bloque comparador. Sin embargo, algunas personas prefieren la claridad de un

reverse separado aunque sea un poco más lento.

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.

# What you would usually do

@sorted = sort { slow($a) <=> slow($b) } @list;

# What you do to make it faster

@sorted =

map { $_->[0] }

sort { $a->[1] <=> $b->[1] }

map { [ $_, slow($_) ] }

@list;

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.

Entra en el truco de Randall Schwartz.

La Transformación de Schwartz, básicamente, empuja @list través de tres funciones, de abajo

hacia arriba. El primer map convierte cada entrada en una lista de dos elementos del elemento

original y el resultado de la función lenta como una clave de ordenación, por lo que al final de esto

llamamos slow() exactamente una vez para cada elemento. La siguiente sort puede simplemente

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 .

Case Insensitive Sort

La técnica tradicional para hacer sort ignorar caso es pasar cadenas a lc o uc para la

comparación:

@sorted = sort { lc($a) cmp lc($b) } @list;

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:

@sorted = sort { fc($a) cmp fc($b) } @list;

Lea Clasificación en línea: https://riptutorial.com/es/perl/topic/8958/clasificacion

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

Celda 1

(requerido)

Cell2

(opcional)

Detalles

El nombre del rango. Esta debe ser una referencia de estilo A1 en el idioma

de la macro. Puede incluir el operador de rango (dos puntos), el operador

de intersección (un espacio) o el operador de unión (una coma).

Si se especifica, Cell1 corresponde a la esquina superior izquierda del

rango y Cell2 corresponde a la esquina inferior derecha del rango

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/enus/library/aa221100%28office.11%29.aspx

Enlaces desde Win32 :: módulo OLE: http://search.cpan.org/~jdb/Win32-OLE-

0.1712/lib/Win32/OLE.pm#EXAMPLES

Puede encontrar información útil sobre el uso de Excel en esta dirección

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;

#Need to use absolute path for Excel files

my $excel_file = abs_path("$Excel_path") or die "Error: the file $Excel_path has not been

found\n";

# Open Excel application

my $Excel = Win32::OLE->GetActiveObject('Excel.Application')

https://riptutorial.com/es/home 25


|| Win32::OLE->new('Excel.Application', 'Quit');

# Open Excel file

my $Book = $Excel->Workbooks->Open($excel_file);

#Make Excel visible

$Excel->{Visible} = 1;

#___ ADD NEW WORKBOOK

my $Book = $Excel->Workbooks->Add;

my $Sheet = $Book->Worksheets("Sheet1");

$Sheet->Activate;

#Save Excel file

$Excel->{DisplayAlerts}=0; # This turns off the "This file already exists" message.

$Book->Save; #Or $Book->SaveAs("C:\\file_name.xls");

$Book->Close; #or $Excel->Quit;

2. Manipulación de hojas de trabajo.

#Get the active Worksheet

my $Book = $Excel->Activewindow;

my $Sheet = $Book->Activesheet;

#List of Worksheet names

my @list_Sheet = map { $_->{'Name'} } (in $Book->{Worksheets});

#Access a given Worksheet

my $Sheet = $Book->Worksheets($list_Sheet[0]);

#Add new Worksheet

$Book->Worksheets->Add({After => $workbook->Worksheets($workbook->Worksheets->{Count})});

#Change Worksheet Name

$Sheet->{Name} = "Name of Worksheet";

#Freeze Pane

$Excel -> ActiveWindow -> {FreezePanes} = "True";

#Delete Sheet

$Sheet -> Delete;

3. Manipulación de células.

#Edit the value of a cell (2 methods)

$Sheet->Range("A1")->{Value} = 1234;

$Sheet->Cells(1,1)->{Value} = 1234;

#Edit the values in a range of cells

$Sheet->Range("A8:C9")->{Value} = [[ undef, 'Xyzzy', 'Plugh' ],

[ 42, 'Perl', 3.1415 ]];

#Edit the formula in a cell (2 types)

$Sheet->Range("A1")->{Formula} = "=A1*9.81";

$Sheet->Range("A3")->{FormulaR1C1} = "=SUM(R[-2]C:R[-1]C)";

$Sheet->Range("C1")->{FormulaR1C1} = "=SUM(RC[-2]:RC[-1])";

# Sum of rows

# Sum of columns

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;

#Edit the number format

$Sheet -> Range("G7:H7") -> {NumberFormat} = "\@";

# Text

$Sheet -> Range("A1:H7") -> {NumberFormat} = "\$#,##0.00";

# Currency

$Sheet -> Range("G7:H7") -> {NumberFormat} = "\$#,##0.00_);[Red](\$#,##0.00)"; # Currency

- red negatives

$Sheet -> Range("G7:H7") -> {NumberFormat} = "0.00_);[Red](0.00)";

# Numbers

with decimals

$Sheet -> Range("G7:H7") -> {NumberFormat} = "#,##0"; # Numbers

with commas

$Sheet -> Range("G7:H7") -> {NumberFormat} = "#,##0_);[Red](#,##0)";

# Numbers

with commas - red negatives

$Sheet -> Range("G7:H7") -> {NumberFormat} = "0.00%";

# Percents

$Sheet -> Range("G7:H7") -> {NumberFormat} = "m/d/yyyy"

# Dates

#Align text

$Sheet -> Range("G7:H7") -> {HorizontalAlignment} = xlHAlignCenter;

text;

$Sheet -> Range("A1:A2") -> {Orientation} = 90;

text

# Center

# Rotate

#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

4. Manipulación de Filas / Columnas.

#Insert a row before/after line 22

$Sheet->Rows("22:22")->Insert(xlUp, xlFormatFromRightOrBelow);

$Sheet->Rows("23:23")->Insert(-4121,0); #xlDown is -4121 and that xlFormatFromLeftOrAbove

is 0

#Delete a row

$Sheet->Rows("22:22")->Delete();

#Set column width and row height

$Sheet -> Range('A:A') -> {ColumnWidth} = 9.14;

$Sheet -> Range("8:8") -> {RowHeight} = 30;

$Sheet -> Range("G:H") -> {Columns} -> Autofit;

# Get the last row/column

my $last_row = $Sheet -> UsedRange -> Find({What => "*", SearchDirection => xlPrevious,

SearchOrder => xlByRows}) -> {Row};

https://riptutorial.com/es/home 27


my $last_col = $Sheet -> UsedRange -> Find({What => "*", SearchDirection => xlPrevious,

SearchOrder => xlByColumns}) -> {Column};

#Add borders (method 1)

$Sheet -> Range("A3:H3") -> Borders(xlEdgeBottom) -> {LineStyle} = xlDouble;

$Sheet -> Range("A3:H3") -> Borders(xlEdgeBottom) -> {Weight} = xlThick;

$Sheet -> Range("A3:H3") -> Borders(xlEdgeBottom) -> {ColorIndex} = 1;

$Sheet -> Range("A3:H3") -> Borders(xlEdgeLeft)

-> {LineStyle} = xlContinuous;

$Sheet -> Range("A3:H3") -> Borders(xlEdgeLeft) -> {Weight} = xlThin;

$Sheet -> Range("A3:H3") -> Borders(xlEdgeTop)

-> {LineStyle} = xlContinuous;

$Sheet -> Range("A3:H3") -> Borders(xlEdgeTop) -> {Weight} = xlThin;

$Sheet -> Range("A3:H3") -> Borders(xlEdgeBottom) -> {LineStyle} = xlContinuous;

$Sheet -> Range("A3:H3") -> Borders(xlEdgeBottom) -> {Weight} = xlThin;

$Sheet -> Range("A3:H3") -> Borders(xlEdgeRight) -> {LineStyle} = xlContinuous;

$Sheet -> Range("A3:H3") -> Borders(xlEdgeRight) -> {Weight} = xlThin;

$Sheet -> Range("A3:H3") -> Borders(xlInsideVertical) -> {LineStyle} = xlDashDot

$Sheet -> Range("A3:H3") -> Borders(xlInsideVertical) -> {Weight} = xlMedium;

$Sheet -> Range("A3:I3") -> Borders(xlInsideHorizontal) -> {LineStyle} = xlContinuous;

$Sheet -> Range("A3:I3") -> Borders(xlInsideHorizontal) -> {Weight} = xlThin;

#Add borders (method 2)

my @edges = qw (xlInsideHorizontal xlInsideVertical xlEdgeBottom xlEdgeTop xlEdgeRight);

foreach my $edge (@edges)

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----moduloole

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

my $foo = "bar"; # This is also 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).

Cualquier texto entre los marcadores será comentado:

=begin comment

This is another comment.

And it spans multiple lines!

=end comment

=cut

Lea Comentarios en línea: https://riptutorial.com/es/perl/topic/6815/comentarios

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.

Descargue la versión actual de SAP NW RFC SDK x64 bit desde

https://launchpad.support.sap.com/#/softwarecenter

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

En mi caso la versión actual era 7.20 PL42 x64.

Extraiga el archivo descargado con sapcar -xvf NWRFC_42-20004568.SAR

C:\nwrfcsdk_x64 el nombre de la carpeta a C:\nwrfcsdk_x64

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

En el directorio de direcciones C: \ nwrfcsdk_x64 \ lib deben existir los siguientes archivos:

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 símbolo del sistema con cmd.exe e inicie el programa cpan .

Inicie el comando get sapnwrfc para descargar el módulo Perl sapnwrfc desde CPAN.

Salga del entorno cpan con el comando exit . Cambie el directorio a

C:\Strawberry\cpan\build\sapnwrfc-0.37-0 .

Construye los Makefile (s) con el siguiente comando. Adapte los nombres de las carpetas de

acuerdo a su configuración.

perl Makefile.PL --source=C:\nwrfcsdk_x64 --addlibs "C:\nwrfcsdk_x64\lib\sapnwrfc.a

C:\nwrfcsdk_x64\lib\libsapucum.a"

Ejecute los comandos dmake y dmake install para compilar e instalar el módulo.

Copie los archivos de C:\nwrfcsdk_x64\lib en C:\Strawberry\perl\site\lib\auto\SAPNW\Connection .

Examples

Ejemplo simple para probar la conexión RFC.

Ejemplo simple de http://search.cpan.org/dist/sapnwrfc/sapnwrfc-cookbook.pod

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

}

print "Program name: ".$rc->PROG_INF->{'PROGNAME'}."\n";

my $cnt_lines_with_text = scalar grep(/LGRFCUXX/, map { $_->{LINE} } @{$rc->SOURCE_EXTENDED});

$conn->disconnect;

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-delcodigo-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

Los literales de cadena no implican escape o interpolación (con la excepción de citar

terminadores de cadena)

print 'This is a string literal\n'; # emits a literal \ and n to terminal

print 'This literal contains a \'postraphe '; # emits the ' but not its preceding \

Puedes usar mecanismos de cotización alternativos para evitar choques:

print q/This is is a literal \' <-- 2 characters /; # prints both \ and '

print q^This is is a literal \' <-- 2 characters ^; # also

Ciertos caracteres de comillas elegidos son "equilibrados"

print q{ This is a literal and I contain { parens! } }; # prints inner { }

Doble cita

Las cadenas de comillas dobles utilizan la interpolación y el escape , a diferencia de las

cadenas de comillas simples. Para citar una cadena, use comillas dobles " o el operador qq .

my $greeting = "Hello!\n";

print $greeting;

# => Hello! (followed by a linefeed)

my $bush = "They misunderestimated me."

print qq/As Bush once said: "$bush"\n/;

# => As Bush once said: "They misunderestimated me." (with linefeed)

El qq es útil aquí, para evitar tener que escapar de las comillas. Sin él, tendríamos que escribir ...

print "As Bush once said: \"$bush\"\n";

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

use feature 'say';

say qq/You can use slashes.../;

say qq{...or braces...};

say qq^...or hats...^;

say qq|...or pipes...|;

# say qq ...but not whitespace. ;

También puede interpolar arrays en cadenas.

use feature 'say';

my @letters = ('a', 'b', 'c');

say "I like these letters: @letters.";

# => I like these letters: a b c.

Por defecto, los valores están separados por espacios, porque la variable especial $"

predeterminada en un solo espacio. Esto, por supuesto, se puede cambiar.

use feature 'say';

my @letters = ('a', 'b', 'c');

{local $" = ", "; say "@letters"; }

# a, b, c

Si lo prefiere, tiene la opción de use English y cambiar $LIST_SEPARATOR en $LIST_SEPARATOR lugar:

use v5.18; # English should be avoided on older Perls

use English;

my @letters = ('a', 'b', 'c');

{ local $LIST_SEPARATOR = "\n"; say "My favourite letters:\n\n@letters" }

Para algo más complejo que esto, debes usar un bucle en su lugar.

say "My favourite letters:";

say;

for my $letter (@letters) {

say " - $letter";

}

La interpolación no funciona con hashes.

use feature 'say';

my %hash = ('a', 'b', 'c', 'd');

say "This doesn't work: %hash"

# This doesn't work: %hash

Algunos códigos abusan de la interpolación de referencias - evítalo .

https://riptutorial.com/es/home 34


use feature 'say';

say "2 + 2 == @{[ 2 + 2 ]}";

say "2 + 2 == ${\( 2 + 2 )}";

# 2 + 2 = 4 (avoid this)

# 2 + 2 = 4 (avoid this)

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.

En su lugar, considere escribir:

• say "2 + 2 == " . 2 + 2;

my $result = 2 + 2; say "2 + 2 == $result"

Heredocs

Las cadenas grandes de líneas múltiples son gravosas para escribir.

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.

Y los Heredocs Interpolados funcionan de la misma manera.

my $variable = <<"I Want it to End";

this block of text is interpreted.

quotes\nare interpreted, and $interpolations

get interpolated...

but still, left-aligned "I Want it to End" matters.

I Want it to End

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

Eliminando nuevas líneas finales

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

my $str = "Hello World\n\n";

my $removed = chomp($str);

print $str; # "Hello World\n"

print $removed; # 1

# chomp again, removing another newline

$removed = chomp $str;

print $str; # "Hello World"

print $removed; # 1

# chomp again, but no newline to remove

$removed = chomp $str;

print $str; # "Hello World"

print $removed; # 0

También puedes chomp más de una cadena a la vez:

my @strs = ("Hello\n", "World!\n\n"); # one newline in first string, two in second

my $removed = chomp(@strs); # @strs is now ("Hello", "World!\n")

print $removed; # 2

$removed = chomp(@strs); # @strs is now ("Hello", "World!")

print $removed; # 1

$removed = chomp(@strs); # @strs is still ("Hello", "World!")

print $removed; # 0

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:

while (my $line = readline $fh)

{

chomp $line;

}

# now do something with $line

my @lines = readline $fh2;

chomp (@lines); # remove newline from end of each line

Lea Cuerdas y métodos de citar. en línea: https://riptutorial.com/es/perl/topic/1984/cuerdas-ymetodos-de-citar-

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

La estructura básica de una sentencia if es así:

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!"; }

# Can also be written this way

print "$number is greater than four!" if $number > 4;

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

}

#Can also be written as

foreach my $num (@numbers) {

print "$num\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.

while (my $line = readline $fh) {

say $line;

}

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

Lea Declaraciones de control en línea: https://riptutorial.com/es/perl/topic/4896/declaraciones-decontrol

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

Si se especifica t , le indica al depurador que se utilizarán hilos en el código que se está

depurando:

$perl -dt script.pl

Información adicional en perldoc perlrun

Utilice un depurador no estándar

$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 .

Por ejemplo, -d:NYTProf ejecuta el programa utilizando el perfilador Devel::NYTProf .

Ver todos los módulos de Devel disponibles aquí

Módulos recomendados:

• Devel::NYTProf - Potente y rápido generador de perfiles de código fuente Perl

• Devel::Trepan - Un depurador Perl modular tipo gdb

• Devel::MAT - Herramienta de análisis de memoria Perl

• Devel::hdb - Depurador Perl como página web y servicio REST

• Devel::DebugHooks::KillPrint - Permite olvidarse de la depuración mediante print

declaración print

• Devel::REPL - Un shell interactivo moderno de Perl

• Devel::Cover - Métricas de cobertura de código para Perl

Lea Depuración de scripts Perl en línea: https://riptutorial.com/es/perl/topic/6769/depuracion-descripts-perl

https://riptutorial.com/es/home 39


Capítulo 14: Dividir una cadena en

separadores sin comillas

Examples

parse_line ()

Usando parse_line() de Text :: ParseWords :

use 5.010;

use Text::ParseWords;

my $line = q{"a quoted, comma", word1, word2};

my @parsed = parse_line(',', 1, $line);

say for @parsed;

Salida:

"a quoted, comma"

word1

word2

Texto :: CSV o Texto :: CSV_XS

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.

my $csv = Text::CSV_XS->new({sep_char => $sep_char, allow_whitespace=>1});

https://riptutorial.com/es/home 40


Salida:

a quoted, comma

word1

word2

• La biblioteca admite el escape de caracteres especiales (comillas, separadores)

• La biblioteca admite caracteres de separación, caracteres de comillas y caracteres de

escape configurables

Documentación en: http://search.cpan.org/perldoc/Text::CSV

Lea Dividir una cadena en separadores sin comillas en línea:

https://riptutorial.com/es/perl/topic/2115/dividir-una-cadena-en-separadores-sin-comillas

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. */

};

cpp un baile con cpp para encontrar lo que realmente significa:

cpp -E /usr/include/time.h -o /dev/stdout | grep __time_t

# typedef long int __time_t;

cpp -E /usr/include/time.h -o /dev/stdout | grep __syscall_slong_t

# typedef long int __syscall_slong_t

Así que es un int (firmado)

echo 'void main(){ printf("%#lx\n", sizeof(__syscall_slong_t)); }' |

gcc -x c -include stdio.h -include time.h - -o /tmp/a.out && /tmp/a.out

# 0x8

Y toma 8 bytes. Así que 64bit firmó int. Y estoy en un procesador de 64 bits. =)

Perldoc pack dice

q A signed quad (64-bit) value.

Así que para empacar un timespec:

sub packtime {

my ( $config ) = @_;

return pack 'qq', @{$config}{qw( tv_sec tv_nsec )};

}

Y para descomprimir un timepec:

sub unpacktime {

my ( $buf ) = @_;

https://riptutorial.com/es/home 42


}

my $out = {};

@{$out}{qw( tv_sec tv_nsec )} = unpack 'qq', $buf;

return $out;

Ahora puedes usar esas funciones en su lugar.

my $timespec = packtime({ tv_sec => 0, tv_nsec => 0 });

syscall( ..., $timespec ); # some syscall that reads timespec

later ...

syscall( ..., $timespec ); # some syscall that writes timespec

print Dumper( unpacktime( $timespec ));

Construyendo un encabezado IPv4

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

La parte obligatoria de un encabezado IP es de 20 octetos (AKA "bytes") de largo. Como puede

ver detrás de este enlace, la dirección IP de origen y destino constituyen los dos últimos valores

de 32 bits en el encabezado. Entre los otros campos hay algunos con 16 bits, algunos con 8 bits y

algunos fragmentos más pequeños entre 2 y 13 bits.

Suponiendo que tenemos las siguientes variables para incluir en nuestro encabezado:

my ($dscp, $ecn, $length,

$id, $flags, $frag_off,

$ttl, $proto,

$src_ip,

$dst_ip);

Tenga en cuenta que faltan tres campos del encabezado:

• La versión es siempre 4 (es IPv4 después de todo)

• IHL es 5 en nuestro ejemplo ya que no tenemos un campo de opciones ; La longitud se

especifica en unidades de 4 octetos, por lo que 20 octetos dan una longitud de 5.

• La suma de control se puede dejar en 0. En realidad, tendríamos que calcularlo, pero el

código para hacer esto no nos concierne aquí.

Podríamos probar y usar operaciones de bits para construir, por ejemplo, los primeros 32 bits:

my $hdr = 4 << 28 | 5 << 24 | $dscp << 18 | $ecn << 16 | $length;

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:

Modelo Argumento Observaciones

n

B16

$id

sprintf("%03b%013b",

$flags, $frag_off)

Igual que DSCP / ECN

C2 $ttl, $proto Dos octetos sin firmar consecutivos

n

0 / $checksum

x podría utilizarse para insertar un byte nulo, pero n

nos permite especificar un argumento en el caso de

que decidamos calcular una suma de comprobación

N2

$src_ip, $dst_ip

¡use a4a4 para empaquetar el resultado de dos

llamadas gethostbyname() como ya está en Orden de

bytes de red!

Entonces, la llamada completa para empaquetar un encabezado IPv4 sería:

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

);

Lea Empacar y desempacar en línea: https://riptutorial.com/es/perl/topic/1983/empacar-ydesempacar

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:

my $str = "hello world";

print "Hi, yourself!\n" if $str =~ /^hello/;

/^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";

print "Ahoy!\n" if /^hello/;

También puede usar diferentes delimitadores si precede la expresión regular con el operador m :

m~^hello~;

m{^hello};

m|^hello|;

Esto es útil cuando se combinan cadenas que incluyen el carácter / :

print "user directory" if m|^/usr|;

Uso de \ Q y \ E en la coincidencia de patrones

Lo que está entre \ Q y \ E se trata como caracteres normales

#!/usr/bin/perl

my $str = "hello.it's.me";

my @test = (

"hello.it's.me",

"hello/it's!me",

);

sub ismatched($) { $_[0] ? "MATCHED!" : "DID NOT MATCH!" }

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

foreach my $method (@match) {

my($name,$match) = @$method;

print " - $name: ", $match->(), "\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!

Analizar una cadena con una expresión regular

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'

Querrás ver el resultado:

1,2, [3 | 4 | 5], 5,6, [7 | 8], [1 | 2 | 34], 5

Reemplace una cadena usando expresiones regulares

s/foo/bar/;

# replace "foo" with "bar" in $_

my $foo = "foo";

$foo =~ s/foo/bar/; # do the above on a different variable using the binding operator =~

s~ foo ~ bar ~; # using ~ as a delimiter

$foo = s/foo/bar/r; # non-destructive r flag: returns the replacement string without modifying

https://riptutorial.com/es/home 46


the variable it's bound to

s/foo/bar/g; # replace all instances

Lea Expresiones regulares en línea: https://riptutorial.com/es/perl/topic/3108/expresionesregulares

https://riptutorial.com/es/home 47


Capítulo 17: Fechas y hora

Examples

Crear un nuevo DateTime

Instale DateTime en su PC y luego utilícelo en el script perl:

use DateTime;

Crear nueva fecha y hora actual

$dt = DateTime->now( time_zone => 'Asia/Ho_Chi_Minh');

Luego puedes acceder a los valores de fecha y hora de los elementos:

$year = $dt->year;

$month = $dt->month;

$day = $dt->day;

$hour = $dt->hour;

$minute = $dt->minute;

$second = $dt->second;

Para obtener solo el tiempo:

my $time = $dt->hms; #tiempo de vuelta con formato hh:mm:ss

Para obtener solo la fecha:

my $date = $dt->ymd; # fecha de regreso con el formato yyyy-mm-dd

Trabajando con elementos de fecha y hora.

Establecer elemento único:

$dt->set( year => 2016 );

Establecer muchos elementos:

$dt->set( year => 2016, 'month' => 8);

Añadir duración a datetime

$dt->add( hour => 1, month => 2)

Resta de fecha y hora:

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

Obtendrá el resultado es de 4 días.

Calcular el tiempo de ejecución del código.

use Time::HiRes qw( time );

my $start = time();

#Code for which execution time is calculated

sleep(1.2);

my $end = time();

printf("Execution Time: %0.02f s\n", $end - $start);

Esto imprimirá el tiempo de ejecución del Código en segundos.

Lea Fechas y hora en línea: https://riptutorial.com/es/perl/topic/5920/fechas-y-hora

https://riptutorial.com/es/home 49


Capítulo 18: Fechas y hora

Examples

Formato de fecha

Time :: Piece está disponible en Perl 5 después de la versión 10

use Time::Piece;

my $date = localtime->strftime('%m/%d/%Y');

print $date;

Output

07/26/2016

Lea Fechas y hora en línea: https://riptutorial.com/es/perl/topic/5923/fechas-y-hora

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.

Utilice Perlbrew si desea cambiar fácilmente entre diferentes versiones de Perl.

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

Hay más de una forma de hacerlo:

• Usando el gestor de paquetes:

sudo apt install perl

• Instalación desde la fuente:

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

• Instalar en su directorio de inicio $ (no es necesario sudo) con Perlbrew :

wget -O - https://install.perlbrew.pl | bash

OS X

Ver también Perlbrew.

Hay varias opciones:

• Perlbrew

# You need to install Command Line Tools for Xcode

curl -L https://install.perlbrew.pl | bash

https://riptutorial.com/es/home 51


• Perlbrew con soporte de hilo:

# You need to install Command Line Tools for Xcode

curl -L https://install.perlbrew.pl | bash

Después de la instalación de Perlbrew, si desea instalar Perl con soporte para subprocesos,

simplemente ejecute:

perlbrew install -v perl-5.26.0 -Dusethreads

• Desde la fuente:

tar -xzf perl-version.tar.gz

cd perl-version

./Configure -de

make

make test

make install

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 .

Véase también berrybrew - perlbrew para Windows Strawberry Perl

Lea Instalacion de perl en línea: https://riptutorial.com/es/perl/topic/9317/instalacion-de-perl

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:

cpan install DBI

A esto le seguirán posiblemente muchas páginas de resultados que describan exactamente lo

que está haciendo para instalar el módulo. Dependiendo de los módulos que se estén instalando,

puede hacer una pausa y hacerle preguntas.

Shell interactivo

También puedes ingresar un "shell" así:

perl -MCPAN -e "shell"

Producirá salida como abajo:

Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v2.00)

Enter 'h' for help.

cpan[1]>

Luego, puede instalar los módulos que desee con el comando easy install <module> .

Ejemplo: cpan[1]> install DBI

Después de instalar con éxito, escriba exit para salir.

Instalando módulos manualmente

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

Luego, si la distribución del módulo contiene un archivo Makefile.PL , ejecute:

perl Makefile.PL INSTALL_BASE=$HOME/perl

make

make test

make install

o si tiene un archivo Build.PL lugar de un Makefile.PL :

perl Build.PL --install_base $HOME/perl

perl Build

perl Build test

perl Build install

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

cpanminus, el reemplazo ligero y sin configuración para cpan

Uso

Para instalar un módulo (asumiendo que cpanm ya está instalado):

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 .

Con --installdeps lo hará:

1. Escanear e instalar las dependencias configure_requires desde

• META.json

• META.yml (si falta META.json)

2. Genere el proyecto (equivalente a perl Build.PL ), generando archivos MYMETA

3. Escanear e instalar requiere dependencias de cualquiera

https://riptutorial.com/es/home 54


• MYMETA.json

• MYMETA.yml (si MYMETA.json falta)

Para especificar el archivo 'some.cpanfile', que contiene las dependencias, ejecute:

cpanm --installdeps --cpanfile some.cpanfile .

instalacion cpanm

Hay varias formas de instalarlo . Aquí está la instalación a través de cpan :

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:

• PERL_CPANM_OPT ( PERL_CPANM_OPT generales de línea de comando cpanm)

○ export PERL_CPANM_OPT="--prompt" # en .bashrc, para habilitar las export

PERL_CPANM_OPT="--prompt" , por ejemplo

○ setenv PERL_CPANM_OPT "--prompt" # en .tcshrc

• PERL_MM_OPT (ExtUtils :: Opciones de línea de comando de MakeMaker, afecta el objetivo de

instalación del módulo)

• PERL_MB_OPT (Módulo :: Crear opciones de línea de comando, afecta el destino de instalación

del módulo)

Lea Instalar módulos Perl a través de CPAN en línea:

https://riptutorial.com/es/perl/topic/3542/instalar-modulos-perl-a-traves-de-cpan

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

$driver

$database

$userid

$password

$query

Columna

Controlador para DB, "Pg" para Postgresql y "mysql" para MySQL

el nombre de su base de datos

su ID de base de datos

su contraseña de base de datos

ponga su consulta aquí, por ejemplo: "select * from $ your_table"

Examples

Módulo DBI

Debe asegurarse de que el módulo DBI se haya instalado en su PC, luego siga los siguientes

pasos:

1. Usa el módulo DBI en tu script perl

use DBI;

2. Declarar algunos parámetros primarios.

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

3. Conéctate a tu base de datos

my $dbh = DBI->connect($dsn, $userid, $password);

4. Prepara tu consulta

my $query = $dbh->prepare("Your DB query");

https://riptutorial.com/es/home 56


Ex:

$my_query = qq/SELECT * FROM table WHERE column1 = 2/;

my $query = $dbh->prepare($my_query);

También podemos usar variable en la consulta, como a continuación:

my $table_name = "table";

my $filter_value = 2;

$my_query = qq/SELECT * FROM $table_name WHERE column1 = $filter_value/;

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:

my $query = $dbh->prepare("SELECT * FROM table WHERE column1 = ? AND column2 = ?;");

$query->execute($value1, $value2);

6. Fletch sus datos

my @row = $query->fetchrow_array(); almacenar datos como matriz

o

my $ref = $sth->fetchrow_hashref(); almacenar datos como referencia hash

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-delmodulo-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:

print 'My name is $name.\nI am $age.\n'; # My name is $name.\nI am $age.\n

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:

print qq{$name said: "I'm $age".}; # Paul said: "I'm 64".

print "$name said: \"I'm $age\"." # Paul said: "I'm 64".

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

Perl interpola nombres de variables:

my $name = 'Paul';

print "Hello, $name!\n"; # Hello, Paul!

my @char = ('a', 'b', 'c');

print "$char[1]\n"; # b

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:

my @char = ('a', 'b', 'c');

print "My chars are @char\n"; # My chars are a b c

Perl no interpola hashes como un todo:

my %map = (a => 125, b => 1080, c => 11);

print "My map is %map\n"; # My map is %map

y llamadas a funciones (incluidas las constantes):

use constant {

PI => '3.1415926'

};

print "I like PI\n";

# I like PI

print "I like " . PI . "\n"; # I like 3.1415926

Perl interpola secuencias de escape que comienzan con \ :

\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.

Perl no interpola \v , lo que significa una pestaña vertical en C y otros idiomas.

El personaje puede ser dirigido utilizando sus códigos:

\x{1d11e}

\o{350436}

\N{U+1d11e}

by hexadecimal code

by octal code

by Unicode code point

o nombres de Unicode:

\N{MUSICAL SYMBOL G CLEF}

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

El carácter de control puede dirigirse utilizando secuencias de escape especiales:

\c@

\ca

\cb

...

\cz

\c[

\c\

\c]

\c^

\c_

\c?

chr(0)

chr(1)

chr(2)

chr(26)

chr(27)

chr(28) # Cannot be used at the end of a string

# since backslash will interpolate the terminating quote

chr(29)

chr(30)

chr(31)

chr(127)

Las letras mayúsculas tienen el mismo significado: "\cA" == "\ca" .

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.

Lea Interpolación en Perl en línea: https://riptutorial.com/es/perl/topic/5284/interpolacion-en-perl

https://riptutorial.com/es/home 60


Capítulo 23: Leyendo el contenido de un

archivo en una variable

Examples

La forma manual

open my $fh, '<', $filename

or die "Could not open $filename for reading: $!";

my $contents = do { local $/; <$fh> };

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,

sub readfile { do { local(@ARGV,$/) = $_[0]; <> } }

my $content = readfile($filename);

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 :

my $contents = path($filename)->slurp( {binmode => ":encoding(UTF-8)"} );

Path::Tiny también tiene muchas otras funciones para tratar con archivos, por lo que puede ser

una buena opción.

Archivo :: Slurper

Este es un módulo minimalista que solo absorbe archivos en variables, nada más.

use File::Slurper 'read_text';

my $contents = read_text($filename);

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:

my $contents = read_text($filename, 'UTF-8', 1);

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 .

Slurping un archivo en una variable de matriz

open(my $fh, '<', "/some/path") or die $!;

my @ary = <$fh>;

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:

chomp(@ary); #removes line terminators from all the array elements.

Archivo de slurp en una sola línea

El separador de registro de entrada se puede especificar con el interruptor -0 ( cero , no

mayúscula ). Toma un número octal o hexadecimal como valor. Cualquier valor de 0400 o superior

hará que Perl absorba los archivos, pero por convención, el valor utilizado para este propósito es

0777 .

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 $_ .

perl -0777 -ne 'print length($_)' input.txt

Lea Leyendo el contenido de un archivo en una variable en línea:

https://riptutorial.com/es/perl/topic/1779/leyendo-el-contenido-de-un-archivo-en-una-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 .

Puede asignar una lista a una matriz:

my @foo = ( 4, 5, 6 );

Puede usar una matriz donde se espera una lista:

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

Asignando una lista a un hash

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:

my %hash = ( foo => 42, bar => 43, baz => 44 );

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:

my %hash = ( 'foo', 42, 'bar', 43, 'baz', 44 );

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.

my %hash = ( 'foo bar' => 42, 'baz qux' => 43 );

Para obtener más información, consulte Operador de coma en perldoc perlop .

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:

test_subroutine( 'item1', 'item2' );

test_subroutine 'item1', 'item2';

# same

Internamente, Perl @_ alias para esos argumentos y los coloca en la matriz @_ que está disponible

dentro de la subrutina:

@_ = ( 'item1', 'item2' ); # Done internally by perl

Se accede a argumentos de subrutina como este:

sub test_subroutine {

print $_[0]; # item1

print $_[1]; # item2

}

El alias le permite cambiar el valor original del argumento pasado a la subrutina:

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

Para probar cuántos argumentos se pasaron a la subrutina, verifique el tamaño de @_

sub test_subroutine {

print scalar @_, ' argument(s) passed into subroutine';

}

Si pasas los argumentos de matriz a una subrutina, todos serán aplanados :

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

Si su test_some_subroutine contiene la instrucción $_[4] = 'd' , para la llamada anterior causará

que $y[0] tenga un valor d después:

print "@y"; # d b c

Lista de retorno de subrutina

Por supuesto, puede devolver listas de subs:

sub foo {

my @list1 = ( 1, 2, 3 );

my @list2 = ( 4, 5 );

}

return ( @list1, @list2 );

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:

print scalar foo(); # 2

¿Por qué 2 ? Que esta pasando?

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:

return ( \@list1, \@list2 );

Luego, la persona que llama hace algo como esto para recibir los dos arrayrefs devueltos:

my ($list1, $list2) = foo(...);

Usando arrayref para pasar array a sub

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]

Hash como lista

En la lista el hash de contexto se aplana.

my @bar = ( %hash, %hash );

La matriz @bar se inicializa con una lista de dos hashes de %hash

• ambos %hash son aplanados

• nueva lista se crea a partir de elementos aplanados

• @bar array se inicializa con esa lista

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:

my %hash = ( a => 1, b => 2 );

print %hash; # Maybe 'a1b2' or 'b2a1'

Lea Liza en línea: https://riptutorial.com/es/perl/topic/4553/liza

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:

• el número de filas afectadas en el éxito

• '0 but true' si la consulta es exitosa pero no hay filas afectadas

• 0 si la consulta no tuvo éxito.

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

};

Lea Manejo de excepciones en línea: https://riptutorial.com/es/perl/topic/1894/manejo-deexcepciones

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.

También puede probar Perl :: Critic a través de su navegador en perlcritic.com .

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:

perlcritic -3 --verbose 8 /path/to/script.pl

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:

Establecer el nivel en 8 le mostrará la regla que activó una advertencia:

perlcritic -3 --verbose 8 /path/to/script.pl

[Bangs::ProhibitDebuggingModules] Debugging module loaded at line 16, column 1. (Severity: 4)

[Subroutines::ProhibitUnusedPrivateSubroutines] Private subroutine/method '_sub_name' declared

but not used at line 58, column 1. (Severity: 3)

[InputOutput::ProhibitBacktickOperators] Backtick operator used at line 230, column 37.

(Severity: 3)

[InputOutput::ProhibitBacktickOperators] Backtick operator used at line 327, column 22.

(Severity: 3)

Mientras que un nivel de 11 mostrará las razones específicas por las que existe la regla:

perlcritic -3 --verbose 11 /path/to/script.pl

Debugging module loaded at line 16, near 'use Data::Dumper;'.

Bangs::ProhibitDebuggingModules (Severity: 4)

This policy prohibits loading common debugging modules like the

Data::Dumper manpage.

While such modules are incredibly useful during development and

debugging, they should probably not be loaded in production use. If this

policy is violated, it probably means you forgot to remove a `use

Data::Dumper;' line that you had added when you were debugging.

Private subroutine/method '_svn_revisions_differ' declared but not used at line 58, near 'sub

_sub_name {'.

Subroutines::ProhibitUnusedPrivateSubroutines (Severity: 3)

By convention Perl authors (like authors in many other languages)

indicate private methods and variables by inserting a leading underscore

before the identifier. This policy catches such subroutines which are

not used in the file which declares them.

This module defines a 'use' of a subroutine as a subroutine or method

call to it (other than from inside the subroutine itself), a reference

to it (i.e. `my $foo = \&_foo'), a `goto' to it outside the subroutine

itself (i.e. `goto &_foo'), or the use of the subroutine's name as an

even-numbered argument to `use overload'.

Backtick operator used at line 230, near 'my $filesystem_diff = join q{}, `diff

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.

use IPC::Open3 'open3';

$SIG{CHLD} = 'IGNORE';

@output = `some_command`;

#not ok

my ($writer, $reader, $err);

open3($writer, $reader, $err, 'some_command'); #ok;

@output = <$reader>; #Output here

@errors = <$err>; #Errors here, instead of the console

Backtick operator used at line 327, near 'my $output = `$cmd`;'.

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.

use IPC::Open3 'open3';

$SIG{CHLD} = 'IGNORE';

@output = `some_command`;

#not ok

my ($writer, $reader, $err);

open3($writer, $reader, $err, 'some_command'); #ok;

@output = <$reader>; #Output here

@errors = <$err>; #Errors here, instead of the console

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 qw(InputOutput::ProhibitBacktickOperator)

my $filesystem_diff = join q{}, `diff $trunk_checkout $staging_checkout`;

## use critic

Asegúrese de envolver el bloque de código completo o el crítico puede no reconocer la

instrucción de ignorar.

## 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 ...

Creando excepciones permanentes

Usar ## no critic () es bueno, pero cuando comience a adoptar estándares de codificación, es

probable que desee hacer excepciones permanentes a ciertas reglas. Puede hacer esto creando

un archivo de configuración .perlcriticrc .

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 :

perlcritic -1 --profile=/path/to/.perlcriticrc /path/to/script.pl

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:

Aplicar la configuración básica:

#very very harsh

severity = 1

color-severity-medium = bold yellow

color-severity-low = yellow

color-severity-lowest = bold blue

Deshabilite una regla (observe el guión delante del nombre de la política):

# do not require version control numbers

[-Miscellanea::RequireRcsKeywords]

# pod spelling is too over-zealous, disabling

[-Documentation::PodSpelling]

Modificar una regla:

# do not require checking for print failure ( false positives for printing to stdout, not

filehandle )

[InputOutput::RequireCheckedSyscalls]

functions = open close

# Allow specific unused subroutines for moose builders

[Subroutines::ProhibitUnusedPrivateSubroutines]

private_name_regex = _(?!build_)\w+

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.

Lea Mejores prácticas en línea: https://riptutorial.com/es/perl/topic/5919/mejores-practicas

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.

Procesando listas largas

Si ya tiene una lista en la memoria, la forma sencilla y generalmente suficiente de procesarla es

mediante un simple bucle foreach :

foreach my $item (@items) {

...

}

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.

Lea Optimización del uso de la memoria. en línea:

https://riptutorial.com/es/perl/topic/6327/optimizacion-del-uso-de-la-memoriahttps://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;

}

Este método se puede utilizar de la siguiente manera:

my $point = Point->new(1, 2.5);

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;

my $CANVAS_SIZE = [1000, 1000];

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

o después de una variable escalar (generalmente con una referencia):

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

array @_ en new contendrá tres argumentos: ('Point', 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.

Herencia y resolución de métodos.

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;

Perl permite la herencia múltiple:

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.

Considere la siguiente jerarquía de clases:

package GeometryObject;

use strict;

sub transpose { ...}

1;

package Point;

use strict;

use parent qw(GeometryObject);

sub new { ... };

1;

package PlanarObject;

use strict;

use parent qw(GeometryObject);

sub transpose { ... }

1;

package Point2D;

use strict;

use parent qw(Point PlanarObject);

sub new { ... }

sub polar_coordinates { ... }

1;

La resolución del método funciona de la siguiente manera:

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

... o una variable escalar sosteniendo una cadena:

my $class = 'Point2D';

$class->new(...);

... entonces el punto de partida es el paquete con el nombre correspondiente ( Point2D

en ambos ejemplos).

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

entonces el punto de partida es la clase de la referencia (nuevamente, Point2D ). El

operador de flecha no se puede utilizar para llamar a métodos para referencias no

bendecidas .

2. Si el punto de partida contiene el método requerido, simplemente se llama.

Así, puesto que Point2D::new existe,

Point2D->new(...);

3.

simplemente lo llamará.

Si el punto de partida no contiene el método requerido, se realiza una búsqueda en

profundidad en las clases parent . En el ejemplo anterior, el orden de búsqueda será el

siguiente:

• Point2D

• Point (primer padre de Point2D )

• GeometryObject (padre de Point )

• PlanarObject (segundo padre de Point2D )

Por ejemplo, en el siguiente código:

my $point = Point2D->new(...);

$point->transpose(...);

el método que se llamará es GeometryObject::transpose , aunque se anularía en

PlanarObject::transpose .

4. Puede establecer el punto de partida explícitamente.

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

5.

De manera similar, SUPER:: realiza la búsqueda de métodos en las clases primarias de la

clase actual.

Por ejemplo,

package Point2D;

use strict;

use parent qw(Point PlanarObject);

sub new {

(my $class, $x, $y) = @_;

my $self = $class->SUPER::new;

...

}

1;

Point2D::new Point::new en el curso de la Point2D::new ejecución de Point2D::new .

Métodos de clase y objeto

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:

# the first argument of new is string 'Point' in both cases

Point->new(...);

my $class = 'Point';

$class->new(...);

o una referencia de objeto:

# reference contained in $point is the first argument of polar_coordinates

my $point = Point->new(...);

my @coord = $point->polar_coordinates;

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

...

}

}

Definiendo clases en Perl moderno.

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

• Moose - inspirado en el diseño Perl 6 OO

• Class::Accessor - una alternativa ligera a Moose

• Class::Tiny - constructor de clase verdaderamente minimalista

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

}

Clase :: Accessor (sintaxis de alces)

package Foo;

use Class::Accessor 'antlers';

has bar => (is => 'ro');

# a read-only property

has baz => (is => 'rw', isa => 'Bool'); # a read-write property (only 'is' supported, the

type is ignored)

Clase :: Accessor (sintaxis nativa)

package Foo;

use base qw(Class::Accessor);

Foo->mk_accessors(qw(bar baz)); # some read-write properties

Foo->mk_accessors(qw(qux)); # a read-only property

Clase :: Tiny

package Foo;

use Class::Tiny qw(bar baz); # just props

Roles

Un papel en Perl es esencialmente

• un conjunto de métodos y atributos que

• inyectado en una clase directamente.

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;

requires 'introduce'; # a method consuming classes must implement

sub greet {

print "Hi!\n";

}

# a method already implemented in the role

package Parrot;

use Moose;

with 'Chatty';

sub introduce {

print "I'm Buddy.\n";

}

Rol :: Diminuto

Utilícelo si su sistema OO no proporciona soporte para roles (por ejemplo, Class::Accessor o

Class::Tiny ) No soporta atributos.

package Chatty;

use Role::Tiny;

requires 'introduce'; # a method consuming classes must implement

sub greet {

print "Hi!\n";

}

# a method already implemented in the role

package Parrot;

use Class::Tiny;

use Role::Tiny::With;

with 'Chatty';

sub introduce {

print "I'm Buddy.\n";

}

Lea Orientado a objetos Perl en línea: https://riptutorial.com/es/perl/topic/2920/orientado-aobjetos-perl

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 .

Cargando un módulo en tiempo de ejecución

require Exporter;

Esto asegurará que el módulo Exporter se cargue en tiempo de ejecución si aún no se ha

importado. (Ver también: perldoc -f require .)

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

Esto intentaría cargar My::Package::Plugins::One y My::Package::Plugins::Two . @plugins supuesto,

@plugins debería provenir de alguna entrada del usuario o un archivo de configuración para que

esto tenga sentido. Tenga en cuenta el operador de sustitución s!::!/!g que reemplaza cada par

de dos puntos con una barra. Esto se debe a que puede cargar módulos utilizando la sintaxis de

nombre de módulo familiar de use solo si el nombre del módulo es una simple palabra. Si pasa

una cadena o una variable, debe contener un nombre de archivo.

Usando un modulo

use Cwd;

Esto importará el módulo Cwd en el momento de la compilación e importará sus símbolos

predeterminados, es decir, hará que algunas de las variables y funciones del módulo estén

disponibles para el código que lo usa. (Ver también: perldoc -f use .)

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:

use Cwd 'abs_path';

Si lo hace, solo se importarán los símbolos que especifique (es decir, el conjunto predeterminado

no se importará).

Cuando se importan varios símbolos, es idiomático utilizar la qw() list-building:

use Cwd qw(abs_path realpath);

Algunos módulos exportan un subconjunto de sus símbolos, pero se les puede decir que exporten

todo con :all :

use Benchmark ':all';

(Tenga en cuenta que no todos los módulos reconocen o utilizan la etiqueta :all ).

Usando un módulo dentro de un directorio

use lib 'includes';

use MySuperCoolModule;

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:

MySuperCoolModule::SuperCoolSub_1("Super Cool String");

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

O puede configurar el módulo para exportar subrutinas condicionalmente, de esta manera:

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:

use MySuperCoolModule 'SuperCoolSub_1';

SuperCoolSub_1("Super Cool String");

CPAN.pm

CPAN.pm es un módulo de Perl que permite consultar e instalar módulos desde los sitios de CPAN.

Es compatible con el modo interactivo invocado con

cpan

o

perl -MCPAN -e shell

Módulos de consulta

https://riptutorial.com/es/home 87


Por nombre:

cpan> m MooseX::YAML

Por una expresión regular contra el nombre del módulo:

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:

cpan> install MooseX::YAML

Por distribución:

cpan> install LMC/Net-Squid-Auth-Engine-0.04.tar.gz

Listar todos los módulos instalados

Desde la línea de comando:

cpan -l

De un script de Perl:

use ExtUtils::Installed;

my $inst = ExtUtils::Installed->new();

my @modules = $inst->modules();

Lea Paquetes y módulos en línea: https://riptutorial.com/es/perl/topic/451/paquetes-y-modulos

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"):

perl -e'print "Hello, World!\n"'

Debido a las reglas de cotización de Windows, no puede usar cadenas entre comillas simples,

pero tiene que usar una de estas variantes:

perl -e"print qq(Hello, World!\n)"

perl -e"print \"Hello, World!\n\""

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

perl -CO -E'say "\N{PILE OF POO}"'

Uso de cadenas entre comillas dobles en las líneas de Windows

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:

perl -e "my $greeting = 'Hello'; print \"$greeting, world!\n\""

Para mejorar la legibilidad, puede usar un operador qq() :

perl -e "my $greeting = 'Hello'; print qq($greeting, world!\n)"

Líneas de impresión que coinciden con un patrón (PCRE grep)

perl -ne'print if /foo/' file.txt

Mayúsculas y minúsculas:

https://riptutorial.com/es/home 89


perl -ne'print if /foo/i' file.txt

Reemplazar una subcadena con otra (PCRE sed)

perl -pe"s/foo/bar/g" file.txt

O en el lugar:

perl -i -pe's/foo/bar/g' file.txt

En Windows:

perl -i.bak -pe"s/foo/bar/g" file.txt

Imprimir solo ciertos campos

perl -lane'print "$F[0] $F[-1]"' data.txt

# prints the first and the last fields of a space delimited record

Ejemplo de CSV:

perl -F, -lane'print "$F[0] $F[-1]"' data.csv

Imprimir líneas 5 a 10

perl -ne'print if 5..10' file.txt

Editar archivo en el lugar

Sin una copia de seguridad ( no es compatible con Windows )

perl -i -pe's/foo/bar/g' file.txt

Con un file.txt.bak copia de seguridad.txt.bak

perl -i.bak -pe's/foo/bar/g' file.txt

Con una copia de seguridad old_file.txt.orig en el subdirectorio de backup (siempre que exista

este último):

perl -i'backup/old_*.orig' -pe's/foo/bar/g' file.txt

Leyendo todo el archivo como una cadena

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.

Subir archivo a mojolicious

perl -Mojo -E 'p("http://localhost:3000" => form => {Input_Type => "XML", Input_File => {file

=> "d:/xml/test.xml"}})'

El archivo d:/xml/test.xml se cargará al servidor que escuche las conexiones en localhost:3000 (

Fuente )

En este ejemplo:

-Mmodule ejecuta use module; antes de ejecutar tu programa

-E commandline se usa para ingresar una línea de programa

Si no tiene un módulo ojo , puede usar el comando cpanm ojo para instalarlo

Para leer más sobre cómo ejecutar perl, use el comando perldoc perlrun o lea aquí

Lea Perl one-liners en línea: https://riptutorial.com/es/perl/topic/3696/perl-one-liners

https://riptutorial.com/es/home 91


Capítulo 31: Perl Testing

Examples

Ejemplo de prueba de unidad Perl

El siguiente es un ejemplo simple de la secuencia de comandos de prueba de Perl, que

proporciona cierta estructura para permitir la prueba de otros métodos en la clase / paquete bajo

prueba. El script produce una salida estándar con un simple texto "ok" / "not ok", que se llama

TAP (Test Anything Protocol).

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

const my $PACKAGE_UNDER_TEST => 'Local::MyPackage';

# Example test of method 'file_type_build'

sub test_file_type_build {

my %arg = @_;

my $label = 'file_type_build';

my $got_file_type;

my $filename = '/etc/passwd';

# Check the method call lives

lives_ok(

sub {

$got_file_type = $PACKAGE_UNDER_TEST->file_type_build(

filename => $filename

);

},

"$label - lives"

);

# 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: {

subtest 'file_type_build' => sub {

test_file_type_build();

https://riptutorial.com/es/home 92


};

# More tests of the method can be added here.

done_testing();

# Tests of other methods can be added here, just like above.

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

• Prueba :: Más - Las operaciones de prueba básicas.

• Prueba :: Excepción - Probar excepciones lanzadas.

• Prueba :: Diferencias - Comparación de resultados de prueba que tienen estructuras de

datos complejas.

• Prueba :: Clase - Pruebas basadas en clase en lugar de script. Similitudes con JUnit.

• Perl Testing Tutorials - Lecturas adicionales.

Lea Perl Testing en línea: https://riptutorial.com/es/perl/topic/5918/perl-testing

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

• Página oficial de perlbrew

• Documentación CPAN para perlbrew

Examples

Configurar perlbrew por primera vez

Crear script de configuración ~/.perlbrew.sh :

# Reset any environment variables that could confuse `perlbrew`:

export PERL_LOCAL_LIB_ROOT=

export PERL_MB_OPT=

export PERL_MM_OPT=

# decide where you want to install perlbrew:

export PERLBREW_ROOT=~/perlbrew

[[ -f "$PERLBREW_ROOT/etc/bashrc" ]] && source "$PERLBREW_ROOT/etc/bashrc"

Crear script de instalación install_perlbrew.sh :

source ~/.perlbrew.sh

curl -L https://install.perlbrew.pl | bash

source "$PERLBREW_ROOT/etc/bashrc"

# Decide which version you would like to install:

version=perl-5.24.1

perlbrew install "$version"

perlbrew install-cpanm

perlbrew switch "$version"

Ejecutar script de instalación:

./install_perlbrew.sh

https://riptutorial.com/es/home 94


Agrega al final de tu ~/.bashrc

[[ -f ~/.perlbrew.sh ]] && source ~/.perlbrew.sh

Fuente ~/.bashrc :

source ~/.bashrc

Lea Perlbrew en línea: https://riptutorial.com/es/perl/topic/9144/perlbrew

https://riptutorial.com/es/home 95


Capítulo 33: Salida de depuración

Examples

Dumping estructuras de datos

use Data::Dumper;

my $data_structure = { foo => 'bar' };

print Dumper $data_structure;

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 .

Dumping con estilo

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.

Dumping lista de matriz

my @data_array = (123, 456, 789, 'poi', 'uyt', "rew", "qas");

print Dumper @data_array;

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'

];

También puede hacer referencia a la matriz al imprimir.

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

Suponiendo que lo siguiente es código del archivo example.pl :

use strict;

use warnings;

use Data::Show;

my @array = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

https://riptutorial.com/es/home 98


my %hash = ( foo => 1, bar => { baz => 10, qux => 20 } );

my $href = \%hash;

show @array;

show %hash;

show $href;

perl example.pl da el siguiente resultado:

======( @array )=======================[ 'example.pl', line 11 ]======

[1 .. 10]

======( %hash )========================[ 'example.pl', line 12 ]======

{ bar => { baz => 10, qux => 20 }, foo => 1 }

======( $href )========================[ 'example.pl', line 13 ]======

{ bar => { baz => 10, qux => 20 }, foo => 1 }

Consulte la documentación de Data::Show .

Lea Salida de depuración en línea: https://riptutorial.com/es/perl/topic/983/salida-de-depuracion

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 = @_;

# ...

}

# emulate named parameters (instead of positional)

sub function_name {

my %args = (arg1 => 'default', @_);

my $arg1 = delete $args{arg1};

my $arg2 = delete $args{arg2};

# ...

}

sub {

my $arg1 = shift;

# ...

}->($arg);

5.20.0

Alternativamente, la característica experimental "signatures" puede usarse para desempaquetar

https://riptutorial.com/es/home 100


parámetros, que se pasan por valor ( no por referencia).

use feature "signatures";

sub function_name($arg1, $arg2, @more_args) {

# ...

}

Los valores por defecto se pueden utilizar para los parámetros.

use feature "signatures";

sub function_name($arg1=1, $arg2=2) {

# ...

}

Puede usar cualquier expresión para asignar un valor predeterminado a un parámetro, incluidos

otros parámetros.

sub function_name($arg1=1, $arg2=$arg1+1) {

# ...

}

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.

sub function_name($arg1=$arg2, $arg2=1) {

print $arg1; # => <nothing>

print $arg2; # => 1

}

Los argumentos de subrutina se pasan por referencia (excepto los de las

firmas)

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.

use feature 'say';

sub edit {

$_[0] =~ s/world/sub/;

}

my $text = "Hello, world!";

edit($text);

say $text; # Hello, sub!

edit("Hello, world!"); # Error: Modification of a read-only value attempted

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

Código de espera de subrutinas. A menos que se especifique lo contrario, se definen

globalmente.

# Functions do not (have to) specify their argument list

sub returns_one {

# Functions return the value of the last expression by default

# The return keyword here is unnecessary, but helps readability.

return 1;

}

# Its arguments are available in @_, however

sub sum {

my $ret = 0;

for my $value (@_) {

$ret += $value

}

return $ret;

}

# Perl makes an effort to make parens around argument list optional

say sum 1..3; # 6

# If you treat functions as variables, the & sigil is mandatory.

say defined &sum; # 1

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

# This defines the function under the default package, 'main'

sub say {

# This is instead the say keyword

say "I say, @_";

}

# ...so you can call it like this:

main::say('wow'); # I say, wow.

5.18.0

Desde Perl 5.18, también puede tener funciones no globales:

use feature 'lexical_subs';

my $value;

{

# Nasty code ahead

my sub prod {

my $ret = 1;

$ret *= $_ for @_;

$ret;

https://riptutorial.com/es/home 102


}

$value = prod 1..6; # 720

say defined &prod; # 1

}

say defined &prod; # 0

5.20.0

Desde 5.20, también puede tener parámetros con nombre.

use feature 'signatures';

sub greet($name) {

say "Hello, $name";

}

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

# Specify the sigil to ignore the prototypes.

&receives_arrayrefs(\@a, \@b); # okay, $x = \@a, $y = \@b, @_ = ();

&receives_arrayrefs(@a, @b); # ok, but $x = 1, $y = 2, @_ = (3,1,2,3,4);

Lea Subrutinas en línea: https://riptutorial.com/es/perl/topic/711/subrutinas

https://riptutorial.com/es/home 103


Capítulo 35: Texto atribuido

Examples

Imprimiendo texto en color

#!/usr/bin/perl

use Term::ANSIColor;

print color("cyan"), "Hello", color("red"), "\tWorld", color("green"), "\tIt's Me!\n",

color("reset");

Lea Texto atribuido en línea: https://riptutorial.com/es/perl/topic/5922/texto-atribuido

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

Escriba abajo el comando:

instmodsh

Te mostrará el gremio de la siguiente manera:

Available commands are:

l

- List all installed modules

m <module> - Select a module

q

- Quit the program

cmd?

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.

Después de terminar, simplemente escribe q para salir.

Use perldoc para verificar la ruta de instalación del paquete Perl

$ perldoc -l Time::Local

Cómo comprobar los módulos de la lista de Perl.

$ corelist -v v5.23.1

¿Cómo comprobar la versión de un módulo instalado?

$> perl -MFoo::Bar\ 9999

$> Foo::Bar version 9999 required--this is only version 1.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-instaladosen-mac-y-ubuntu

https://riptutorial.com/es/home 105


Capítulo 37: Unicode

Observaciones

Una advertencia sobre la codificación de

nombre de archivo

Cabe mencionar que la codificación de nombre de archivo no solo es específica de la plataforma,

sino también del sistema de archivos .

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.

: encoding (utf8) vs: utf8

https://riptutorial.com/es/home 106


Dado que UTF-8 es uno de los formatos internos para la representación de cadenas en Perl, el

paso de codificación / decodificación a menudo se puede omitir. En lugar de :encoding(utf-8) ,

simplemente puede usar :utf8 , si sus datos ya están en UTF-8. :utf8 puede usarse de forma

segura con flujos de salida, mientras que para el flujo de entrada puede ser peligroso, ya que

causa una inconsistencia interna cuando tiene secuencias de bytes no válidas. Además, el uso de

:utf8 para la entrada puede dar lugar a violaciones de seguridad, por lo que se recomienda el uso

de :encoding(utf-8) .

Más detalles: ¿Cuál es la diferencia entre: codificación y: utf8

UTF-8 vs utf8 vs UTF8

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 detalles: UTF-8 vs. utf8 vs. UTF8

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

Publicaciones de stackoverflow.com (advertencia: podría no estar actualizado):

• ¿Por qué Perl moderno evita UTF-8 por defecto?

Videos de Youtube:

• Un millón de billones de personajes ondulados de Ricardo Signes en YAPC NA 2016.

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

my $filename = 'æ€'; # $filename is now an internally UTF-8 encoded string.

# 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

# Example1 -- using open()

open ( my $fh, '>', $filename ) or die "Could not open '$filename': $!";

close $fh;

# Example2 -- using qx() and touch

qx{touch $filename};

# Example3 -- using system() and touch

system 'touch', $filename;

# Example4 -- using File::Touch

use File::Touch;

eval { touch( $filename ) }; die "Could not create file '$filename': $!" if $@;

Leer nombres de archivos

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

# Example1 -- using readdir()

my $dir = '.';

opendir(my $dh, $dir) or die "Could not open directory '$dir': $!";

while (my $filename = decode_utf8(readdir $dh)) {

# Do something with $filename

}

close $dh;

# Example2 -- using getcwd()

use Cwd qw(getcwd);

my $dir = decode_utf8( getcwd() );

# Example3 -- using abs2rel()

use File::Spec;

use utf8;

my $base = 'ø';

my $path = "$base/b/æ";

my $relpath = decode_utf8( File::Spec->abs2rel( $path, $base ) );

# Note: If you omit $base, you need to encode $path first:

use Encode qw(encode_utf8);

my $relpath = decode_utf8( File::Spec->abs2rel( encode_utf8( $path ) ) );

# Example4 -- using File::Find::Rule (part1 matching a filename)

use File::Find::Rule;

use utf8;

use Encode qw(encode_utf8);

my $filename = 'æ';

# File::Find::Rule needs $filename to be encoded

my @files = File::Find::Rule->new->name( encode_utf8($filename) )->in('.');

$_ = decode_utf8( $_ ) for @files;

# Example5 -- using File::Find::Rule (part2 matching a regular expression)

use File::Find::Rule;

use utf8;

my $pat = '[æ].$'; # Unicode pattern

# Note: In this case: File::Find::Rule->new->name( qr/$pat/ )->in('.')

# will not work since $pat is Unicode and filenames are bytes

# Also encoding $pat first will not work correctly

my @files;

File::Find::Rule->new->exec( sub { wanted( $pat, \@files ) } )->in('.');

$_ = decode_utf8( $_ ) for @files;

sub wanted {

my ( $pat, $files ) = @_;

my $name = decode_utf8( $_ );

my $full_name = decode_utf8( $File::Find::name );

push @$files, $full_name if $name =~ /$pat/;

}

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 .

Interruptores de línea de comando para one-liners

Habilitar pragma utf8

Para habilitar pragma utf8 en one-liner, se debe llamar al intérprete perl con la opción -Mutf8 :

perl -Mutf8 -E 'my $ = "human"; say $ '

Manejo de Unicode con interruptor -C

El indicador de línea de comando -C permite controlar las funciones de Unicode. Puede ir seguido

de una lista de letras opcionales.

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 /Ματαιότης/'

Argumentos del guión

• A : trata a @ARGV como una matriz de cadenas codificadas en UTF-8

perl -CA -Mutf8 -E 'my $arg = shift; say "anteater" if $arg eq "муравьед"' муравьед

Capa PerlIO predeterminada

• i - UTF-8 es la capa PerlIO predeterminada para las secuencias de entrada

• o - UTF-8 es la capa PerlIO predeterminada para las secuencias de salida

• D - taquigrafía para io

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:

perl -CASD -Mutf8 -E 'say "Ματαιότης ματαιοτήτων\n"';

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 :

binmode STDIN, ':encoding(utf-8)';

binmode STDOUT, ':utf8';

binmode STDERR, ':utf8';

Nota: cuando se lee uno, en general, se prefiere :encoding(utf-8) sobre :utf8 , consulte

Observaciones para obtener más información.

Alternativamente, puede utilizar el pragma open .

# 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) :

use open qw( :encoding(utf-8) :std );

Manijas de archivo

Configuración de la codificación con Open ()

Al abrir un archivo de texto, puede especificar su codificación explícitamente con un open() tres

argumentos open() . Este en- / decodificador adjunto a un identificador de archivo se llama "capa

de E / S":

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:

# Set input streams to ':encoding(utf-8)' and output streams to ':utf8'

use open (IN => ':encoding(utf-8)', OUT => ':utf8');

# Or to set all input and output streams to ':encoding(utf-8)'

use open ':encoding(utf-8)';

Configuración de la codificación con la línea

de comando -C bandera

Finalmente, también es posible ejecutar el intérprete perl con un indicador -CD que aplica UTF-8

como la capa de E / S predeterminada. Sin embargo, esta opción debe evitarse, ya que se basa

en un comportamiento específico del usuario que no se puede predecir ni controlar.

El pragma utf8: usando Unicode en tus fuentes

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. *

Puede haber relaciones complejas y contraintuitivas entre la salida y la codificación de origen. Al

ejecutarse en una terminal UTF-8, puede encontrar que agregar el pragma utf8 parece romper las

cosas:

$ perl -e 'print "Møøse\n"'

Møøse

$ perl -Mutf8 -e 'print "Møøse\n"'

Mse

$ perl -Mutf8 -CO -e 'print "Møøse\n"'

Møøse

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.

use utf8 no afecta la codificación de E / S estándar ni los manejadores de archivos!

Manejo de UTF-8 inválido

Lectura inválida de UTF-8

Al leer datos codificados en UTF-8, es importante tener en cuenta el hecho de que los datos

codificados en UTF-8 pueden ser inválidos o mal formados. Dichos datos generalmente no

deberían ser aceptados por su programa (a menos que sepa lo que está haciendo). Cuando se

encuentran datos malformados inesperadamente, se pueden considerar diferentes acciones:

• Imprima el seguimiento de pila o el mensaje de error, y cancele el programa correctamente,

o

• Inserte un carácter de sustitución en el lugar donde apareció la secuencia de bytes con

formato incorrecto, imprima un mensaje de advertencia a STDERR y continúe leyendo

mientras no sucede nada.

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 .

El siguiente ejemplo escribe 3 bytes en la codificación ISO 8859-1 al disco. A continuación,

intenta volver a leer los bytes de nuevo como datos codificados en UTF-8. Uno de los bytes, 0xE5 ,

es una secuencia de un byte UTF-8 no válida:

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

El programa abortará con una advertencia fatal:

utf8 "\xE5" does not map to Unicode at ./test.pl line 10.

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á:

Read string: 'a\xE5a'

Lea Unicode en línea: https://riptutorial.com/es/perl/topic/4375/unicode

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:

• un número ( 3 , 42 , 3.141 , etc.)

• una cadena ( 'hi' , "abc" , etc.)

• una referencia a una variable (ver otros ejemplos).

my $integer = 3;

my $string = "Hello World";

my $reference = \$string;

# number

# string

# reference to $string

Perl convierte entre números y cadenas sobre la marcha , según lo que espera un operador

en particular.

my $number = '41';

# string '41'

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.

# String comparison # Number comparison

'Potato' eq 'Potato'; 42 == 42;

'Potato' ne 'Pomato'; 42 != 24;

'Camel' lt 'Potato'; 41 < 42;

'Zombie' gt 'Potato'; 43 > 42;

# String concatenation # Number summation

'Banana' . 'phone'; 23 + 19;

# String repetition # Number multiplication

'nan' x 3; 6 * 7;

Intentar usar operaciones de cadena en números no generará advertencias; intentar usar

operaciones numéricas en cadenas no numéricas lo hará. Tenga en cuenta que algunas cadenas

sin dígitos, como 'inf' , 'nan' , '0 but true' cuentan como números.

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ó.

my @numbers_to_ten = (1,2,3,4,5,6,7,8,9,10); # More conveniently: (1..10)

my @chars_of_hello = ('h','e','l','l','o');

my @word_list = ('Hello','World');

# Note the sigil: access an @array item with $array[index]

my $second_char_of_hello = $chars_of_hello[1]; # 'e'

# Use negative indices to count from the end (with -1 being last)

my $last_char_of_hello = $chars_of_hello[-1];

# Assign an array to a scalar to get the length of the array

my $length_of_array = @chars_of_hello; # 5

# 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

Las matrices son mutables:

use utf8; # necessary because this snippet is utf-8

$chars_of_hello[1] = 'u'; # ('h','u','l','l','o')

push @chars_of_hello, ('!', '!'); # ('h','u','l','l','o','!','!')

pop @chars_of_hello; # ('h','u','l','l','o','!')

shift @chars_of_hello; # ('u','l','l','o','!')

unshift @chars_of_hello, ('¡', 'H'); # ('¡','H','u','l','l','o','!')

@chars_of_hello[2..5] = ('O','L','A'); # ('¡','H','O','L','A',undef,'!') whoops!

delete $chars_of_hello[-2]; # ('¡','H','O','L','A', '!')

# 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')

Finalmente, puedes recorrer el contenido de una matriz:

use v5.10; # necessary for 'say'

for my $number (@numbers_to_ten) {

say $number ** 2;

}

Cuando se usan como valores booleanos, las matrices son verdaderas si no están vacías.

Hashes

Hashes puede entenderse como tablas de búsqueda. Puedes acceder a su contenido

especificando una clave para cada uno de ellos. Las llaves deben ser cadenas. Si no lo son, se

convertirán en cadenas.

Si le da al hash simplemente una clave conocida, le servirá su valor.

# Elements are in (key, value, key, value) sequence

my %inhabitants_of = ("London", 8674000, "Paris", 2244000);

# 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:

my %employee = ( name => 'John Doe', shift => 'night' );

# this example will print 'night'

print $employee{shift};

# 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:

my @words = @translations_of_hello{'spanish', 'german'}; # ('Hola', 'Hallo')

Iterar sobre las claves de un hash con keys keys devolverá los elementos en un orden aleatorio.

Combina con el sort si lo deseas.

for my $lang (sort keys %translations_of_hello) {

say $translations_of_hello{$lang};

}

Si no necesita las claves como en el ejemplo anterior, los values devuelven los valores de hash

directamente:

for my $translation (values %translations_of_hello) {

say $translation;

}

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;

}

El acceso a los elementos no configurados devuelve undef, no un error:

my $italian = $translations_of_hello{'italian'}; # undef

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:

@elems = qw(x y x z t);

my %set;

@set{@elems} = (1) x @elems;

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

}

# This function can then be called like this:

hash_args(foo => 5, bar => 3); # (foo => 5, bar => 3, __unsafe ==> 0)

hash_args(); # (foo => 1, bar => 0, __unsafe ==> 0)

hash_args(__unsafe => 1) # (foo => 1, bar => 0, __unsafe ==> 0)

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 .

say ${$reference};

say $$reference;

# Explicit prefix syntax

# The braces can be left out (confusing)

5.24.0

Nueva sintaxis de desreferenciación de postfix, disponible por defecto desde v5.24

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 "" ).

Es posible que desee una referencia escalar si:

• Desea pasar una cadena a una función y hacer que la modifique para usted sin que sea un

valor de retorno.

• 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:

Desambiguar un nombre de archivo del contenido del archivo

Desambiguar el contenido devuelto de una cadena de error devuelta

• 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

Las Referencias de Array son escalares ( $ ) que se refieren a Arrays.

https://riptutorial.com/es/home 120


my @array = ("Hello"); # Creating array, assigning value from a list

my $array_reference = \@array;

Estos pueden ser creados más cortos de la siguiente manera:

my $other_array_reference = ["Hello"];

La modificación / uso de las referencias de matriz requiere primero la eliminación de referencias.

my @contents = @{ $array_reference };

my @contents = @$array_reference;

# Prefix notation

# Braces can be left out

5.24.0

Nueva sintaxis de desreferenciación de postfix, disponible por defecto desde v5.24

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.

my @array = qw(one two three); my $arrayref = [ qw(one two three) ]

my $one = $array[0];

my $one = $arrayref->[0];

A diferencia de los arrays, arrayrefs puede ser anidado:

my @array = ( (1, 0), (0, 1) ) # ONE array of FOUR elements: (1, 0, 0, 1)

my @matrix = ( [1, 0], [0, 1] ) # an array of two arrayrefs

my $matrix = [ [0, 1], [1, 0] ] # an arrayref of arrayrefs

# There is no namespace conflict between scalars, arrays and hashes

# so @matrix and $matrix _both_ exist at this point and hold different values.

my @diagonal_1 = ($matrix[0]->[1], $matrix[1]->[0]) # uses @matrix

my @diagonal_2 = ($matrix->[0]->[1], $matrix->[1]->[0]) # uses $matrix

# Since chained []- and {}-access can only happen on references, you can

# omit some of those arrows.

my $corner_1 = $matrix[0][1]; # uses @matrix;

my $corner_2 = $matrix->[0][1]; # uses $matrix;

Cuando se usa como booleano, las referencias son siempre ciertas.

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;

print Dumper("Within the subroutine");

print Dumper(\%hash);

}

return;

my %example_hash = (

old_value => 1,

);

modify(%example_hash);

print Dumper("After exiting the subroutine");

print Dumper(\%example_hash);

Lo que resulta en:

$VAR1 = 'Within the subroutine';

$VAR1 = {

'new_value' => 2,

'old_value' => 1

};

$VAR1 = 'After exiting the subroutine';

$VAR1 = {

'old_value' => 1

};

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;

# De-reference the hash to add a new value

$hashref->{new_value} = 2;

print Dumper("Within the subroutine");

print Dumper($hashref);

https://riptutorial.com/es/home 122


}

return;

# Create a hashref

my $example_ref = {

old_value => 1,

};

# Pass a hashref to a subroutine

modify($example_ref);

print Dumper("After exiting the subroutine");

print Dumper($example_ref);

Esto resultará en:

$VAR1 = 'Within the subroutine';

$VAR1 = {

'new_value' => 2,

'old_value' => 1

};

$VAR1 = 'After exiting the subroutine';

$VAR1 = {

'new_value' => 2,

'old_value' => 1

};

Typeglobs, typeglob refs, manejadores de archivos y constantes

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!).

use v5.10; # necessary for say

our $foo = "foo";

our $bar;

say ref *foo{SCALAR}; # SCALAR

say ${ *foo{SCALAR} }; # bar

*bar = *foo;

say $bar;

# bar

$bar = 'egg';

say $foo;

# egg

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:

use v5.10; # necessary for say

open(my $log, '> utf-8', '/tmp/log') or die $!; # open for writing with encoding

say $log 'Log opened';

# 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.

# Global constant creation

*TRUE = \('1');

our $TRUE;

say $TRUE; # 1

$TRUE = ''; # dies, "Modification of a read-only value attempted"

# 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

Perl tiene una serie de sigilos:

$scalar = 1; # individual value

@array = ( 1, 2, 3, 4, 5 ); # sequence of values

%hash = ('it', 'ciao', 'en', 'hello', 'fr', 'salut'); # unordered key-value pairs

&function('arguments'); # subroutine

*typeglob; # symbol table entry

Estos parecen sigilos, pero no son

\@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.

%hash;

# we use % because we are looking at an entire hash

$hash{it}; # we want a single value, however, that's singular, so we use $

$array[0]; # likewise for an array. notice the change in brackets.

@array[0,3]; # we want multiple values of an array, so we instead use @

@hash{'it','en'}; # similarly for hashes (this gives the values: 'ciao', 'hello')

%hash{'it','fr'}; # we want an hash with just some of the keys, so we 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.

my @array = 1..5;

# This is an array

my $reference_to_an_array = \@array; # A reference to an array is a singular value

push @array, 6;

# push expects an array

push @$reference_to_an_array, 7; # the @ sigil means what's on the right is an array

# and what's on the right is $reference_to_an_array

# hence: first a @, then a $

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.

# pop does not like array references

pop $reference_to_an_array; # ERROR in Perl 5.20+

# but if we use @{}, then...

pop @{ $reference_to_an_array }; # this works!

Como resultado, @{} realidad acepta una expresión:

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

... y el mismo truco funciona para otros sigilos, también.

# 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";

}

... pero si el "argumento" a un sigilo es simple, puedes dejar las llaves.

say $$scalar_reference;

say pop @$array_reference;

for keys (%$hash_reference) { ... };

Las cosas pueden volverse excesivamente extravagantes. Esto funciona, pero por favor Perl

responsablemente.

my %hash = (it => 'ciao', en => 'hi', fr => 'salut');

my $reference = \%hash;

my $reference_to_a_reference = \$reference;

my $italian = $hash{it};

# Direct access

my @greets = @$reference{'it', 'en'};

# Dereference, then access as array

my %subhash = %$$reference_to_a_reference{'en', 'fr'} # Dereference ×2 then access as hash

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.

• Haciendo referencia a una subrutina:

sub many_bars { 'bar' x $_[0] }

my $reference = \&many_bars;

say $reference->(3); # barbarbar

• Llamando a una función ignorando su prototipo.

• 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.

Lea Variables en línea: https://riptutorial.com/es/perl/topic/1566/variables

https://riptutorial.com/es/home 126


Capítulo 39: Variables especiales

Observaciones

PARA HACER: Añadir más contenidos.

Examples

Variables especiales en perl:

1. $_ : el espacio predeterminado de entrada y búsqueda de patrones.

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.

Las siguientes funciones usan $_ como argumento predeterminado:

abs, alarm, chomp, chop, chr, chroot, cos, defined, eval,

evalbytes, exp, fc, glob, hex, int, lc, lcfirst, length, log,

lstat, mkdir, oct, ord, pos, print, printf, quotemeta, readlink,

readpipe, ref, require, reverse (in scalar context only), rmdir,

say, sin, split (for its second argument), sqrt, stat, study,

uc, ucfirst, unlink, unpack.

2. @_ : Esta matriz contiene los argumentos pasados a la subrutina.

Ejemplo 1:

example_sub( $test1, $test2, $test3 );

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 .

Lea Variables especiales en línea: https://riptutorial.com/es/perl/topic/7962/variables-especiales

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

Los siguientes valores se consideran falsos:

• '' , la cadena vacía. Esto es lo que devuelven los operadores de comparación incorporados

(por ejemplo, 0 == 1 )

• 0 , el número 0, incluso si lo escribes como 000 o 0.0

• '0' , la cadena que contiene un solo 0 dígitos

• undef , el valor indefinido

• Objetos que utilizan la sobrecarga para numerar / encadenar en valores falsos, como

JSON::false

Todos los demás valores son verdaderos:

• cualquier número distinto de cero, como 1 , 3.14 , 'NaN' o 'Inf'

• cualquier cadena que sea numéricamente 0 pero no literalmente la cadena '0' , como '00' ,

'0e0' , "0\n" y "abc" .

Si intencionalmente está devolviendo un valor numérico verdadero 0, prefiera '0E0' (usado

por módulos conocidos) o '0 but true' (usado por las funciones de Perl)

• cualquier otra cadena que no esté vacía, como ' ' , 'false'

• todas las referencias, incluso si hacen referencia a valores falsos, como \'' , [] o {}

• Una matriz o hash de valores falsos.

Los siguientes operadores se tratan normalmente para

devolver un valor booleano en contexto escalar:

• @a devuelve si la matriz está vacía o no

• %h devuelve si el hash está vacío o no

• 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

use feature qw( say );

# Numbers are true if they're not equal to 0.

say 0

? 'true' : 'false'; # false

say 1

? 'true' : 'false'; # true

say 2

? 'true' : 'false'; # true

say -1

? 'true' : 'false'; # true

say 1-1

? 'true' : 'false'; # false

say 0e7

? 'true' : 'false'; # false

say -0.00

? 'true' : 'false'; # false

# Strings are true if they're not empty.

say 'a'

? 'true' : 'false'; # true

say 'false' ? 'true' : 'false'; # true

say ''

? 'true' : 'false'; # false

# Even if a string would be treated as 0 in numeric context, it's true if nonempty.

# The only exception is the string "0", which is false.

# To force numeric context add 0 to the string

say '0'

? 'true' : 'false'; # false

say '0.0'

? 'true' : 'false'; # true

say '0e0'

? 'true' : 'false'; # true

say '0 but true' ? 'true' : 'false'; # true

say '0 whargarbl' ? 'true' : 'false'; # true

say 0+'0 argarbl' ? 'true' : 'false'; # false

# Things that become numbers in scalar context are treated as numbers.

my @c = ();

my @d = (0);

say @c

? 'true' : 'false'; # false

say @d

? 'true' : 'false'; # true

# Anything undefined is false.

say undef

? 'true' : 'false'; # false

# References are always true, even if they point at something false

my @c = ();

my $d = 0;

say \@c

? 'true' : 'false'; # true

say \$d

? 'true' : 'false'; # true

say \0

? 'true' : 'false'; # true

say \''

? 'true' : 'false'; # true

Lea Verdadero y falso en línea: https://riptutorial.com/es/perl/topic/649/verdadero-y-falso

https://riptutorial.com/es/home 129


Creditos

S.

No

Capítulos Contributors

1

Empezando con Perl

Language

Alan Haggai Alavi, choroba, Christopher Bottoms, Community,

datageist, Denis Ibaev, eddy85br, Eugen Konkov, Jon Ericson,

Leon Timmermans, oals, Pro Q, rlandster, xfix

2 Aleatoriedad Christopher Bottoms, Rebecca Close, Zaid

3 Análisis XML cbmckay, Drav Sloan, eballes, Sobrique

4

5

Aplicaciones GUI en

Perl

Archivo I / O (lectura

y escritura de

archivos)

oldtechaa

Christopher Bottoms, Denis Ibaev, Håkon Hægland, Kemi, Kent

Fredric, matt freake, Nagaraju, rbennett485, SajithP, Sebi,

SREagle, Tim Hallyburton, yonyon100

6 Bailarín Chankey Pathak, vanHoesel

7 Clasificación Jon Ericson, kjpires, mbethke

8

Comandos Perl para

Windows Excel con

Win32 :: módulo

OLE

Jean-Francois T.

9 Comentarios 4444, Christopher Bottoms, lanti, Rebecca Close

10

11

12

13

14

Compilar el módulo

sapnwrfc de Perl

cpan a partir del

código fuente

Cuerdas y métodos

de citar.

Declaraciones de

control

Depuración de

scripts Perl

Dividir una cadena

en separadores sin

comillas

flotux

badp, Christopher Bottoms, Denis Ibaev, digitalis_, Kent Fredric,

mbethke, svarog

callyalater, Christopher Bottoms, oals, Stephen Leppik

4444, Eugen Konkov

DVK, Ian Praxil, serenesat

https://riptutorial.com/es/home 130


15

16

Empacar y

desempacar

Expresiones

regulares

Denis Ibaev, Kent Fredric, mbethke

Al.G., Jon Ericson, rlandster, SajithP, Sarwesh Suman, Stephen

Leppik

17 Fechas y hora Ngoan Tran, waghso

18 Instalacion de perl fanlim, flamey, Håkon Hægland, Iván Rodríguez Torres, luistm

19

20

Instalar módulos Perl

a través de CPAN

Interacción simple

con la base de datos

a través del módulo

DBI.

Christopher Bottoms, Kemi, luistm, Ngoan Tran, Peter

Mortensen, Randall

Ngoan Tran

21 Interpolación en Perl oals, Ruslan Batdalov

22

Leyendo el

contenido de un

archivo en una

variable

Alien Life Form, Christopher Bottoms, digitalis_, Jeff Y, Kemi,

mbethke, mob, pwes, rlandster, SREagle

23 Liza

brian d foy, Christopher Bottoms, David Mertens, Denis Ibaev,

DVK, Eugen Konkov, Muaaz Rafi, pwes, reflective_mind, Rick

James, Wolf

24

Manejo de

excepciones

badp, simbabque

25 Mejores prácticas fifaltra, interduo

26

27

Optimización del uso

de la memoria.

Orientado a objetos

Perl

mbethke

badp, Dmitry Egorov, Ruslan Batdalov, simbabque

28 Paquetes y módulos

AntonH, Christopher Bottoms, John Hart, Jon Ericson, Kemi,

Kent Fredric, lepe, mbethke

29 Perl one-liners Dmitry Egorov, Eugen Konkov, Kemi, mbethke, zb226

30 Perl Testing nslntmnx

31 Perlbrew Håkon Hægland

32 Salida de depuración Ataul Haque, Christopher Bottoms, Joe, simbabque, waghso

https://riptutorial.com/es/home 131


33 Subrutinas

badp, Christopher Bottoms, dave, digitalis_, interduo, mbethke,

Michael Carman, msh210, Wolf, xfix, xtreak

34 Texto atribuido SajithP

35

Una forma sencilla

de comprobar los

módulos instalados

en Mac y Ubuntu

fanlim, Ngoan Tran,

36 Unicode Håkon Hægland, Kemi, Kent Fredric, mbethke

37 Variables

Ataul Haque, badp, digitalis_, dmvrtx, Eugen Konkov, Håkon

Hægland, interduo, Jon Ericson, Kent Fredric, mbethke, Mik,

nfanta, oals, Otterbein, zb226

38 Variables especiales AbhiNickz, Denis Ibaev, oals

39 Verdadero y falso

badp, Bill the Lizard, Christopher Bottoms, ikegami, Kent Fredric

, mbethke, msh210, Ole Tange, xfix

https://riptutorial.com/es/home 132

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!