Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Ayuda con expresiones regulares

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Mie Feb 21, 2007 12:46 pm
nany
Perlero Nuevo
Perlero Nuevo
Registrado: 11 Dic 2006
Mensajes: 17
Ayuda con expresiones regulares Responder citando

Hola. Ojalá pudieran ayudarme a resolver un problema. Es que necesito utilizar expresiones regulares.
Tengo que buscar de una lista la segunda palabra de la línea e imprimir toda.
Pasando como parámetro esa misma palabra.

¡Ayúdenme, por favor!. nany Crying or Very sad
Mensaje Mie Feb 21, 2007 1:17 pm
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Responder citando

Hola:

Vamos a necesitar de más detalles para poder ayudarte. Sería conveniente que nos muestres el texto que quieres filtrar así como el código que ya llevas trabajado por tu parte.

También te recomiendo que cheques nuestra sección de expresiones regulares aquí en el sitio:
http://perlenespanol.baboonsoftware.com/tutoriales/expresiones_regulares/index.html

Saludos
Mensaje Mie Feb 21, 2007 2:28 pm
nany
Perlero Nuevo
Perlero Nuevo
Registrado: 11 Dic 2006
Mensajes: 17
Responder citando

Hola, ok. Mira, este es mi programa.
Perl:
#!/usr/bin/env perl
#######################
#Definicion de variables
#######################
my $f_Archivo_de_Entrada = "/export/home/sistemas/nolvera/perl/expresiones/lic.dat";
my  @a_Nodo = qw (1 2);
######################
#Abrir archivo
######################
my @a_parametros=@ARGV;
foreach my $a_parametros(@a_parametros)
{
    open IN, "$f_Archivo_de_Entrada";
    while (<IN>){
    my  $s_Linea = $_;
    chomp $s_Linea;
close IN;


                  if ($s_Linea =~ m/(.*)(rpplus)(.*)/){
                      print "$s_Linea\n";
                }else{
                     print "No encontro licencia \n"
                     }
}
}#foreach


Tengo que checar de un archivo la segunda palabra que se refiere al nombre de una licencia; por cierto estoy checando lo que me mandaste, Gracias
Mensaje Mie Feb 21, 2007 2:51 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 478
Ubicación: Frente al monitor
Responder citando

Shocked

Perl:
#!/usr/bin/env perl
#######################
#Definicion de variables
#######################
my $f_Archivo_de_Entrada = "/export/home/sistemas/nolvera/perl/expresiones/lic.dat";
 my @a_Nodo = qw (1 2);
######################
#Abrir archivo
######################
open IN, "$f_Archivo_de_Entrada";
while (my $s_Linea = <IN>){
  chomp $s_Linea;
  if ($s_Linea =~ m/(.*)(rpplus)(.*)/){
    print "$s_Linea\n";
  }
  else {
    print "No encontro licencia \n"
  }
}
close IN;


No necesitas hacer un foreach y después un while... no haces nada con los argumentos, si lo haces =>

Perl:
die "ERROR: Necesito de argumentos para operar\n" until @ARGS;
my $buscar = join("|", @ARGS);
while...
if($linea =~ /($buscar)/){...}


Ultima edición por creating021 el Mie Feb 21, 2007 5:32 pm, editado 1 vez
Mensaje Mie Feb 21, 2007 3:15 pm
nany
Perlero Nuevo
Perlero Nuevo
Registrado: 11 Dic 2006
Mensajes: 17
Responder citando

El problema radica en que sólo busca en la primera línea del archivo. No busca en las demás- ¿Cómo puedo hacer eso?
Mensaje Mie Feb 21, 2007 3:54 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4086
Ubicación: Valladolid, España
Responder citando

Sólo busca la primera porque cierras el fichero inmediatamente después de leer esa línea.

Debes hacer el close después de haber leído todo el fichero.

¿Puedes poner un ejemplo del fichero de entrada, aunque sea con datos falsos? Es importante ver la estructura del fichero.
Mensaje Mie Feb 21, 2007 4:16 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 478
Ubicación: Frente al monitor
Responder citando

nany escribió:
El problema radica en que sólo busca en la primera línea del archivo. No busca en las demás. ¿Cómo puedo hacer eso?


