Newsgroup: it.comp.lang.perl
Titolo: Help file

Salve, devo sostituire alcune righe in una serie di file.
Quello che so e:
I file sono html, devo sostituire, in tutti i file, dalla 2 alla 6 riga con 
altre righe che imposto io.
Come faccio ad acquisire una riga per volta partendo dalla 2 alla 6?
Grazie



Se le nuove linee sono sempre le stesse, puoi partire da:
---CUT HERE---
@new_lines = ('aaa','bbb','ccc','ddd','eee'); # N elements array
$my_path = '/path/to/html/dir';
opendir DIR, $my_path;
foreach my $file ( grep /\.html$/, map "$my_path/$_", readdir DIR ) {
	open(FILE, $file) || next;
	my @lines = <FILE>;
	close FILE;
	splice(@lines,1,$#new_lines+1,@new_lines);
	open(FILE, ">$file") || next;
	print FILE, @lines;
	close FILE;
}
---CUT HERE---
e lavorarci su per ottimizzarla
	- Enrico

 my @lines = <FILE>;
se il file è grandicello può incasinarti un po'...
Per la parte relativa al fare qualcosa sulle righe dalla 2 alla 6:
======== CODE =========
my $line;
while (<DATA>)
{
 ++$line;
 if ($line >= 2 and $line <= 6) { print my_sub($_) }
 else { print }
}
sub my_sub { uc shift }
__DATA__
1 aaaaa a aaaa a a a a a aa
2 bb b b bb b b b  bbbbb b bbbb
3 cccccccc cccccccc ccccccc
4 dddddd dddd  dddddddd ddd
5 eeeeee eeee eeee eeeeee
6 ffff ffffff fffffff ffffff
7 gggg gggg gggg gggg g
8 hhhhhhhh hhhh hhhhh hhh
======== END CODE =========
stamperà:
1 aaaaa a aaaa a a a a a aa
2 BB B B BB B B B  BBBBB B BBBB
3 CCCCCCCC CCCCCCCC CCCCCCC
4 DDDDDD DDDD  DDDDDDDD DDD
5 EEEEEE EEEE EEEE EEEEEE
6 FFFF FFFFFF FFFFFFF FFFFFF
7 gggg gggg gggg gggg g
8 hhhhhhhh hhhh hhhhh hhh
ciao
--
-.. --- -- .. --.. .. ---
-.. . -- .. -.-. .... . .-.. .. ...

 > my @lines = <FILE>;
Bastava che tu leggessi meglio il mio post:
	"e lavorarci su per ottimizzarla" 
;-))
	- Enrico

 wrote in message
news:20021008190026....@sorcinelli.it...


 denti :-)
Ragazzi, non litigate! :-)
I files che devo modificare sono stati generati da un altro prog. che subito 
sotto il tag <HTML> ha inserito una tabella "pubblicitaria" del programma 
stesso.
Quello che devo fare č , per ora cancellare quelle righe, dalla 2 alla 16 ( 
non 6, sorry ) e basta.
Quello che so č che tutti i file hanno le stesse prime 18 righe.
Per ora ho fatto cosi:
for(@ARGV)
{
print "$ARGV[0]\n";
if ($ARGV[0] != "
mod.pl
"){ ## Ovviamente 
mod.pl
 č il nome di questo script
                                ##che esguo nella setessa dir dei file, ma cosě evito che venga
                                ##proccessato lo stesso 
mod.pl
.
$file = $ARGV[0];
$oldfile = $file."_tmp";
open FILE,"<$file";
open NFILE,">$oldfile";
while(<FILE>){
$cont++;
        if (!($cont>=2 && $cont <= 16)) {
        print NFILE $_;
        }
}
rename $oldfile, $file;
close(FILE);
close(NFILE);
}
}
lo eseguo cosě: perl 
mod.pl
 *
