Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Ciao a tutti!
Sto facendo uno script in perl che all'interno di un file mi trova determinate stringhe.
Ora vorrei fare una evoluzione di questo script,che praticamente non scansiona solo un file,ma partendo da una directory scansiona tutti i file in essa contenuti e tutte le sottodirectory con i relativi file.Insomma una scansione ricorsiva.
Avete suggerimenti?Sto veramente impazzendo per sto fatto....
#! /usr/bin/perl -w
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
if 0; #$running_under_some_shell
use strict;
use File::Find ();
# Set the variable $File::Find::dont_use_nlink if you're using AFS,
# since AFS cheats.
# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *prune/;
*name = *File::Find::name;
*dir = *File::Find::dir;
*prune = *File::Find::prune;
sub wanted;
# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, '/home');
exit;
sub wanted {
my ($dev,$ino,$mode,$nlink,$uid,$gid);
(($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
print("$name\n");
}
Come dice il buon larry wall perché fare cose già fatte?
mordecai ha scritto:Ciao a tutti!
Sto facendo uno script in perl che all'interno di un file mi trova determinate stringhe.
Ora vorrei fare una evoluzione di questo script,che praticamente non scansiona solo un file,ma partendo da una directory scansiona tutti i file in essa contenuti e tutte le sottodirectory con i relativi file.Insomma una scansione ricorsiva.
Si in effetti potevo usare quel modulo.Ma ora ho un altro problema.
L'obiettivo ora è di trovare all'interno di tutti quei file una determinata stringa,e magari solo dei file .txt.
Non è un problema perchè ho già fatto lo script relativo a questo:
#! /usr/bin/perl -w
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
if 0; #$running_under_some_shell
use strict;
use File::Find ();
# Set the variable $File::Find::dont_use_nlink if you're using AFS,
# since AFS cheats.
# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *prune/;
*name = *File::Find::name;
*dir = *File::Find::dir;
*prune = *File::Find::prune;
sub wanted;
sub doexec ($@);
use Cwd ();
my $cwd = Cwd::cwd();
# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, '/tmp');
exit;
sub wanted {
/^.*\.txt\z/s &&
doexec(0, 'grep','pippo','{}');
}
sub doexec ($@) {
my $ok = shift;
my @command = @_; # copy so we don't try to s/// aliases to constants
for my $word (@command)
{ $word =~ s#{}#$name#g }
if ($ok) {
my $old = select(STDOUT);
$| = 1;
print "@command";
select($old);
return 0 unless <STDIN> =~ /^y/;
}
chdir $cwd; #sigh
system @command;
chdir $File::Find::dir;
return !$?;
}
use strict;
use File::Find ();
use vars qw/*name *dir *prune/;
*name = *File::Find::name;
*dir = *File::Find::dir;
*prune = *File::Find::prune;
sub wanted;
#Scansione ricorsiva attraverso l'albero di directory
File::Find::find({wanted => \&wanted}, '/home/');
sub wanted2;
File::Find::find({wanted2 => \&wanted2}, '/home/');
exit;
Come mai questo codice mi da errore?Non ho fatto forse lo stesso procedimento con la seconda sub?
NB:le sub non le ho incluse nel codice
Guardando il file find.pm vedo che ci sono dei riferimenti precisi a $wanted, non vorrei che sia un nome imposto.
Ma come ti ho detto sono troppo arrugginito su perl e non solo per aiutarti