Mie Feb 21, 2007 12:46 pm
|
 |
nany
Perlero Nuevo

|
Registrado: 11 Dic 2006
Mensajes: 17
|
|
| Ayuda con expresiones regulares |
|
|
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  |
|
|
|
Mie Feb 21, 2007 1:17 pm
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
|
|
|
|

Mie Feb 21, 2007 2:28 pm
|
 |
nany
Perlero Nuevo

|
Registrado: 11 Dic 2006
Mensajes: 17
|
|
|
|
|
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 |
|

Mie Feb 21, 2007 2:51 pm
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 478
Ubicación: Frente al monitor
|
|
|
|
|
| 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 |
|

Mie Feb 21, 2007 3:15 pm
|
 |
nany
Perlero Nuevo

|
Registrado: 11 Dic 2006
Mensajes: 17
|
|
|
|
|
| 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? |
|
Mie Feb 21, 2007 3:54 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4086
Ubicación: Valladolid, España
|
|
|
|
|
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. |
|
Jue Feb 22, 2007 1:37 pm
|
 |
nany
Perlero Nuevo

|
Registrado: 11 Dic 2006
Mensajes: 17
|
|
| gracias |
|
|
| gracias a todos por su ayuda ya lo acabe gracias |
|

Vie Feb 23, 2007 2:38 pm
|
 |
nany
Perlero Nuevo

|
Registrado: 11 Dic 2006
Mensajes: 17
|
|
|
|
|
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;
} |
|
|

Vie Feb 23, 2007 2:48 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4086
Ubicación: Valladolid, España
|
|
|
|
|
| Pues haces un open por cada fichero y luego en el bucle, haces un print distinto (if) según el tipo de licencia. |
|

Vie Feb 23, 2007 3:32 pm
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 478
Ubicación: Frente al monitor
|
|
|
|
|
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; |
|
|

Mar Feb 27, 2007 12:22 pm
|
 |
nany
Perlero Nuevo

|
Registrado: 11 Dic 2006
Mensajes: 17
|
|
| nuevamente yo |
|
|
hello soy yo de nuevo bueno solo para confirmar una duda 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 |
|

Mar Feb 27, 2007 2:05 pm
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 478
Ubicación: Frente al monitor
|
|
|
|
|
| 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; |
|
|

Mie Feb 28, 2007 11:27 am
|
 |
nany
Perlero Nuevo

|
Registrado: 11 Dic 2006
Mensajes: 17
|
|
|
|
|
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];
|
|
|

Mie Feb 28, 2007 11:38 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4086
Ubicación: Valladolid, España
|
|
|
|
|
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. |
|
Powered by phpBB © 2001, 2005 phpBB Group
|