viernes, 29 de marzo de 2013

Perl: Fecha y hora del sistema


A veces se necesita obtener la fecha y hora del sistema para un script.
A continuación un script que hace lo siguiente:
  • Ejecuta el comando date en Unix/Linux y devuelve los datos concatenados.
  • Ejecuta el comando date y extrae los valores de fecha y hora en variables separadas.
-------------------------------------------- CORTAR AQUI -------------------------------------------------------
#!/usr/bin/perl

use strict;

use warnings;

#Leer valores de fecha y hora del sistema, para sistemas operativos Unix/Linux

#ejecutar comando date y devolver el valor a una variable

my $nombreArchivo=`date +%Y%m%d%H%M%S`;

#limpiar caracteres de nueva linea

$nombreArchivo=~s/\n//g;

print "Variable con resultado de ejecucion de comando -> $nombreArchivo \n";



#Tomar hora del sistema. Guardar valores de fecha y hora en variables, en sistemas Unix/Linux

my $ANO=`date | cut -c25-29 | tr -d ' '`;

my $MES=`date | cut -c5-7 | tr -d ' '`;

my $DIA=`date | cut -c9-10 | tr -d ' '`;

my $HORA=`date | cut -c12-13 | tr -d ' '`;

my $MINUTOS=`date | cut -c15-16 | tr -d ' '`;

my $SEGUNDOS=`date | cut -c18-19 | tr -d ' '`;



print "Fecha tomada del sistema -> ";

print "$ANO $MES $DIA $HORA $MINUTOS $SEGUNDOS \n";

-------------------------------------------- CORTAR AQUI -------------------------------------------------------

Como procesar argumentos desde la línea de comandos en Perl al estilo Unix Ejemplo 2)


-->
En Perl se puede codificar de distintas maneras la solución de un problema.
A continuación un segundo ejemplo de procesamiento de argumentos recibidos desde la línea de comandos, sin utilizar un módulo de manejo de argumentos.
En este ejemplo, se pueden recibir las siguientes opciones:
  • -d algo: llama al proceso 1.
  • -a algo: llama al proceso 2.
  • -h : llama a ayuda.


El formato de llamado del script puede ser.

 
[usuario@maquina]$  miPrograma.pl  
 
[usuario@maquina]$  miPrograma.pl -a algo

[usuario@maquina]$  miPrograma.pl -d algo

-------------------------------------------- CORTAR AQUI -------------------------------------------------------
#!/usr/bin/perl

use strict;

##################################################

#indice para verificar el valor del argumento

my $j=0; 

my $directorio;

my $archivo;

##################################################

#Procesamiento de parametros de linea de comando

if ($#ARGV==-1) {

    print "Sin argumentos\n";

    ayuda();

} else {

    print("##########################\n");

    print("Cantidad argumentos-> $#ARGV\n");

    print("##########################\n");

    if($#ARGV!=1){

        #se espera la opcion ej -a o -d seguida de una cadena

        print "\n No se ha pasado la cantidad correcta de argumentos \n";

        exit;

    }

    for (my $i=0;$i <= $#ARGV; $i++){

        if($ARGV[$i] eq "-h"){

            ayuda();

        }        

        if($ARGV[$i] eq "-d"){

            $j=$i+1;

            if($j<=$#ARGV){

                $directorio=$ARGV[$j];

                print "Directorio-> $directorio\n";

                proceso1;

                exit;

            }else {

                ayuda();

            }

        }else{            

            if($ARGV[$i] eq "-a"){

                $j=$i+1;

                if($j<=$#ARGV){

                    $archivo=$ARGV[$j];

                    print "Archivo-> $archivo\n";

                    proceso2;

                    exit;

                }else {

                    ayuda();

                }

            }else{

                ayuda();

                exit;    

            }

        }

    }#for ($i=0;$i <= $#ARGV; $i++)

}#if ($#ARGV==-1) {

##################################################

    

sub proceso1{

    print "Proceso 1\n";

}

sub proceso2{

    print "Proceso 1\n";

}

sub ayuda{

    print "\n TEXTO DE AYUDA \n";

}
-------------------------------------------- CORTAR AQUI -------------------------------------------------------

Como procesar argumentos desde la línea de comandos en Perl al estilo Unix Ejemplo 1)


