• 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.

Notapor Norther » 2007-11-11 14:42 @654

Ouch..sigue dandome error con el mismo código mas una comilla, aqui os lo dejo:

Errores:
Código: Seleccionar todo
syntax error at we.pl line 12, near "@datos("
syntax error at we.pl line 16 near "}"
Execution of we.pl aborted due to compilation errors.
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Publicidad

Notapor explorer » 2007-11-11 15:12 @675

@datos($i) no significa nada... querrás decir... $datos[$i]

Los elementos de los arrays se acceden con el índice entre corchetes. Y como, normalmente, solo accedemos a un elemento cada vez, en vez de '@' ponemos un '$' al principio: para indicar que solo queremos un elemento.
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

Notapor Norther » 2007-11-11 15:29 @687

Bueno, cambie el código y lo hice con ifs anidados y ya no da ningun error, pero tampoco funciona =O El código es este:

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 "Archivo abierto, guardando linea\n";
print FILE2 "$_[0]\n";
close (FILE2);
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Y este es un fragmento de la lista que quiero comprobar:

Código: Seleccionar todo
[@hotmail.com]
sentemail=1
[@hotmail.com]
sentemail=1
claimed=1
claimedby='invitation
[@hotmail.com]
sentemail=1
[@hotmail.com]
sentemail=1
[@gmail.com]
sentemail=1
[@hotmail.com]
sentemail=1
[@hotmail.com]
sentemail=1
claimed=1
claimedby='invitation
[@hotmail.com]
sentemail=1


Entonces quiero comprobar cuales son los mails que no han sido "claimed" y guardarlos en otro archivo aparte, como dije el código no da errores, pero tampoco funciona en absoluto :S
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor explorer » 2007-11-11 15:33 @690

!=~ tampoco significa nada. Querrás decir !~.

¿Qué quieres decir con que NO han de ser 'claimed'? ¿Que no debe aparecer o que debe tener un valor igual a 0?

¿Cuál debería ser la salida del ejemplo anterior?
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

Notapor Norther » 2007-11-11 15:49 @701

Uf, despues de todo al final lo que fallaba era el operador, es lo que pasa cuando trato de inventarme operadores como !=~ :?

Pues nada al final parece que el programa funciona a la perfeccion, solo me queda una duda ya casi por curiosidad, os dejo el código final por si a alguien puede interesarle algún día.

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


Y mi duda es, como puedo convertir esos ifs anidados en un solo condicional con &&? Ya intente hacerlo de varias formas (supongo que como lo haria en C) y todas me dan error...

Muchas gracias por todo!

P.D Con que no han de ser claimed me referia a que no deben contener claimed las dos líneas siguientes a una línea con @
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor explorer » 2007-11-11 16:44 @739

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if($datos[$i] =~ '@' and $datos[$i+1] !~ 'claimed' and $datos[$i+2] !~ 'claimed') {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Yo he hecho mi propia versión del programa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

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"  or die "No se puede abrir el archivo\n";
open FILE2, ">$Lista2" or die "No se puede escribir al archivo\n";

my $correo = '';                         # Al principio no tenemos ningún correo
while ( <FILE> ) {                       # Para todas las líneas
    if ( /@/ ) {                         # Si hemos encontrado un correo...
        print FILE2 $correo if $correo;  # Pintamos el anterior, si lo teníamos
        $correo = $_;                    # Y guardamos el nuevo correo encontrado
    }
    elsif ( /claimed/ ) {                # Pero si la línea es un 'claimed'...
        $correo = '';                    #    el correo anterior no nos vale
    }
}
print FILE2 $correo if $correo;          # Pintamos el último correo que quede sin grabar

close FILE;
close FILE2;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Con esta entrada:
Código: Seleccionar todo
[[email protected]]
sentemail=1
[[email protected]]
sentemail=1
claimed=1
claimedby='invitation
[[email protected]]
sentemail=1
[[email protected]]
sentemail=1
[[email protected]]
sentemail=1
[[email protected]]
sentemail=1
[[email protected]]
sentemail=1
claimed=1
claimedby='invitation
[[email protected]]
sentemail=1
tenemos la salida:
Código: Seleccionar todo
[[email protected]]
[[email protected]]
[[email protected]]
[[email protected]]
[[email protected]]
[[email protected]]

La idea es la siguiente: vamos leyendo línea a línea. Si encontramos un correo electrónico, nos lo guardamos. Seguimos leyendo. Si encontramos otro correo electrónico, quiere decir que el anterior sí teníamos que guardarlo porque no hemos encontrado un 'claimed' en las líneas anteriores. Por contra, si encontramos 'claimed', el correo guardado no nos vale, por lo que ponemos su variable a un valor vacío, y así no saldrá en el próximo print.

A veces, es muy útil haber jugado al ajedrez o haber programado en lenguaje ensamblador. :P
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

Notapor Norther » 2007-11-11 17:03 @752

Desde luego tu idea es muy buena, si mal no lo entendí, en esencia vas guardando todos los mails y desechando los que contienen claimed sobre la marcha ¿no?

A mi el Assembly me queda un poco grande, hasta que lo demos en clase me parece que voy a dejarlo en la lista de "to do" :P

Por cierto,
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if($datos[$i] =~ '@' and $datos[$i+1] !~ 'claimed' and $datos[$i+2] !~ 'claimed') {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿no podría funcionar de algún modo en formato
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if($datos[$i] =~ '@') && ($datos[$i+1] !~ 'claimed') && ($datos[$i+2] !~ 'claimed') { ... }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
?
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor explorer » 2007-11-11 17:22 @765

Solo voy guardando un correo cada vez. Y sí, lo hago sobre la marcha.

Sobre tu construcción, no funcionaría: están mal balanceados los paréntesis del 'if'.

Si usas '&&' en lugar de 'and' sí que necesitas poner paréntesis que engloben los test de las expresiones regulares. Esto es debido a que '&&' tiene mayor precedencia que 'and'.

Sería:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ( ($datos[$i] =~ '@') && ($datos[$i+1] !~ 'claimed') && ($datos[$i+2] !~ 'claimed') ) { ... }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Muchos paréntesis...
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

Notapor Norther » 2007-11-11 17:25 @767

Cierto, casi me parece más práctico utilizar el and.

Muchas gracias por la ayuda ;) Solo espero no arrepentirme de esto mañana porque tengo examen de C a primera hora y ahora tengo Perl metido en la cabeza jaja pero bueno este programa tenía cierta urgencia... voy a ponerme ahora a repasar algo de C por si las moscas, buenas noches :P
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

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

Bueno me acaba de surgir un problema con mis adoradas e incomprendidas expresiones regulares; resulta que ahora la lista sale en este formato:

Código: Seleccionar todo
[email]
claimed=1
[email]
csentby
[email]


Así que nada, conseguí sacar con el código anteriormente posteado los mails y meterlos en otro archivo, pero los mete en este formato:

Código: Seleccionar todo
[email]uncomentarioquemetiyo[email]


Y a mi me gustaría quitar los [ ], así que intenté usar expresiones regulares para que cogiera solo los caracteres con \w.

El problema es que no sé cómo hacerlo :S ¿qué estoy haciendo mal?

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\invitationnueva2.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') {
                                $we = $datos[$i];
                                chomp($datos[$i]);
                                alasaca($datos[$i]);
                        }
                }
        }
}

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


¡Muchas gracias!

P.D El formato que busco es, por ejemplo
Código: Seleccionar todo
<[email protected]>[email protected]<[email protected]>


en lugar de
Código: Seleccionar todo
[[email protected]][email protected][[email protected]]
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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

cron