Newsgroup: it.comp.lang.perl
Titolo: Perché non funziona ?

Salve, ho scritto il mio programma in perl (LO AMO !!!):
#! /usr/bin/perl
# use warnings;
use strict;
my $testo;
my $scrivi;
open (archivo, '<c:\pablo\scripts\def.txt');
open (salida, '>c:\pablo\scripts\def2.txt');
do
  { $testo=<archivo>;
    $testo =~ s/REM//;
    $scrivi = $testo;
    print salida "$scrivi\n";}
while ($testo);
close (archivo);
close (salida);
print "FINITO !!!";
Cosi funziona (toglie i REM alle righe di definizione delle tabelle generate
con imp di oracle)... solo che volendo fare il "fico" ho provato a
riscriverlo cosi:
#! /usr/bin/perl
# use warnings;
use strict;
my $testo;
my $scrivi;
open (archivo, '<c:\pablo\scripts\def.txt');
open (salida, '>c:\pablo\scripts\def2.txt');
do
  { $testo=<archivo>;
    $scrivi = $testo =~ s/REM//;
    print salida "$scrivi\n";}
while ($testo);
close (archivo);
close (salida);
print "FINITO !!!";
E non funziona più (cioè funziona, ma invece di riscrivere le righe senza le
REM, mi scrive degli 1 su ogni riga e basta... mi viene in mente che è il
risultato booleano della search).
Come mai, forse non è lecito fare questa operazione (cioè assegnare il
risultato della substitute a una variabile in un unica riga)?
se invece si può fare. può essere che io non possa farlo perché uso la
versione della activestate per windows?
grazie,
Paulus JAPH (non perché lo sia veramente, ma perché più lo conosco e più mi
piace!!)
Paulus
http://spazioweb.inwind.it/it_informatica
--------------------------------
Inviato via 
http://usenet.libero.it

versione della activestate per windows?
No.
Ciao.
P.S. Non capisco perche' hai rovesciato il while. Da quello che capisco del
tuo codice, non mi sembra molto sicuro: rischi di fare delle cose (se non
di leggere) anche dopo la fine del file di input.

           $scrivi  = ($testo =~ /REM/); # (2)
Manca una parentesi (ho ribattuto il codice, invece di fare un copia e
incolla dallo script di verifica, come faccio di solito). Gli esempi
corretti sono questi:
          ($scrivi) = ($testo =~ /(REM)/); # (1)
           $scrivi  = ($testo =~ /(REM)/); # (2)
Ciao.

 di leggere) anche dopo la fine del file di input.
Soltanto perche so che avrò sempre delle REM in ogni riga (oracle lo scrive
sempre).
All'inizio l'avevo scritto con while all'inizio del blocco ma poi per
esercitarmi con do-while l'ho capovolto... e poi mi sono scordato di
rimetterlo a posto !!!
PS: Un confronto?: con VBScript ci mettevo almeno 15 secondi... con Perl ci
metto di più a leggere la riga con la scritta "FINITO" che Perl a darmi il
risultato :)))


 close (salida);
---CUT HERE
	- Enrico

 risultato della substitute a una variabile in un unica riga)?
Ricorda che =~s// non e' una funzione ma un operatore, quindi agisce 
sul suo argomento (la variabile prime di =~) e restituisce vero o false 
se la sostituzione avviene o meno.
A mio avviso e' un gran bel vantaggio rispetto alla stragrande 
maggioranza dei linguaggi dove le regexp e il loro match/raplacevengono 
gestite da funzioni e ti obbligano a fare capriole per modificare una 
stringa lasciandola nella stessa variabile.
Per fare il "fico" prova a scrivere la stessa cosa in modo piu' 
sintetico possibile.. e' meglio.. ed e' piu' divertente ;-)
-- 
Saluti,
Giancarlo