• Publicidad

Validar último carácter

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Validar último carácter

Notapor mutearg » 2011-05-03 15:22 @682

Hola gente, estoy haciendo una parte de un programa donde tengo que validar un archivo, que contendrá permisos de base de datos. La lógica de la validación consistirá en:

- Validar que haya una sola sentencia por cada línea y finalice con ";"
(no pueden haber dos sentencias de grants en una misma línea)

- Validar que solo contenga "Grant insert,update,delete,references,execute,select y all" y nada más (no puede haber ningún otro tipo de grant)

- Luego de cumplir con esto se aplicarán los permisos en la base de datos previamente seleccionada.

Estoy armándolo pero no consigo encontrar una función para validar esto.

Hasta ahora tengo armado el esqueleto pero me falta.

Les agradecería mucho si me pueden orientar. ¡¡¡ Muchas gracias !!!

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl512 -w
  2. use DBI;
  3. use DBD::DB2;
  4. use DBD::DB2::Constants;
  5. use DateTime;
  6.  
  7. my $archivo = "/home/mihome/archivo";
  8.  
  9. if ( -e $archivo ) {
  10.     print "el archivo '$archivo' existe\n";
  11.     sleep(2.5);
  12.     system "clear";
  13.     open( PUNTERO, $archivo );
  14.  
  15.     while ( $linea = <PUNTERO> ) {
  16.  
  17.         @data = split /;/, $linea;
  18.  
  19.         foreach my $val (@data) {
  20.             print "$linea\n";
  21.         }
  22.  
  23.         #} #cierre if data =="
  24.  
  25.         #@campo=split /;/ , $linea;
  26.         #$linea=lc $linea;
  27.         #print "$linea";
  28.  
  29.         #($campo)=split /\;+/ , $linea;
  30.         #my $campo1=lc $campo;
  31.         #my @arch=split /\;+/ , $archivo;
  32.         #print "$campo1\n";
  33.  
  34.     }
  35.     close(PUNTERO);
  36. }
  37.  
  38. else {
  39.     print "el archivo $archivo no existe\n";
  40.     sleep(3);
  41.  
  42. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2011-05-03 17:58 @790, editado 1 vez en total
Razón: Formatear el código con Perltidy y sintaxis Perl
mutearg
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-11-30 15:00 @667

Publicidad

Re: Validar último carácter

Notapor explorer » 2011-05-03 18:15 @802

Estaría bien ver un fichero de entrada de ejemplo, unas cuantas líneas, para ver cómo es lo que quieres procesar.

Parece un trabajo perfecto para usar expresiones regulares.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Validar último carácter

Notapor mutearg » 2011-05-04 10:11 @466

explorer, te paso un ejemplo de archivo de entrada.

Donde quiero validar que sea una sentencia por línea, que diga GRANT, que finalice con ";" y que no haya otro tipo de grant que los mencionados arriba.

GRANT exec on cgsp_pag_entidad_f_SN to general;;grant exec on cgsp_pag_entidad_f_SN to Consulta;
gran exec on cgsp_pag_entidad_f_SN to Consulta;
grant exec on cgsp_pag_entidad_f_SN to Consulta_Sistemas;
grant exec on cgsp_pag_entidad_f_SN to Control_de_Calidad;
grant exec on cgsp_pag_entidad_f_SN to DeudoresGestion;
grant exec on cgsp_pag_entidad_f_SN to GerenteSubgerente;
grant exec on cgsp_pag_entidad_f_SN to RRHH;
grant exec on cgsp_pag_entidad_f_SN to SICC;
grant exec on cgsp_pag_entidad_f_SN to SCOOO;
grant exec on cgsp_pag_entidad_f_SN to Seguros_Seg;
grant exec on cgsp_pag_entidad_f_SN to Supervisor_ARG
grant exec on cgsp_pag_entidad_f_SN to TOCI
grant exec on cgsp_pag_entidad_f_SN to analista_ARG
grant exec on cgsp_pag_entidad_f_SN to general;

GRANT EXECUTE,delete,insert,update ON cgsp_ctontrolrl_temp_sm_na TO general;
GRANT EXECUTE,delete,insert,update ON cgsp_altas_SIMM_automatico TO general;
GRANT EXECUTE,delete,insert,update ON cgsp_ctrl_novedades TO general;

GRANT EXECUTE,delete,insert,update ON cgsp_alta_pagos_SIMM TO general;


Aquí corregí un poco más el programita para que valide que haya grant.

if (-e $archivo){
print "el archivo '$archivo' existe\n";
sleep(2.5);
system "clear";
open(PUNTERO,$archivo);

while ($linea = <PUNTERO>){

$linea=lc $linea;
if ($linea =~/grant/ && $linea=~/;/) {

print "Sentencia Valida\n";

}
else{

print "Sentencia no valida\n";
sleep(4);
exit
}


@data=split /;/ , $linea;





foreach my $val (@data){
print "$val\n";
} #cierre while



#} #cierre if data =="



#@campo=split /;/ , $linea;
#$linea=lc $linea;
#print "$linea";

#($campo)=split /\;+/ , $linea;
#my $campo1=lc $campo;
#my @arch=split /\;+/ , $archivo;
#print "$campo1\n";


}
close(PUNTERO);
mutearg
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-11-30 15:00 @667

Re: Validar último carácter

Notapor explorer » 2011-05-04 12:39 @569

Esta es mi versión. Dado el fichero de entrada
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
GRANT exec on cgsp_pag_entidad_f_SN to general;;grant exec on cgsp_pag_entidad_f_SN to Consulta;
gran exec on cgsp_pag_entidad_f_SN to Consulta;
grant exec on cgsp_pag_entidad_f_SN to Consulta_Sistemas;
grant exec on cgsp_pag_entidad_f_SN to Control_de_Calidad;
grant exec on cgsp_pag_entidad_f_SN to DeudoresGestion;
grant exec on cgsp_pag_entidad_f_SN to GerenteSubgerente;
grant exec on cgsp_pag_entidad_f_SN to RRHH;
grant exec on cgsp_pag_entidad_f_SN to SICC;
grant exec on cgsp_pag_entidad_f_SN to SCOOO;
grant exec on cgsp_pag_entidad_f_SN to Seguros_Seg;
grant exec on cgsp_pag_entidad_f_SN to Supervisor_ARG
grant exec on cgsp_pag_entidad_f_SN to TOCI
grant exec on cgsp_pag_entidad_f_SN to analista_ARG
grant exec on cgsp_pag_entidad_f_SN to general;

GRANT EXECUTE,delete,insert,update ON cgsp_ctontrolrl_temp_sm_na TO general;
GRANT EXECUTE,delete,insert,update ON cgsp_altas_SIMM_automatico TO general;
GRANT EXECUTE,delete,insert,update ON cgsp_ctrl_novedades TO general;

GRANT EXECUTE,delete,insert,update ON cgsp_alta_pagos_SIMM TO general;
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
y con el siguiente programa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use Modern::Perl;                       # somos modernos
  3. use utf8;                               # este programa está escrito en utf8
  4. use autodie;                            # mejor morir que regresar con deshonor (proverbio Klingon)
  5.  
  6. use open ':utf8';                       # mi codificación de salida es en utf8
  7. use open ':std';                        # también en STDIN y STDOUT
  8.  
  9. open my $fh, q[<], 'kk.txt';
  10.  
  11. while (my $línea = <$fh>) {
  12.     chomp $línea;                       # quitamos el retorno de carro
  13.     #say $línea;
  14.  
  15.     next if $línea =~ /^s*$/;           # saltamos las líneas que están en blanco
  16.  
  17.     if ($línea =~ /^grant /i) {         # la línea comienza por "GRANT "
  18.  
  19.         my $punto_y_comas = $línea =~ tr/;/;/;
  20.  
  21.         if ($punto_y_comas == 1) {      # solo hay un ';' en la línea
  22.             my ($permisos) = $línea =~ /^grant (.+?) on/i;
  23.  
  24.             if ($permisos =~ /(?:(?:insert|update|delete|references|execute|select|all)[ ,])+/i) {
  25.                 say "$. : [$línea]";
  26.             }
  27.             else {
  28.                 say "ERROR en línea $.: los permisos no son correctos: [$permisos]";
  29.             }
  30.         }
  31.         else {
  32.             say "ERROR en línea $.: hay $punto_y_comas caracteres ';'";
  33.         }
  34.     }
  35.     else {
  36.         say "ERROR en línea $.: no comienza por GRANT";
  37.     }
  38. }
  39.  
  40. close $fh;
  41.  
  42. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
sale
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ERROR en línea 1: hay 3 caracteres ';'
ERROR en línea 2: no comienza por GRANT
ERROR en línea 3: los permisos no son correctos: [exec]
ERROR en línea 4: los permisos no son correctos: [exec]
ERROR en línea 5: los permisos no son correctos: [exec]
ERROR en línea 6: los permisos no son correctos: [exec]
ERROR en línea 7: los permisos no son correctos: [exec]
ERROR en línea 8: los permisos no son correctos: [exec]
ERROR en línea 9: los permisos no son correctos: [exec]
ERROR en línea 10: los permisos no son correctos: [exec]
ERROR en línea 11: hay 0 caracteres ';'
ERROR en línea 12: hay 0 caracteres ';'
ERROR en línea 13: hay 0 caracteres ';'
ERROR en línea 14: los permisos no son correctos: [exec]
16 : [GRANT EXECUTE,delete,insert,update ON cgsp_ctontrolrl_temp_sm_na TO general;]
17 : [GRANT EXECUTE,delete,insert,update ON cgsp_altas_SIMM_automatico TO general;]
18 : [GRANT EXECUTE,delete,insert,update ON cgsp_ctrl_novedades TO general;]
20 : [GRANT EXECUTE,delete,insert,update ON cgsp_alta_pagos_SIMM TO general;]
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Validar último carácter

Notapor mutearg » 2011-05-04 15:46 @699

¡¡¡ Muchas gracias voy a verlo con más detenimiento en casa !!!
¡¡ Agradecido eternamente !!
mutearg
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-11-30 15:00 @667

Re: Validar último carácter

Notapor mutearg » 2011-05-09 11:01 @501

Explorer, estoy estudiando cada línea detenidamente y de paso voy aprendiendo expresiones regulares.

Estoy probando en mi trabajo lo siguiente y recibo el error que te describo.

¿Sabes por qué puede ser?

No creo que sea lo del use Modern::Perl, que lo saqué porque no lo encuentra en el Perl que tengo instalado.

Te agradezco.

Código
Sintáxis: [ Descargar ] [ Ocultar ]
  1. #!/usr/bin/perl512 -w 
  2.  
  3. use utf8; 
  4. use autodie; 
  5.  
  6. my $string = "/home/roj48598/archivo1"; 
  7. open( PUNTERO, $string ); 
  8.  
  9. while ( $linea = <PUNTERO> ) { 
  10.  
  11.   if ( $linea = /^grant/i ) {    #comienza la linea por grant 
  12.  
  13.     my $punto_y_coma = $linea =~ tr/;/;/ 
  14.       ;             # con esto devuelvo el número de puntos y comas que hay 
  15.  
  16.     if ( $punto_y_coma == 1 ) {  # si tiene un solo punto y coma 
  17.  
  18.         my $permisos = $línea =~ /^grant (.+?) on/i; 
  19.         print "$permisos\n"; 
  20.         sleep(2); 
  21.     }     
  22.   } 


Mensaje de Error :
Sintáxis: [ Descargar ] [ Ocultar ]
  1. Unrecognized character \xED; marked by <-- HERE after misos = $l<-- HERE near column 24 at ./practica line 17. 
mutearg
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-11-30 15:00 @667

Re: Validar último carácter

Notapor explorer » 2011-05-09 12:34 @565

Gracias al uso de

use utf8;

se pueden escribir programas con caracteres con tilde.

Por ejemplo:

my $línea;

Observa que la variable lleva tilde, porque, en efecto, las líneas llevan tilde.

Y lo que pasa en tu programa es muy curioso...

En el while(), en el if() y en la primera expresión regular, estás usando la variable $linea.

En cambio, en la línea del error, estás usando $línea (que es una variable distinta de $linea), pero, aún más para liar la madeja, resulta que esa 'i' con tilde no es un carácter en utf8, sino en iso-8859 (quizás, iso-8859-1 o iso-8859-15).

Por eso sale error: no te dice que estás usando una variable que Perl desconoce y que es distinta de las anteriores (no te lo dice porque, al quitar Modern::Perl, desactivaste 'use strict;'), sino que te está diciendo que ha encontrado una variable que tiene un carácter tildado, pero no es un carácter del juego de caracteres utf8, del que te comprometiste en escribir el programa (por lo del 'use utf8').

Solución...

1.- si no vas a usar variables con codificación utf8, quita el 'use utf8'

2.- asegúrate de que todas las variables son las que quieres usar. Entonces, en la línea del error, cambia $línea por $linea.

3.- Consejo. Para que Perl te ayude a identificar estos errores, con más claridad, mientras aprendes, lo que puedes hacer es colocar las siguientes líneas al principio de cada programa:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;          # Perl te avisará de que hay variables sin declarar
  2. use warnings;        # Perl te avisará de que hay variables sin definir, o de cosas raras que él vea
  3. use diagnostics;     # Perl te dará mucha más información, por cada error que encuentre
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Validar último carácter

Notapor mutearg » 2011-05-16 10:38 @485

Explorer, como siempre muy interesante lo que pones.

Estoy haciendo como decís, pero no logro encontrar el error.
Deje todo como "linea"( sin los tildes), pero sigo obteniendo un error

Sintáxis: [ Descargar ] [ Ocultar ]
  1. Use of uninitialized value $_ in pattern match (m//) at ./practica line 14,<PUNTERO> line 1 (#1) 


Por lo que entiendo es como si no tuviese inicializada la variable, pero creo que sí lo está.
Estuve probando pero no logro encontrar el problema.

Aprovecho para preguntarte qué significa la expresión regular siguiente :
Sintáxis: [ Descargar ] [ Ocultar ]
  1. /^grant (.+?) on/i; 

Alcanzo a entender que encuentre los que comienzan con "grant".

Por último preguntarte si hay algún libro o guía que vos recomendas como un "must" a leer.

Muchas Gracias
mutearg
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-11-30 15:00 @667

Re: Validar último carácter

Notapor explorer » 2011-05-16 11:06 @504

El primer error está en la línea

if ( $linea = /^grant/i )

cámbialo por

if ( $linea =~ /^grant/i )

La expresión /^grant (.+?) on/i; quiere decir:

  • busca si la línea comienza por "grant ",
  • seguido de un conjunto de uno o más caracteres (.+) que preceden inmediatamente (?)
  • a la cadena " on",
  • y los capturas (()) en $1
  • ¡Ah!, y la búsqueda debe ser independientemente del tamaño de caja de las letras (/i)

Vamos, que nos quedamos (capturamos) todo aquello que está entre 'grant' y el primer 'on' que encontremos.

En cuanto a libros, mira aquí. Pero lo mejor es Por dónde empezar.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados