Jue Ago 28, 2008 8:08 am
|
 |
tlmejia
Perlero Nuevo

|
Registrado: 27 Ago 2008
Mensajes: 18
|
|
| Problemas con File::Grep |
|
|
¡¡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.
No sé si alguien pudiera echarme la mano, ¡¡soy nueva en esto!! ¡¡Gracias!! |
|
|
|

Jue Ago 28, 2008 10:40 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
|
|
|
|
|
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) |
|

Jue Ago 28, 2008 4:58 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
|
|
|
|
|
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. |
|

Vie Ago 29, 2008 12:12 pm
|
 |
tlmejia
Perlero Nuevo

|
Registrado: 27 Ago 2008
Mensajes: 18
|
|
|
|
|
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?
| 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!! |
|

Vie Ago 29, 2008 12:49 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
|
|
|
|
|
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
}
} |
|
|

Vie Ago 29, 2008 2:01 pm
|
 |
tlmejia
Perlero Nuevo

|
Registrado: 27 Ago 2008
Mensajes: 18
|
|
|
|
|
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? de manera que sólo muestre SA25.0704Busan40.pdf. |
|

Vie Ago 29, 2008 3:30 pm
|
 |
tlmejia
Perlero Nuevo

|
Registrado: 27 Ago 2008
Mensajes: 18
|
|
|
|
|
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
 |
|

Vie Ago 29, 2008 3:47 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
|
|
|
|
|
| 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 |
|
Vie Ago 29, 2008 4:06 pm
|
 |
tlmejia
Perlero Nuevo

|
Registrado: 27 Ago 2008
Mensajes: 18
|
|
|
|
|
| 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  |
|
Vie Ago 29, 2008 4:19 pm
|
 |
tlmejia
Perlero Nuevo

|
Registrado: 27 Ago 2008
Mensajes: 18
|
|
|
|
|
si no le pongo la línea de:
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  |
|
Vie Ago 29, 2008 4:22 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
|
|
|
|
|
| Ya está corregido. El problema estaba en la expresión regular, que buscaba por '.pdf', cuando en realidad debería haber buscado por '.txt'. |
|
Vie Ago 29, 2008 4:31 pm
|
 |
tlmejia
Perlero Nuevo

|
Registrado: 27 Ago 2008
Mensajes: 18
|
|
|
|
|
WOWW! es usted todo un sensei , 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  |
|
Vie Ago 29, 2008 4:41 pm
|
 |
tlmejia
Perlero Nuevo

|
Registrado: 27 Ago 2008
Mensajes: 18
|
|
|
|
|
| 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? |
|

Vie Ago 29, 2008 4:42 pm
|
 |
explorer
Moderador

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