Se puede procesar argumentos recibidos desde la linea de comandos del sistema en un script.
Se propone un sencillo ejemplo que hara lo siguiente:

  • Mostrar el nombre del script.
  • Mostrar la cantidad de argumentos recibidos.
  • Mostrar los valores contenidos dentro del arreglo de argumentos estandar #ARGV.
El ejemplo no realiza un análisis sintáctico de las opciones recibidas.

-------------------------------------------- CORTAR AQUI -------------------------------------------------------
#!/usr/bin/perl
use strict;
use warnings;


#Ejemplo 1): leer valores de la linea de comandos y mostrar el nombre del script

#invocar nombreScript argumento1 argumento2

print "Nombre del script -> $0 \n";
print "Cantidad de argumentos recibidos comienza desde cero hasta $#ARGV \n";
#recorrer argumentos recibidos desde linea de comandos

for (my $i=0;$i <= $#ARGV; $i++){

    print "Argumento -> $i -> $ARGV[$i]\n";

}

-------------------------------------------- CORTAR AQUI -------------------------------------------------------


Como procesar opciones desde la línea de comandos en Perl al estilo Unix con GetOpt::Long


Algunas veces queremos que los scripts que escribimos en Perl funcionen recibiendo opciones desde la línea de comandos al estilo Unix. [usuario@maquina]$ miPrograma.pl -a algo -d otracosa Existe un módulo en Perl que permite el manejo de estas opciones. El mismo se llama Getopt::Long. También se puede hacer manualmente, pero en este caso deberíamos verificar la sintaxis por nuestra cuenta analizando la cadena, opción que no será tratada en este artículo. El ejemplo recibe las siguientes opciones:
  • -d una cadena.
  • -a una cadena.
  • Ayuda : muestra la ayuda del comando.
Para el caso de las opciones -d y -a deben ser excluyentes entre si, es decir no pueden ser invocadas ambas al mismo tiempo. -->
-------------------------------------------- CORTAR AQUI -------------------------------------------------------
#!/usr/bin/perl 
use strict;
use warnings;
use Getopt::Long;

# Lee los parámetros en una variable recibir_parametros
my $recibir_parametros = {};
GetOptions($recibir_parametros,
  'd:s',
  'a:s',
  'ayuda',
);



# Si se ha especificado el parámetro 'ayuda', imprimir la ayuda y terminar
$recibir_parametros->{ayuda} && imprimir_ayuda( 0 );
# Los parametros son mutuamente excluyentes
# si ambos estan definidos se corta la ejecucion
# evita estes tipo de llamadas ej: archivo.pl -a algo -d otracosa
if ( defined $recibir_parametros->{d} && defined $recibir_parametros->{a}) {
    imprimir_ayuda( 1 );
}



#este modelo acepta solamente uno u otro valor
#si se definio el paramaetro -d pero el valor viene vacio imprime ayuda
if( defined $recibir_parametros->{d}) {
  if(!($recibir_parametros->{d} eq "")){
      print "Se recibio: -a $recibir_parametros->{d}\n";
        #################################################
# llamar procedimiento hacer algo con -d   #################################################            
  }else{
      imprimir_ayuda( 1 );
  }
}else 
{
  if( defined $recibir_parametros->{a}) {
    if(!($recibir_parametros->{a} eq "")){
      print "Se recibio: -a $recibir_parametros->{a}\n";
      #################################################
      # llamar procedimiento hacer algo con -a
      #################################################      
    }else{
      imprimir_ayuda( 1 );
    }
  }else{
    imprimir_ayuda( 1 );
  }
}



sub imprimir_ayuda {
    my $exit_status = shift;
    print <<"END"
    Uso: $0 [-d ruta directorio_busqueda | -a archivo_con_texto]
    Obtiene direcciones de correo desde un directorio con archivos o 
    desde un archivo ingresado por el usuario.
       
    Los parámetros son obligatorios si no se indica lo contrario:
          -d     procesa todos los archivos de un directorio
          -a     procesa solamente un archivo especificado          
          -ayuda Imprime esta ayuda
          Los parametros -d y -a son excluyentes entre si!!
           
END
;


    exit $exit_status;

}


-------------------------------------------- CORTAR AQUI -------------------------------------------------------