• Publicidad

Problemas con expresiones regulares

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

Problemas con expresiones regulares

Notapor piero66 » 2009-03-09 14:57 @664

Buenas a todos en el foro.

Necesito hacer una expresión regular pero la verdad no me queda; en ella trato de buscar un archivo que contenga una cierta cadena pero la verdad no le hallo, siempre han sido mi coco las expresiones regulares entre otras... :oops:

mi expresión consta de los siguiente parámetros...

~ /$variable X . Y /

$variable = es el único dato que quiero que sea exacto en la búsqueda y varía de acuerdo a una consulta
X = 5 datos numéricos que no me interesas cuales sean
. = un carácter fijo
Y = extensión de un archivo que tampoco me interesa

Yo tengo algo como esto:

/^$variable(.*?)\$/

pero nada...

Espero alguien me pueda alivianar

Gracias.
piero66
Perlero nuevo
Perlero nuevo
 
Mensajes: 95
Registrado: 2008-05-22 12:00 @541

Publicidad

Notapor explorer » 2009-03-09 15:04 @669

Será entonces /^$variable/

o, con algo más de control:

/^$variable\d{5}\..{3}$/

(suponemos que la extensión tiene 3 caracteres).
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 piero66 » 2009-03-09 15:11 @674

Lo acabo de cambiar y tampoco arroja nada:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if($ftp->isfile(/^$fil/)
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Si te acuerdas de mi caso... que tengo que buscar archivos en servidor por medio de la librería Net::FTP::File a partir de una consulta a una base de datos...

y nada, no encuentra nada.

también ya le calé con esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
 if($ftp->isfile(/^$fil\d{5}\..{2}$/))
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
piero66
Perlero nuevo
Perlero nuevo
 
Mensajes: 95
Registrado: 2008-05-22 12:00 @541

Notapor explorer » 2009-03-09 15:43 @696

Según la documentación del módulo Net::FTP::File, el método isfile() necesita como argumento el nombre del fichero. No dice nada de admitir expresiones regulares.

Perl es muy liberal en cuanto que nos permite hacer muchas cosas... pero hay un límite... ¿cómo pretendes que un método que solo admite valores escalares admita también una expresión regular? Eso no te funcionará con ningún lenguaje informático. Debes ajustarte a lo que dice la documentación de cada módulo.

En cuanto a tu problema. $fil almacena el nombre del fichero que acabas de leer con alguno de los métodos del módulo, y quieres ver si coincide con tu patrón de búsqueda, que es /^$patron\d{5}\..{2}$/, que quiere decir: comienza (^) por el $patron que estamos buscando, seguido por 5 dígitos (\d{5}), seguido de un punto (\.) y seguido por una extensión (dos caracteres, .{2}), y nada más ($).

Entonces, para hacer la comprobación:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ( $fil =~ /^$patron\d{5}\..{2}$/ ) {
    # $fil coincide con el patrón
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora bien... como no nos interesa para nada los 5 dígitos ni la extensión, entonces podemos dejarlo en
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ( $fil =~ /^$patron/ ) {
    # $fil coincide con el patrón
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
con lo que entonces nos conformamos que nuestro fichero $fil coincida al principio con el $patron.

De todas formas, yo lo aseguraría más:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ( $fil =~ /^$patron\d{5}\./ ) {
    # $fil coincide con el patrón
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
porque de esta manera nos aseguramos de que además de coincidir con el $patron tenemos dígitos y un punto. El resto nos da igual, pero así hacemos la comprobación un poco más fuerte, para el caso de que podamos confundirnos con otros nombres de ficheros parecidos.
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 piero66 » 2009-03-09 16:39 @735

Sí, tienes razón... le busqué de otra manera y así ya quedó, gracias, y lo dejo por si a alguien le es útil.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$fil = "L1.A1001001A08L16A94821C";
$ftp->cwd("/data/lbosdata/00003/46");

@archivos = $ftp->ls();
my $count = scalar(@archivos);
$i=0;
$termina=0;
do{

if ( $archivos[$i] =~ /^$fil\d{5}\./ ) {
         print "Archivo:$fil ";
         $ubicacion = $ftp->pwd();
         print "Ubicacion: $ubicacion","\n";;
         $termina=1;
     }else{
         $i++;
     }

 } until $count==$i or $termina ==1;

 if ($termina==0){
         print "El Archivo:   $fil No Esta","\n";
        }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
piero66
Perlero nuevo
Perlero nuevo
 
Mensajes: 95
Registrado: 2008-05-22 12:00 @541

Notapor explorer » 2009-03-09 17:09 @756

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $patron = 'L1.A1001001A08L16A94821C';

$ftp->cwd('/data/lbosdata/00003/46');

my $fichero_encontrado;

for my  $fichero ($ftp->ls) {
    if ($fichero =~ /^$patron\d{5}\./ ) {
        $fichero_encontrado = $fichero;
        last;
    }
}

if ($fichero_encontrado) {
    print "Archivo: $fichero_encontrado Ubicación: ", $ftp->pwd(), "\n";
}
else {
    print "El Archivo:   $patron No Está\n";
}
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

Notapor piero66 » 2009-03-10 12:47 @574

Muy bien, explorer... ya quedó esa parte, una vez que localizo eso lo muestro... pero también me interesa copiarlo en otra ubicación y lo hago pero no me copia bien el archivo pues a la hora de mostrarlo mediante el Internet Explorer me manda una imagen distorsionada y difusa...

Mi código es...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($fichero =~ /^$fil\d{5}\./) {
    $fichero_found = $fichero;
    $new_name = $fichero."."."TIFF";
    $ftp->copy($fichero, $new_name,'/home/anava/public_html');
    print "Archivo: $fichero_found, Ubicacion:",$ftp->pwd(),"\n";
    last;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Inclusive mi archivo original es de 108k y al copiarlo lo pone en 53k.
piero66
Perlero nuevo
Perlero nuevo
 
Mensajes: 95
Registrado: 2008-05-22 12:00 @541

Notapor explorer » 2009-03-10 13:57 @623

El módulo Net::FTP::File usa el módulo Net::FTP, en el que, por defecto, todas las transferencias las hace en modo ASCII.

Quizás tengas que activar el modo de transferencia binario, después de hacer el login():

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$ftp->binary();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Esto es lo que creo que pasa: que casi siempre nos olvidamos de poner el modo de transferencia al correcto cuando trabajamos con FTP.
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 piero66 » 2009-03-10 15:03 @668

Ok. Funcionó sin problemas. Mil gracias.
piero66
Perlero nuevo
Perlero nuevo
 
Mensajes: 95
Registrado: 2008-05-22 12:00 @541


Volver a Básico

¿Quién está conectado?

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

cron