Perl en Español

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

Problemas con File::Grep
Ir a página 1, 2  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Jue Ago 28, 2008 8:08 am
tlmejia
Perlero Nuevo
Perlero Nuevo
Registrado: 27 Ago 2008
Mensajes: 18
Problemas con File::Grep Responder citando

¡¡Hola!! No sé si alguien pudiera echarme la mano con este módulo del file grep. Lo que hice fue poner de manera local unos archivos txt, dentro de una carpeta, entonces escribí el siguiente código:

Perl:
#!C:\perl\bin\perl.exe -X

use cgi;
require "divs.pl";
use CGI::Carp "fatalsToBrowser";
use File::Grep qw( fgrep fmap fdo );

print "Content-type: text/html","\n\n";
my @matches = fgrep { /GOBIERNO/} glob "C:\AppServ\www\pdf\*txt";
  print SUMMARY $_ foreach @matches;


donde le estoy diciendo que quiero buscar la palabra GOBIERNO y le indico la ruta, pero, al momento de ejecutarlo no me muestra nada, no me muestra errores pero no me muestra nada, aparece en blanco la pantalla. Confused

No sé si alguien pudiera echarme la mano, ¡¡soy nueva en esto!! ¡¡Gracias!!
Mensaje Jue Ago 28, 2008 10:40 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
Responder citando

Prueba con esto:

Perl:
#!C:\perl\bin\perl.exe

use CGI;
use CGI::Carp qw(fatalsToBrowser);
use File::Grep qw( fgrep fmap fdo );

require "divs.pl";

print "Content-type: text/plain","\n\n";
my @matches = fgrep { /GOBIERNO/ } glob 'C:\AppServ\www\pdf\*.txt';
print SUMMARY $_ foreach @matches;


He hecho 7 cambios:
* Quitar el -X (desactivaba los avisos)
* Módulo CGI en mayúsculas (casi seguro que te refieres al estándar)
* Cambiado "fatalsToBrowser" a qw(fatalsToBrowser) (cambio opcional)
* El require puesto al final de la carga de módulos (cambio opcional)
* Cambiado "text/html" por "text/plain" (facilita la lectura: solo estás enviado texto)
* Cambiadas las comillas dobles por simples (los '\' dentro de las comillas dobles... tienen otra misión)
* Cambiado "*txt" por "*.txt" (los comodines funcionan de forma diferente entre Unix y DOS)
Mensaje Jue Ago 28, 2008 4:58 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
Responder citando

Parece ser que la documentación del módulo File::Grep no está lo que digamos bien.

Para recuperar los nombres de los ficheros he tenido que hacer algo como esto:

Perl:
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

use File::Grep 'fgrep';

my @ficheros = fgrep { /^use XML/ } glob('*.pl');

#use Data::Dumper;
#print Dumper \@ficheros;

for (@ficheros) {
    print $_->{filename}, "\n" if $_->{count};
}


El programa final queda:

Perl:
#!C:\perl\bin\perl.exe
use CGI;
use CGI::Carp  qw(fatalsToBrowser);
use File::Grep qw(fgrep);

require "divs.pl";

print "Content-type: text/plain\n\n";
my @matches = fgrep { /GOBIERNO/ } glob('C:\AppServ\www\pdf\*.txt');
for my $f (@matches) {
    print $f->{filename}, "<br />\n"
       if $f->{count};
}

Es decir, hay que ver si por cada fichero se han encontrado coincidencias ($f->{count} > 0). Y en ese caso pintamos el nombre del fichero.
Mensaje Vie Ago 29, 2008 12:12 pm
tlmejia
Perlero Nuevo
Perlero Nuevo
Registrado: 27 Ago 2008
Mensajes: 18
Responder citando

Muchas gracias, con eso ya funcionó. Ahora lo que estoy haciendo es querer aplicar el comando sed para que sustituya el .txt y pasarlo al .pdf, lo estoy mandando así, pero me está mandando un problema de sintaxis, ¿algunas sugerencia? Question

Perl:
my @matches = fgrep { /$query/ } glob('C:\AppServ\www\pdf\*.txt');
for my $f (@matches) {
    my $busfinal = perl -pe "s/.txt/.pdf/g" $f;
    print $busfinal->{filename}, "<br />\n"
       if $busfinal->{count};
}


¡¡Gracias de antemano por la ayuda!!
Mensaje Vie Ago 29, 2008 12:49 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
Responder citando

No necesitas ejecutar perl dentro de perl, en el 99,99% de las ocasiones. Ni siquiera el comando sed (de hecho, no lo estás haciendo aunque lo hayas dicho).

Aparte, te has liado tu misma con lo que realmente quieres hacer...

Perl:
my @matches = fgrep { /$query/ } glob('C:\AppServ\www\pdf\*.txt');
for my $f (@matches) {                    # Para todas las búsquedas
    if ($f->{count}) {                    #   Si hubo coincidencias
        my $busfinal = $f->{filename};    #     Obtenemos el nombre del fichero que coincidió
        $busfinal =~ s/\.txt/.pdf/;       #     Cambiamos su extensión
        print "$busfinal<br />\n";        #     Y pintamos el resultado
    }
}
Mensaje Vie Ago 29, 2008 2:01 pm
tlmejia
Perlero Nuevo
Perlero Nuevo
Registrado: 27 Ago 2008
Mensajes: 18
Responder citando

Gracias nuevamente, sí ya quedó con eso, es que en efecto, el problema era ese, como le comentaba esto es nuevo para mi, entonces apenas me familiarizo con la sintaxis, pero bueno con esto de prueba y error es como uno aprende. Por último, tengo un error y no sé con qué comando puedo borrar como cierta información que viene dentro de una cadena y sólo quedarme con el nombre, es decir:

C:\AppServ\www\pdf\SA25.0704Busan40.pdf

Lo que tiene que aparecer es a partir de SA.....pdf, pero el valor de mi variable trae toda esa ruta, desde C:\AppServ\...., ¿cómo quitarle eso? Question de manera que sólo muestre SA25.0704Busan40.pdf.
Mensaje Vie Ago 29, 2008 2:16 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
Responder citando

Pues con una expresión regular...

Perl:
$busfinal =~ /([^\\]+\.pdf)/;
$busfinal = $1;


Capturamos un conjunto de caracteres que no sean '\' ([^\\]+) y que están delante de '.pdf'. La captura, queda en $1.
Mensaje Vie Ago 29, 2008 3:30 pm
tlmejia
Perlero Nuevo
Perlero Nuevo
Registrado: 27 Ago 2008
Mensajes: 18
Responder citando

Estoy poniendo esto así:

Perl:
my @matches = fgrep { /$query/ } glob('C:\AppServ\www\pdf\*.txt');
    for my $f (@matches) {                     
      if ($f->{count}) {                   
        my $busfinal = $f->{filename};   
        $busfinal =~ /([^\\]+\.pdf)/;
        $busfinal =~ s/\.txt/.pdf/;       
        print "<a href='$busfinal'>$busfinal</a><br/>\n";       
    }
}


Pero no me hace nada me sigue mostrando el mismo resultado:

Otra búsqueda

Para la búsqueda Potasio N-metilditiocarbamato, estos resultados se encontraron:

C:\AppServ\www\pdf\SA25.0704Busan40.pdf
Confused
Mensaje Vie Ago 29, 2008 3:47 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
Responder citando

Perl:
my @matches = fgrep { /$query/ } glob('C:\AppServ\www\pdf\*.txt');
    for my $f (@matches) {                     
      if ($f->{count}) {                   
        my  $busfinal$f->{filename};   
        if ($busfinal =~ /([^\\]+)\.txt/) {
            $busfinal"$1.pdf";
            print qq(<a href="/cgi-bin/pdf/$busfinal">$busfinal</a><br/>\n);
        }
    }
}


Ultima edición por explorer el Mie Sep 17, 2008 1:04 pm, editado 6 veces
Mensaje Vie Ago 29, 2008 4:06 pm
tlmejia
Perlero Nuevo
Perlero Nuevo
Registrado: 27 Ago 2008
Mensajes: 18
Responder citando

Perl:
$busfinal =~ /([^\\]+\.pdf)/;
        $busfinal = $1;
        $busfinal =~ s/\.txt/.pdf/;       
        print "<a href=$busfinal>$busfinal</a><br/>\n";


Si lo pongo así, ahora ya no me arroja, ningún resultado, si lo pongo lo mismo pero al final:

Perl:
print qq(<a href="$busfinal">$busfinal</a><br/>\n);


me sale lo mismo, no me manda ningún error, pero no me manda los resultados que me mandaba antes Confused
Mensaje Vie Ago 29, 2008 4:19 pm
tlmejia
Perlero Nuevo
Perlero Nuevo
Registrado: 27 Ago 2008
Mensajes: 18
Responder citando

si no le pongo la línea de:

Perl:
$busfinal = $1;

sí me lo muestra, pero no corrige nada; me sigue mandando el resultado:

C:\AppServ\www\pdf\SA25.0704Busan40.pdf

si le dejo esa línea, no me muestra ningún resultado Confused
Mensaje Vie Ago 29, 2008 4:22 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
Responder citando

Ya está corregido. El problema estaba en la expresión regular, que buscaba por '.pdf', cuando en realidad debería haber buscado por '.txt'.
Mensaje Vie Ago 29, 2008 4:31 pm
tlmejia
Perlero Nuevo
Perlero Nuevo
Registrado: 27 Ago 2008
Mensajes: 18
Responder citando

WOWW! es usted todo un sensei Very Happy , muchas gracias, para poder modificar la ruta del pdf, porque ya sale el puro nombre, lo cual es muy bueno pero en la ruta, no me muestra todavía el pdf, porque le hace falta, en la ruta meterse a una carpeta.

Ahorita si pongo el mouse sobre el link del resultado aparece este link:

http://localhost/cgi-bin/SA26.1204Busan1069.pdf

pero debería de ser:

http://localhost/cgi-bin/pdf/SA26.1204Busan1069.pdf

por eso no me abre el pdf todavía, puedo ponerle algo así como:

$busfinal = "/pdf/$1.pdf"; , para poder mostrar dicha carpeta Confused
Mensaje Vie Ago 29, 2008 4:41 pm
tlmejia
Perlero Nuevo
Perlero Nuevo
Registrado: 27 Ago 2008
Mensajes: 18
Responder citando

Otra pregunta, a que se refiere el $1, eso no entendí muy bien esa parte del código, es una variable que almacena sólo el nombre del archivo, al cual ya le quitamos los demás caracteres que no queríamos? y el ponerle $1 fue alateorio no?
Mensaje Vie Ago 29, 2008 4:42 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
Responder citando

No.

Si colocas "/pdf" delante, la primera barra le está indicando que quieres decir

http://localhost/pdf/SA26.1204Busan1069.pdf

pero estás contando que los pdf los tienes guardados dentro de la carpeta /cgi-bin/pdf.

Así que entonces deberás cambiar la línea a

Perl:
$busfinal = "/cgi-bin/pdf/$1.pdf";


pero entonces queda feo en la página web.

Casi mejor modificar el print. Quedaría así:

Perl:
            $busfinal"$1.pdf";
            print qq(<a href="/cgi-bin/pdf/$busfinal">$busfinal</a><br/>\n);
Fíjate: solo hemos añadido el camino dentro del print, para que en el enlace solo salga el nombre del fichero.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Ir a página 1, 2  Siguiente
Página 1 de 2



Powered by phpBB © 2001, 2005 phpBB Group