Subsecciones


Perl

Principales aplicaciones de Perl:

Algunas características

Ejecución de un script Perl

Tipos de datos en Perl

  1. Escalares (números o strings)
    $a = "manzanas";
    $b = "peras";
    print $a." y ".$b."\n"; # Muestra "peras y manzanas"
    print "$a y $b\n";      # Muestra "peras y manzanas"
    
  2. Arrays
    @frutas = ("naranjas", "limones", "uvas");
    print $frutas[2];       # uvas
    ($n, $l) = @frutas;     # $n="naranjas", $l="limones"
    push(@frutas, "cocos"); # $frutas[3] = "cocos"
    $c = pop(@frutas);      # $c = "cocos"
    $nf = scalar(@frutas);  # $nf = 3
    $fr = "@frutas";        # $fr = "naranjas limones uvas"
    @fo = split(/ /, $fr);  # @fo = ("naranjas", "limones", "uvas")
    
  3. Mapas (arrays asociativos)
    %edad_de = {
        Eva  => 23,
        Ana  => 19,
        Oscar => 41
    }
    print $edad_de{Ana};    # Imprime 19
    $edad_de{Eva}=18;       # Cambia un valor
    $edad_de{Juan} = 26;    # Añade un elemento al mapa
    
  4. Variables especiales

Control de flujo

Lazos

foreach (@frutas) { # Recorre el array
    print $_."\n";  # Imprime un elemento por
                    # línea. El punto concatena
}                   # dos strings.

print "\nAñade más frutas ";  # Imprime un mensaje
$a = <STDIN>;                 # Lee de la entrada estándar
chop $a;                      # y elimina el \n 
while ( $a ) {		# Si la entrada no está vacía 
    push(@frutas, $a);	# añádela al array
    $a = <STDIN>; chop $a;    # y lee una nueva entrada
}

Condicionales

if ( not $tengo_manzanas ) {      
  compra(\@frutas,"manzanas" ); # El array se pasa por 
}                               # referencia
Alternativa:
unless ($tengo_manzanas) {
  compra(\@frutas,"manzanas");
}
También es válido:
compra(\@frutas,"manzanas") if not $tengo_manzanas;

Subrutinas

sub compra {
    ( $array, $string ) = @_; # Los parametros se recogen 
                              # como escalares
    push(@$array, $string);   # La referencia se convierte 
                              # a array
}

Expresiones regulares

             # Sin argumentos, lee la entrada estandar
while(<>) {  # con argumentos, usa estos como nombres 
             # de ficheros y los lee línea a línea
  print if /http:\/\//; # Muestra las líneas con http://
  print if s/ttx/txt/ig; # Muestra las líneas con "ttx"
                         # y hace el cambio por "txt"
			 # g=global, i=case insensitive
}

$string = "oCme mas futra";
$string =~ s/oCme/Come/;  # =~ Aplica sustitución a $string
$string =~ s/futr/frut/;
print $string; # Imprime "Come mas fruta"

Ejemplos

  1. Muestra las terminaciones de los ficheros del directorio actual
    #!/usr/bin/perl
    use strict; 
    use warnings;
    foreach (glob("*")) {       # Recorre los ficheros
        my @file = split(/\./); # Los separa por .
        my $term = pop(@file);  # Extrae el último elemento
        print "$term\n";
    }
    
  2. En un directorio, renombra *.xml a *.html
    #!/usr/bin/perl
    use strict; 
    use warnings;
    unless (scalar(@ARGV) == 1) {
      print "Necesito un directorio como argumento\n"; exit 1;
    }
    if( not -d $ARGV[0] ) {
      print "$ARGV[0] no es un directorio\n"; exit 1;
    }
    # Cambia al directorio
    chdir $ARGV[0]; 
    # Recorre los ficheros .xml         
    foreach my $file (glob "*.xml") { 
      # Construye el nuevo nombre
      my $new = substr($file, 0, -3) . "html";
      # Renombra los ficheros
      rename $file, $new;
    }
    

  3. Lee un fichero de texto numerando las líneas no vacías
    #!/usr/bin/perl
    use strict; 
    use warnings;
    open(my $fichero, "<", "f.txt") 
         or die "No puedo abrir f.txt:$!";
    my $nl="001"; # Entero de tres dígitos
    while(<$fichero>) {
      if(!/^$/) {        # Sólo las líneas no vacías
        print "$nl $_";  # Pon un número de línea
        $nl++; 
      }
      else {
        print "$_";      # Línea vacía sin número
      }
    }
    

  4. Script para añadir usuarios al sistema
    use strict; use warnings;
    # Módulo para leer parámetros de entrada
    use Getopt::Long;  
    my $addusr = "/usr/sbin/adduser";
    my $nombre=""; my $apellido="";
    # Obtiene los parámetros
    GetOptions("nombre=s" => \$nombre, 
         "apellido=s" => \$apellido ) or uso(); 
    # Comprueba los parámetros sean correctos
    if( not $nombre or not $apellido ) {     
        uso();
    }
    if ( $nombre !~ /^[a-zA-Z]+$/) {         
        uso("El nombre debe ser alfabético");
    }
    if ( $apellido !~ /^[a-zA-Z]+$/) {  
        uso("El apellido debe ser alfabético");
    }
    
    # Construye el username 
    my $username = lc( substr($apellido, 0, 1) . $nombre);  
    # Directorio HOME 
    my $home     = "/home/$username";
    # Comando a ejecutar
    my $comando = qq($addusr --home $home --disabled-password \\
                --gecos "$nombre $apellido" $username);
    system $comando; # Ejecuta el comando
    
    # Error e información de uso
    sub uso {
      my ($msg) = @_;      # Recogo los parámetros
      if ($msg) {          # Si se pasa un mensaje de error, 
         print "$msg\n\n"; # lo muestra
      }
      print "Usar: $0 --nombre Nombre --apellido Apellido\n";
      exit;
    }
    

Referencias

Administración de Sistemas e Redes <ASR.USC[at]gmail.com>
Tomás Fernández Pena <tf.pena[at]usc.es>
Última actualización: 30-09-15 17:44 por tomas

Creative Commons License
Curso de Administración de Sistemas y Redes por Tomás Fernández Pena se distribuye bajo la licencia Creative Commons Recoñecemento-Compartir baixo a mesma licenza. 3.0 España.
Trabajo original en persoal.citius.usc.es/tf.pena/ASR.