• Publicidad

Problemas con File::Grep

¿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 File::Grep

Notapor tlmejia » 2008-08-28 09:08 @422

¡¡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:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!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;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


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!!
tlmejia
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2008-08-27 13:33 @606

Publicidad

Notapor explorer » 2008-08-28 11:40 @527

Prueba con esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!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;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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)
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 explorer » 2008-08-28 17:58 @790

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:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/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};
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El programa final queda:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!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};
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

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.
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 tlmejia » 2008-08-29 13:12 @592

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? :?:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
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};
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¡¡Gracias de antemano por la ayuda!!
tlmejia
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2008-08-27 13:33 @606

Notapor explorer » 2008-08-29 13:49 @617

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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
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
    }
}
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 tlmejia » 2008-08-29 15:01 @667

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.
tlmejia
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2008-08-27 13:33 @606

Notapor explorer » 2008-08-29 15:16 @678

Pues con una expresión regular...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$busfinal =~ /([^\\]+\.pdf)/;
$busfinal = $1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Capturamos un conjunto de caracteres que no sean '\' ([^\\]+) y que están delante de '.pdf'. La captura, queda en $1.
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 tlmejia » 2008-08-29 16:30 @729

Estoy poniendo esto así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
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";        
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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
:?
tlmejia
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2008-08-27 13:33 @606

Notapor explorer » 2008-08-29 16:47 @741

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
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);
        }
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2008-09-17 14:04 @627, editado 6 veces en total
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 tlmejia » 2008-08-29 17:06 @754

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$busfinal =~ /([^\\]+\.pdf)/;
        $busfinal = $1;
        $busfinal =~ s/\.txt/.pdf/;        
        print "<a href=$busfinal>$busfinal</a><br/>\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print qq(<a href="$busfinal">$busfinal</a><br/>\n);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


me sale lo mismo, no me manda ningún error, pero no me manda los resultados que me mandaba antes :?
tlmejia
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2008-08-27 13:33 @606

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron