Newsgroup: it.comp.lang.perl
Titolo: AIUTO! SEMPRE I FILE!

Questa volta il problema e' un po' piu' serio:
Devo cercare una keyword in un file e poi visualizzare dall'inizio del
paragrafo (lo riconosco perche' c'e' una linea vuota)  fino alla linea
della keyword.
es del file:
INIZIO FILE
ciao
buongiorno 
buonasera
pippo
pluto
pino
se la keyword e' buonasera io voglio visualizzare:
ciao
buongiorno
buonasera
cioe' tutto quello che c'e' dalla keyword in su finche' trovo la linea
vuota.
Pensavo di procedere cosi':
scorro il file e memorizzo la linea in cui trovo la keyword, poi dalla
keyword torno indietro finche non trovo la linea vuota e poi faccio un
ciclo dalla linea vuota alla linea di keyword e stampo il contenuto, solo
che non ci sono ancora riuscito!

 cerchero' un'altra donna dentro ai sogni di Tarzan...

 della keyword.
Soluzione molto semplice: leggi i paragrafi e poi visualizza quello in cui
trovi la keyword!
{
 local $/ = "";
 while(<ARGV>)
    {
      print if /keyword/;
    }
}
Semplice, eh? :)
Maurizio
-- 
Maurizio M. Munafo' / 
mmmu...@netscape.net
"Consider Phlebas, who was once handsome and tall as you" (T.S.Eliot)

 
Purtroppo non mi funziona, nel senso che non 'matcha' nulla!
Grazie lo stesso!



L'ho provato, e funziona perfettamente.
Attrento a questi punti:
- aspetta in input la parola da cercare
- e' case sensitive (si puo' evitare ma e' cosi')
- richiede che l'ultima riga termini con a capo


 Semplice, eh? :)
Analizzando le altre risposte, mi rendo conto che questo stampa tutto il
paragrafo contenente la keyword, anche le eventuali linee successive.
Comunque il succo e' che il file si puo' tranquillamente leggere a paragrafi
settand $/ con la stringa vuota, e poi una volta che si ha il paragrafo
intero ci si fa quel che si vuole, senza complicarsi la vita a controllare
tutte le righe e concatenarle.


 paragrafo contenente la keyword, anche le eventuali linee successive.
anzitutto: mi piace proprio tanto questa soluzione (magari Danut non sa
che farsene, ma fa lo stesso :-)
comunque: il problema e' piccolo (credo)
usando lo split ("\n"....
si puo metter il tutto in un array, e l'avventura continua ! 
p.es
.
togliendo ciň che segue la keyword.
@array=split("\n",$paragrafo);
# tolgo le righe oltre la keyword, il risultato finisce in @a2
foreach (@array) {
   push(@a2,$_); last if /keyword/;
   }
# a questo punto l'array @a2 contiene la prima parte del paragrafo.
magari non č elegante, perň da funziona
Continuando gli esempi:
{
local $/="";
while (<F>) {
    $paragrafo=$_ if /keyword/;
   }
}
close(F);
@array=split( "\n", $paragrafo);
foreach (@array) {
   push(@a2,$_); last if /keyword/;
   }
# quanto segue soltanto per verificare che funziona
$i=0;
foreach (@a2) {
    print $i++, " $_\n";
    }

 togliendo ciň che segue la keyword.
Infatti. Io uso questa soluzione per leggere da file in un formato
particolare per poi elaborarli e infilarli in un database.
In realta' c'e' un particolare veramente BASTARDO nei file a paragrafo... se
la riga di separazione non e' completamente vuota, ovvero contiene qualche
spazio (cosa possibile per file creati a mano), canni impietosamente la
lettura, perche' ti prende quelli che tu pensavi come diversi paragrafi
come un blocco unico! E se stai leggendo dati da infilare in un database, il
risultato e' che ti mescola dati di diversi record! :(
Quindi mi ritrovo costretto a verificare che il file non contenga righe di
soli spazi, prima di provare a passarlo allo script che lo legge a paragrafi.


 wrote:
[ snip ]
MMM>Analizzando le altre risposte, mi rendo conto che questo stampa tutto il
MMM>paragrafo contenente la keyword, anche le eventuali linee successive.
Potrebbe funzionare cosi' ?
{
   local $/ = "";
   while(<ARGV>) {
     print "$1\n" if (/^(.*$keyword)/s);
   }
}
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)