Mira el código que he puesto que, tal como dice explorer, cierras el fichero en la primera línea, además usas un loop dentro de otro =>

Perl:
foreach () {
     while (<FICHERO>){}
}


Cosa que no necesitas hacer (según veo)...
Lo otro es lo de los args pero eso ya lo comenté.

Otra cosa (ver código) es que no miras si hay o no argumentos (bug).
Mensaje Jue Feb 22, 2007 1:37 pm
nany
Perlero Nuevo
Perlero Nuevo
Registrado: 11 Dic 2006
Mensajes: 17
gracias Responder citando

gracias a todos por su ayuda ya lo acabe gracias
Mensaje Vie Feb 23, 2007 2:38 pm
nany
Perlero Nuevo
Perlero Nuevo
Registrado: 11 Dic 2006
Mensajes: 17
Responder citando

Disculpen, sobre este mismo programa debo hacer dos archivos que contengan diferentes licencias. Los dos se encuentran en diferentes directorios, pero no sé cómo enviar al archivo los diferentes parámetros.

¡¡¡¡Saludos!!!!

Son diferentes para los dos.

Perl:
#!/usr/bin/env perl
#######################
#Definicion de variables
#######################
my $f_Archivo_de_Entrada = "/export/home/sistemas/nolvera/perl/expresiones/lic.dat";
my $f_Archivo_de_Salida  = "/export/home/sistemas/nolvera/perl/expresiones/salida/SHCP";
my $f_Archivo_de_salida2 = "/export/home/sistemas/nolvera/perl/expresiones/salida/BANXICO";
my  @a_Nodo = qw (1 2);
my $b_Bandera = 0;
######################
#Abrir archivo
######################
my @a_parametros= @ARGV;
foreach my $a_parametros(@a_parametros)
{
    open IN, "$f_Archivo_de_Entrada";
    my $b_Bandera = 0;
                     while (<IN>){
                                  my  $s_Linea = $_;
                                  chomp $s_Linea;

                                  @a_Lineas = split ' '$s_Linea;
                                  $s_Nodo = $a_Lineas[1];
                                  if ($s_Nodo eq $a_parametros){
                                  print "$s_Linea\n";
                                  }

    #### if ($s_Linea =~ m/\s$a_parametros\s/){
        #### print "$s_Linea\n";
    #### }
                                  }

close IN;

#foreach
#####################
#Generando salida
#####################

open OUT, ">$f_Archivo_de_Salida";
            &licencias ($s_Linea);
  sub licencias
     {
       if ($s_Linea =~ m/\s$a_parametros\s/){
       print OUT "$s_Linea\n";
      }
}
close OUT;

}
Mensaje Vie Feb 23, 2007 2:48 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4086
Ubicación: Valladolid, España
Responder citando

Pues haces un open por cada fichero y luego en el bucle, haces un print distinto (if) según el tipo de licencia.
Mensaje Vie Feb 23, 2007 3:32 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 478
Ubicación: Frente al monitor
Responder citando

De tu código nany:

Por cada @ARGV estás abriendo el archivo y leyendolo de nuevo... ¿No crees que es mejor leer primero el archivo y depués hacer el foreach, es decir, no es mejor hacer un foreach en por cada líne?

Mira:

Perl:
open IN, "fichero";
while ($linea = <IN>){
  chomp;
  my @a_Lineas = split ' ', $linea....
  foreach(@ARGV){print "$linea\n" if $s_Nodo eq $_;}
  ...
}
close IN;


Cómo es eso de que llamas a un sub antes de crearlo?
En ese sub (sub licencias) cómo es que puedes usar $a_parametros sindo que ha sido definida para para el uso del foreach anterior (en tu código).

De lo que he entendido esto es lo que quieres hacer:

