• Publicidad

Saltar a la siguiente línea

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

Saltar a la siguiente línea

Notapor Norther » 2007-11-10 10:52 @494

Buenas, estoy intentando hacer un programa muy sencillo que lea líneas en un fichero buscando emails, y en caso de encontrar uno lea la siguiente línea para ver si contiene un 1 (enviado) o un 0 (no enviado), pero no consigo hacer un simple salto de línea; este es el programa que tengo hasta el momento:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

$Lista='C:\Documents and Settings\Usuario Autorizado\Escritorio\invitation.txt';
$Lista2='C:\Documents and Settings\Usuario Autorizado\Escritorio\invitationnueva.txt';

print "Empezando programa\n";
open(FILE, $Lista) || die "No se puede abrir el archivo\n";

while(<FILE>) {
        if($_ =~ '@') {
                if(($_ + 1) =~ '0') {
                        alasaca($_);   
                }              
        }
}
close (FILE);

sub alasaca
{
open(FILE2, ">>$Lista2") || die "No se puede abrir el archivo\n";
print FILE2 "$_[0]\n";
close (FILE2);
}
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Y el problema es que al hacer $_ + 1 estoy haciendo que $_ sea igual a 1 en vez de hacer que salte a la siguiente línea.

Muchas gracias por la ayuda.
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Publicidad

Notapor explorer » 2007-11-10 11:07 @505

Es que... NO estás leyendo la siguiente línea... estás, sencillamente, incrementando el valor numérico que tiene $_.

Pista: justo después de comprobar que acabas de leer un correo electrónico, añade la línea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$_ = <FILE>;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Así, $_ tendrá ahora el valor de la siguiente línea... porque la acabamos de leer.
Última edición por explorer el 2007-11-10 16:04 @711, editado 1 vez en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Norther » 2007-11-10 11:32 @522

La verdad creo que no estoy muy seguro de a qué te refieres; probé ahora haciendo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

$Lista='C:\Documents and Settings\Usuario Autorizado\Escritorio\invitation.txt';
$Lista2='C:\Documents and Settings\Usuario Autorizado\Escritorio\invitationnueva.txt';

print "Empezando programa\n";
open(FILE, $Lista) || die "No se puede abrir el archivo\n";

while(<FILE>) {
        if($_ =~ '@') {
                <FILE>;
                printf $_;
                if($_ =~ '1') {
                        alasaca($_);   
                }              
        }
}


sub alasaca
{
open(FILE2, ">>$Lista2") || die "No se puede abrir el archivo\n";
print FILE2 "$_[0]\n";
close (FILE2);
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y el $_ no me avanzó ninguna línea.
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor creating021 » 2007-11-10 15:10 @674

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
 if ( $_ =~ m/^\w+@[a-zA-Z0-9]\.\w+/ ) {
    print $_, "\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

O algo así, pero no creo que algo como
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
 if($_ =~ '@') { ... }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sirva para lo que quieres... perldoc perlregex:
http://perldoc.perl.org/perlrequick.html
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor explorer » 2007-11-10 16:07 @713

Norther tenía razón. Cometí un fallo. Ya está arreglado en mi anterior comentario. Había que hacer bien la lectura de la línea.

Y en cuanto a creating021, sí que se puede hacer una comparación con
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if($_ =~ '@') { ... }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

aunque yo preferiría hacerlo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if( /@/ ) { ... }
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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Norther » 2007-11-11 01:10 @090

Muchas gracias por las respuestas, funciono perfectamente, ahora solo tengo un problema, os dejo el código actual y os explico:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

$Lista='C:\Documents and Settings\Usuario Autorizado\Escritorio\invitation.txt';
$Lista2='C:\Documents and Settings\Usuario Autorizado\Escritorio\invitationnueva.txt';

print "Empezando programa\n";
open(FILE, $Lista) || die "No se puede abrir el archivo\n";
while(<FILE>) {
        if($_ =~ '@') {
                $we = <FILE>;
                $wa = <FILE>;
                if($we !=~ "1") {
                        if($wo !=~ "1") {
                                alasaca($_);   
                        }
                }              
        }
}


sub alasaca
{
open(FILE2, ">>$Lista2") || die "No se puede abrir el archivo\n";
print FILE2 "$_[0]\n";
close (FILE2);
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pues bien lo que quiero ahora (antes estaba equivocado) es mirar si aparece un 1 en las dos siguientes lineas a la encontrada con @, y de no ser asi que me la envíe a la función alasaca().

Con el código que puse arriba funciona menos por un detalle, al hacer $variable = <FILE>; lee la siguiente línea perfectamente, pero cuando vuelve al bucle while ya considera esa linea leída, y se la salta, y en el archivo que tengo a veces esta en formato

email
enviado=0
sent=0
email
enviado=1
email
etc


Por lo que al considerar esa línea y saltarsela en el bucle puede estar saltandose una línea vital con @. Dicha esta parrafada, tengo alguna forma de hacer que lea las dos líneas siguientes como hasta ahora, pero que en el bucle continue desde la ultima leida en el bucle en si (el while)?

Muchas gracias de nuevo
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor explorer » 2007-11-11 07:51 @368

Creo que lo más fácil es que te leas todo el fichero, línea a linea, en un array. Así, jugando con los índices, podrás ir hacia adelante y hacia atrás.

O usar un tie. O un autómata de estados. O...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Norther » 2007-11-11 13:23 @599

Voy a ver si como algo y pruebo con un array :D Luego comento cómo me fue.
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor Norther » 2007-11-11 14:22 @640

Llevo un rato ya probando (me confundo todo el tiempo por que intento hacerlo como lo haria en C) y al final así es como me quedo el código que sigue sin funcionar, os pongo el código y los errores que me dio a ver que se os ocurre por que la verdad ya no se que mas intentar para solucionar dichos errores.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

my @datos;

my $Lista='C:\Documents and Settings\Usuario Autorizado\Escritorio\invitation.txt';
my $Lista2='C:\Documents and Settings\Usuario Autorizado\Escritorio\invitationnueva.txt';

open(FILE, $Lista) || die "No se puede abrir el archivo\n";
@datos = <FILE>;

for($i=0; $i<=@datos; $i++) {
        if(@datos($i) =~ '@') {
                if(@datos ($i+1) =~ 'claimed') && if(@datos($i+2) =~ 'claimed) {
                        alasaca(@datos($i));
                }
        }
}

print "terminado\n";


sub alasaca
{
open(FILE2, ">>$Lista2") || die "No se puede abrir el archivo\n";
print FILE2 "$_[0]\n";
close (FILE2);
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Errores:
Código: Seleccionar todo
syntax error at je.pl line 12, near "@datos("
Can't find string terminator """" anywhere before EOF at je.pl line 13.


Muchas gracias
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor explorer » 2007-11-11 14:35 @649

Falta una comilla en 'claimed'.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Básico

¿Quién está conectado?

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