2011-05-03 15:22 @682 |
|
|
mutearg
Perlero Nuevo
|
Registrado: 2010-11-30 15:00 @667 Mensajes: 8
|
|
|
Validar último carácter
|
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 !!!Using perl Syntax Highlighting #!/usr/bin/perl512 -w
use DBI;
use DBD::DB2;
use DBD::DB2::Constants;
use DateTime;
my $archivo = "/home/mihome/archivo";
if ( -e $archivo ) {
print "el archivo '$archivo' existe\n";
sleep(2.5);
system "clear";
open( PUNTERO, $archivo );
while ( $linea = <PUNTERO> ) {
@data = split /;/, $linea;
foreach my $val (@data) {
print "$linea\n";
}
#} #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);
}
else {
print "el archivo $archivo no existe\n";
sleep(3);
}
| Última edición por explorer el 2011-05-03 17:58 @790, editado 1 vez en total |
| Formatear el código con Perltidy y sintaxis Perl |
|
2011-05-04 10:11 @466 |
|
|
mutearg
Perlero Nuevo
|
Registrado: 2010-11-30 15:00 @667 Mensajes: 8
|
|
|
Re: Validar último carácter
|
|
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);
|
2011-05-04 12:39 @569 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10272
|
|
|
Re: Validar último carácter
|
Esta es mi versión. Dado el fichero de entrada 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; y con el siguiente programa: Using perl Syntax Highlighting #!/usr/bin/perl
use Modern::Perl; # somos modernos
use utf8; # este programa está escrito en utf8
use autodie; # mejor morir que regresar con deshonor (proverbio Klingon)
use open ':utf8'; # mi codificación de salida es en utf8
use open ':std'; # también en STDIN y STDOUT
open my $fh, q[<], 'kk.txt';
while (my $línea = <$fh>) {
chomp $línea; # quitamos el retorno de carro
#say $línea;
next if $línea =~ /^s*$/; # saltamos las líneas que están en blanco
if ($línea =~ /^grant /i) { # la línea comienza por "GRANT "
my $punto_y_comas = $línea =~ tr/;/;/;
if ($punto_y_comas == 1) { # solo hay un ';' en la línea
my ($permisos) = $línea =~ /^grant (.+?) on/i;
if ($permisos =~ /(?:(?:insert|update|delete|references|execute|select|all)[ ,])+/i) {
say "$. : [$línea]";
}
else {
say "ERROR en línea $.: los permisos no son correctos: [$permisos]";
}
}
else {
say "ERROR en línea $.: hay $punto_y_comas caracteres ';'";
}
}
else {
say "ERROR en línea $.: no comienza por GRANT";
}
}
close $fh;
__END__
sale 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;]
_________________ JF^D Perl programming
|
2011-05-04 15:46 @699 |
|
|
mutearg
Perlero Nuevo
|
Registrado: 2010-11-30 15:00 @667 Mensajes: 8
|
|
|
Re: Validar último carácter
|
|
¡¡¡ Muchas gracias voy a verlo con más detenimiento en casa !!! ¡¡ Agradecido eternamente !!
|
2011-05-09 11:01 @501 |
|
|
mutearg
Perlero Nuevo
|
Registrado: 2010-11-30 15:00 @667 Mensajes: 8
|
|
|
Re: Validar último carácter
|
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- #!/usr/bin/perl512 -w
-
- use utf8;
- use autodie;
-
- my $string = "/home/roj48598/archivo1";
- open( PUNTERO, $string );
-
- while ( $linea = <PUNTERO> ) {
-
- if ( $linea = /^grant/i ) { #comienza la linea por grant
-
- my $punto_y_coma = $linea =~ tr/;/;/
- ; # con esto devuelvo el número de puntos y comas que hay
-
- if ( $punto_y_coma == 1 ) { # si tiene un solo punto y coma
-
- my $permisos = $línea =~ /^grant (.+?) on/i;
- print "$permisos\n";
- sleep(2);
- }
- }
- }
Mensaje de Error :- Unrecognized character \xED; marked by <-- HERE after misos = $l<-- HERE near column 24 at ./practica line 17.
|
2011-05-09 12:34 @565 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10272
|
|
|
Re: Validar último carácter
|
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: Using perl Syntax Highlighting use strict; # Perl te avisará de que hay variables sin declarar
use warnings; # Perl te avisará de que hay variables sin definir, o de cosas raras que él vea
use diagnostics; # Perl te dará mucha más información, por cada error que encuentre
_________________ JF^D Perl programming
|
2011-05-16 10:38 @485 |
|
|
mutearg
Perlero Nuevo
|
Registrado: 2010-11-30 15:00 @667 Mensajes: 8
|
|
|
Re: Validar último carácter
|
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 - 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 : 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
|
2011-05-16 11:06 @504 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10272
|
|
|
Re: Validar último carácter
|
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
|
|
Página 1 de 1
|
[ 9 mensajes ] |
|
| Reglas del Foro |
No puedes abrir nuevos temas en este Foro No puedes responder a temas en este Foro No puedes editar tus mensajes en este Foro No puedes borrar tus mensajes en este Foro No puedes enviar adjuntos en este Foro
|
|
Socializa |
 |
|