Perl:
#!/usr/bin/env perl
use strict;
#######################
#Definicion de variables
#######################
my $f_Archivo_de_Entrada = "/export/home/sistemas/nolvera/perl/expresiones/lic.dat";
my $f_Archivo_de_Salida  = "/export/home/sistemas/nolvera/perl/expresiones/salida/SHCP";
my $f_Archivo_de_salida2 = "/export/home/sistemas/nolvera/perl/expresiones/salida/BANXICO";
my  @a_Nodo = qw (1 2);
my $b_Bandera = 0;
######################
#Abrir archivo
######################
die "ERROR: Necesito de argumentos para operar\n" until @ARGV;
my @a_parametros = @ARGV;
open IN, $f_Archivo_de_Entrada or die "Oops $f_Archivo_de_Entrada: $!\n";
my $parametros = join "|", @a_parametros;
while (my $linea = <IN>){
  chomp;
  my $s_Nodo = ((split ' ', $linea)[1]);
  if($s_Nodo =~ /($parametros)/){print "$linea\n";}
}
close IN;
Mensaje Mar Feb 27, 2007 12:22 pm
nany
Perlero Nuevo
Perlero Nuevo
Registrado: 11 Dic 2006
Mensajes: 17
nuevamente yo Responder citando

hello soy yo de nuevo bueno solo para confirmar una duda Embarassed esk tengo que leer de un archivo los datos de las licencias xxx y de ahi buscarlas en otro archivo de entrada donde se encuentran esas mismas licencias y generar el archivo de salida con la linea completa
Mensaje Mar Feb 27, 2007 2:05 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 478
Ubicación: Frente al monitor
Responder citando

Perl:
#!/usr/bin/env perl
use strict;
#######################
#Definicion de variables
#######################
my $f_Archivo_de_Entrada = "/export/home/sistemas/nolvera/perl/expresiones/lic.dat";
my $f_Archivo_de_Salida  = "/export/home/sistemas/nolvera/perl/expresiones/salida/SHCP";
my $f_Archivo_de_salida2 = "/export/home/sistemas/nolvera/perl/expresiones/salida/BANXICO";
my  @a_Nodo = qw (1 2);
my $b_Bandera = 0;
######################
#Abrir archivo
######################
die "ERROR: Necesito de argumentos para operar\n" until @ARGV;
my @a_parametros = @ARGV;
open IN, $f_Archivo_de_Entrada or die "Oops $f_Archivo_de_Entrada: $!\n";
my $parametros = join "|", @a_parametros;
open OUT ">$f_Archvio_de_Salida" or die "Error en salida: $!\n";
while (my $linea = <IN>){
  chomp;
  my $s_Nodo = ((split ' ', $linea)[1]);
  if($s_Nodo =~ /($parametros)/){
    print "$linea\n";
    print OUT "$linea\n"
  }
}
close OUT;
close IN;
Mensaje Mie Feb 28, 2007 11:27 am
nany
Perlero Nuevo
Perlero Nuevo
Registrado: 11 Dic 2006
Mensajes: 17
Responder citando

Si ya lo entendí.

Sólo que debo crear una hash pero no me sale ya que se sobrescribe.

Por favor, es que este programa me ha resultado un poco difícil.

Perl:
######################
#Abrir archivo
######################
my  @a_Nodo = qw (1 2);
my $b_Bandera = 0;
%s_cliente1;
%s_cliente2;
my $b_Bandera = 0;
%s_cliente1;
%s_cliente2;
######################
#Abrir archivo
######################
open IN, "$f_Archivo_de_Entrada2";
while (<IN>){
              my $s_Linea1 = $_;
              chomp $s_Linea1;
              my @a_Lineas1 = split ',', $s_Linea1;
              $s_Nodo = $a_Lineas1[0];
             ## $s_cliente1{$s_Nodo}= $a_Lineas1[1];
              ##$s_cliente1{$s_Nodo}= $a_Lineas1[2];
              ##$s_cliente1{$s_Nodo}= $a_Lineas1[3];
              ##$s_cliente1{$s_Nodo}= $a_Lineas1[4];
Mensaje Mie Feb 28, 2007 11:38 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4086
Ubicación: Valladolid, España
Responder citando

La variable $s_Nodo no está definida en ningún lugar.
Para crear un hash cuyas claves sean el número de licencia, te vale con poner

$hash{ $a_Lineas1[0] } = $s_Linea1;

en el bucle, por ejemplo.

Te recomiendo que pongas

use strict;
use warnings;

al principio del programa, para que te ayude un poco más.

Otro detalle: estás escribiendo en el foro Intermedio.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group