risultato: 
mod.pl
[bash]#_
Come mai invece di processare tutti i file nella dir, mi si ferma sul primo 
che trova(
mod.pl
)?
Grazie 

 
(:-( Pazienza..., forse hai dimenticato TMTOWTDI ;-)
	- Enrico

}
Non hai bisogno di inventarti una variabile per memorizzare il numero di
linea, ci pensa già perl con $. .
Ma non hai bisogno neppure di fare riferimento esplicito a $. , basta usare
l'operatore range:
        while (<FILE>) {
                next if (2..16);
                print NFILE $_;
        }
Ciao.

 Ciao.
Interessante, devo approfondire, ma devo segnalare l'errore che ho fatto nel 
precedente post (mio ). La variabile $cont, non la riazzeravo dopo aver 
chiuso il file.
Grazie Ciao.

chiuso il file.
Ora che ci guardo, anche il rename su un file aperto, e ad un nome di file
già esistente, mi pare un po' strano. Magari meglio così:
  ....
  close(FILE);
  close(NFILE);
  unlink $file;
  rename $oldfile, $file;
  ....
Io, poi, invece dei glob, userei readdir.
Ciao.

 l'operatore range:
Ma pensa un po'... tutto questo non mi ricordavo nemmeno più che esisteva!
grazie.


 (:-( Pazienza..., forse hai dimenticato TMTOWTDI ;-)
Non l'ho dimenticato: non l'ho mai saputo. Illuminami, please ;-)


> Ragazzi, non litigate! :-)
Litigare??? Tranquillo che non ce lo sognamo nemmeno! ;-)
Apprezzo moltissimo la competenza, correttezza e simpatia di Enrico per
"litigarci", e anzi, proprio per questo mi sono permesso di scherzare un
po'...


 Ciao.
Infatti il rename l'ho spostato sotto i 2 close, ma non uso i glob, la lista 
dei file gliela passo come parametro ( perl 
mod.pl
 *.htm ).
Ciao
:-)

 Non l'ho dimenticato: non l'ho mai saputo. 
Sei sicuro...?
Mi vergogno quasi a scriverlo, ma la copertina del cammello 
recita: There's More Than One Way To Do It  :-)
	- Enrico

 }
Ricapitolando ed inglobando i suggerimenti degli altri:
$newfile='html.tmp';
foreach $file (@ARGV) {
#se proprio ci vuo mettere un controllo sul nome file:
        next unless $file=~/\.htm$/; 
        open (OLD, $file);
        open NEW,"> $newfile");
        while (<OLD>) {
                print NEW unless (2..16);
        }
        close OLD;
        close NEW;
        rename($newfile,$file);
}
-- 
Saluti,
Giancarlo

 Non l'ho dimenticato: non l'ho mai saputo. Illuminami, please ;-)
Questo e' gravissimo!!!!!!! :-)
-- 
Saluti,
Giancarlo

Mapperpiacere!!!! Basta che non parlate per sigle come gli americani (che mi
fanno incazzzzzzaaaareeee) e allora non ci sarebbero stati problemi. Ma
pensa te "TMTOWTDI" !!!
E allora mi sorge un'esclamazione:
IMNSTIM :-)
(E non chiedetemi spiegazioni :-) )


dei file gliela passo come parametro ( perl 
mod.pl
 *.htm ).
Questo intendevo (sia giusta o no la terminologia). IO userei invece
readdir (questione di gusti).
Ciao.

 Ma pensa te "TMTOWTDI" !!!
Gli acronimi non piacciono nemmeno a me, ma quello è il Perl
(ed è bene averlo sempre in mente).
D'altronde tu stesso hai ultimamente rilasciato il tuo 'modo' di
implementare il templating... ;-)
	- Enrico

 problemi. Ma pensa te "TMTOWTDI" !!!
Che ci vuoi fare, il perl e' americano :-) 
-- 
Saluti,
Giancarlo

 implementare il templating... ;-)
già... dovrò però rivedere il nome... magari TMT sarebbe più adeguato no?
:-)
--
end of thread

(E non chiedetemi spiegazioni :-) )
Ti denuncio all'AAAAA [1]
;))
Stefano, just kidding
[1] American Association Against Acronym Abuse.