• Publicidad

Expresión regular

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Re: Expresión regular

Notapor situ » 2011-01-18 07:27 @352

Perdón, pero no me doy cuenta de cómo hacerlo. ¿Podrías ayudarme?

Muchas gracias.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Publicidad

Re: Expresión regular

Notapor explorer » 2011-01-18 07:54 @371

Claro... no hay muchos detalles porque estamos en el foro Intermedio... ;)

Puedes guardar las líneas en un hash, indexadas por el campo principal (servers, allow...) en una estructura de hash de array, para guardar las mismas líneas de un mismo campo en la misma clave hash.

Luego, en la salida, lees las claves hash según el orden en que quieres que salgan. Y de cada clave, listar todos los elementos del array correspondientes a esa clave.
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: Expresión regular

Notapor situ » 2011-01-18 08:02 @376

Okas, muchas gracias; voy a ver si me sale =)
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Expresión regular

Notapor situ » 2011-01-19 08:53 @412

Perdón nuevamente pero no logro hacer que funcione el script ya que no sé cómo definir las variables en forma glogal. Me pueden ayudar =).

Gracias.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use common::sense;
  3. use autodie;
  4.  
  5. my $servers  = header("servers");
  6. @ssh= "";
  7. $hostname= "";
  8.  
  9.  
  10. open my $fh, q[<], 'kk.txt';
  11.  
  12. while (my $linea = <$fh>) {
  13.  
  14.     given ($linea) {
  15.         when(/hostname (.*)/) {
  16.              "$hostname=$1";
  17.         }
  18.         when(/Servers (.*)/) {
  19.         push (@ssh,$1);
  20.         }
  21.    }
  22. }
  23. print "### Hostname ### \n$hostname\n";
  24. print "### Authentication ###\n";
  25. foreach(@ssh) {
  26.         print $_ . "\n";
  27. }
  28.  
  29. close $fh;
  30.  
  31. sub header {
  32.     my $header = shift;
  33.  
  34.     return sub {
  35.             state $head;
  36.             $head = $head // $header;
  37.             say "$head -> $_[0]";
  38.             ($head = $header) =~ y/-a-zA-Z/ / if $head eq $header;
  39.     }    
  40. }
  41.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Expresión regular

Notapor explorer » 2011-01-19 10:55 @496

Una cosa es definir las variables, con un valor. Y otra cosa es declararlas (globales, locales o léxicas).

Si quieres declarar variables de forma global, te vale con usar la función my() en el contexto global, para que sean conocidas en el paquete donde están. O usar our() si quieres que sean conocidas en el contexto de todo el fichero (todos los paquetes definidos en el fichero).
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: Expresión regular

Notapor situ » 2011-01-19 13:16 @594

Muchas gracias ya me funciona.
Saludos.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Expresión regular

Notapor situ » 2011-02-03 19:49 @867

Estoy tratando de hacer una regex y mediante el resultado ejecutar una acción pero no lo logré. ¿Me pueden ayudar?

Contenido del archivo config.cfg
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
aaa-server AServer (iface) host 1.2.3.4
aaa-server AServer (iface) host 1.2.3.1
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Aplicación:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. @valor = (1.2.3.4,1.2.3.5);
  3. open($archivo, "<", 'pix.cfg');
  4. while ( $resultado = <$archivo> ) {
  5. if($resultado =~ m/^aaa-server\s.*\shost\s([0-9|\.].*)/) {
  6.  push (@prueba,$1);
  7.  
  8. }
  9. }
  10. print "### Server Tacacs ###\n";
  11. foreach(@prueba) {
  12. if ($_ eq @valor) {
  13. print $1;
  14. }
  15. }
  16. close $archivo;
  17.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Mi idea es sacar las IP que están en el archivo y compararlas con la variable @valor y que me muestre algo como:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
1.2.3.4 OK
1.2.3.5 NO
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Así sé qué tiene configurado.

Saludos.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Expresión regular

Notapor explorer » 2011-02-03 19:57 @873

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ($resultado =~ m/host ([0-9.]+)/) {
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: Expresión regular

Notapor situ » 2011-02-03 20:00 @875

Con la regex de la aplicación funcionada ya que me captura las IP, el tema que no me funciona la comparación contra las de la variable @valor.

Mi idea es ver si las IP que están en @valor son las que figuran en la configuración.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Expresión regular

Notapor explorer » 2011-02-03 20:15 @885

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. foreach(@prueba) {
  2.     if ($_ eq @valor) {
  3.         print $1;
  4.     }
  5. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

A ver... hay varios errores...

'eq' es para comparar cadenas, pero espera a que a ambos lados existan dos escalares, y tu has puesto un array.

$1 contiene lo capturado por el primer par de paréntesis de la expresión regular, pero... aquí NO hay ninguna expresión regular....

Tienes que hacer un doble bucle: uno que recorra @prueba y otro que recorra @valor. Y decidir qué valor es el que quieres presentar.

Si estás en un Perl igual o superior a v5.10, puedes hacer

if ($_ ~~ @valor) {

y sí que te lo busca dentro del array.
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

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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