Newsgroup: it.comp.lang.perl
Titolo: Comportamento strano in una regexp

Salve, ho dovuto modificare un file di testo, e c'è qualcosa che non ha
funzionato come mi aspettavo. dovevo togliere degli spazi alla fine di ogni
riga di un file di testo (non c'erano altri spazi), ed ho provato a scrivere
questa riga:
$testo =~ s/(\S)\s/$1/; ... ma gli spazi non venivano cancellati
ho provato allora questo:
$testo =~ s/\s//g; ... e ancora niente...
per risolvere, ho dovuto fare questo:
$testo =~ s/\s/xxxxyyyyxxxx/g;
$testo =~ s/xxxyyyxxx//g;
e solo così ha funzionato... ma è normale questo comportamento?
Grazie,
Paulus
--------------------------------
Inviato via 
http://usenet.libero.it

s/\s*$//g
--
perl -MLWP::Simple -e "getprint(' 
http://perl.4pro.net
 ')"

s/\s*$//mg
se è multlinea


e solo cosě ha funzionato... ma č normale questo comportamento?
E` normale, anche se estremamente irritante, che l'interprete di un
linguaggio faccia quello che gli dici di fare, non quello che intendevi
dirgli. Anche se Perl fa un onesto tentativo di interpretare le intenzioni.
Ciao.

 s/\s*$//g
Grazie per la risposta, ma comunque ancora non funziona ... (sto
impazzendo!!!).


 Ciao.
Ciao e grazie della risposta (se non altro, sono tranquillo per il fatto che
non sto sbagliando, ma ancora non riesco a capire PERCHE' NON FUNZIONA !!!)


usa s/\s*$//mg e se non va posta la stringa completa che sono curioso! :-)


 usa s/\s*$//mg e se non va posta la stringa completa che sono curioso! :-)
#
toglispazi.pl
use strict;
my $testo;
my $scrivi;
open (archivo, '</home1/oracle/dataf.txt') || die 'Non posso aprire il file
di input';
open (salida, '>/home1/oracle/dataf2.txt') || die 'Non posso aprire il file
di output';
do
  { $testo=<archivo>;
    chomp($testo);
     $testo=~s/\s*$//mg;
# $testo=~s/\s/xzzx/g;
# $testo=~s/xzzx//g;
    print salida "$testo\n";}
while ($testo);
close (archivo);
close (salida);
# FINE DEL FILE
#
# estratto del file /home1/oracle/dataf.txt
#
/EMCc4d0s1/db_VIG/system01.dbf
/EMCc1d1s1/ db_VIG/rbs_1.dbf
/EMCc1d1s2/db_VIG/temp01.dbf
/EMCc1d1s3/db_VIG/tools01.dbf
/EMCc3d0s1/db_VIG/tabelle.dbf
/EMCc3d0s2/db_VIG/verpos.dbf
# FINE DEL FILE
NB: la seconda riga contiene degli spazi inseriti per prova, ma so con
certezza che in questo file trovero soltanto degli spazi alla fine della
riga (fino alla "posizione" 80 della riga).
COME VEDI, E UNO SCRIPT BANALISSIMO !!!!
"eppur NON si muove"


non sto sbagliando, ma ancora non riesco a capire PERCHE' NON FUNZIONA !!!)
La procedura non ha nulla di sbagliato (nell'istruzione di sostituzione,
qualcosina si potrebbe dire sul ciclo di lettura da file e sull'inutile
interpolazione nell'istruzione print), sicché dev'essere qualcosa
all'intorno che non funziona.
Che cosa, difficile dirlo. Un mio errore tipico è scrivere su un file e
controllare i risultati su un altro. Non so se questo possa aiutare.
Oltre a scrivere sul file di output, aggiungi qualche istruzione di stampa
a schermo, per controllare che il ciclo venga effettivamente eseguito.
Prova anche con altri dati ed eventualmente su un'altra macchina.
Ciao.

 all'intorno che non funziona.
Leggendo la tua risposta e quella di Domizio, ho cominciato a dubitare delle
mie stesse parole e ho fatto una prova "scema e inutile": visto che lo
script è corto, ho cancellato il file e l'ho riscritto usando VI sul server
(prima l'avevo scritto usando Notepad e trasferito con FTP)...
Sicuramente avrai indovinato, comunque te lo dico lo stesso: adesso funziona
tutto...
Non so cosa sia successo veramente, anche perché con il trucchetto di
scrivere una stringa strana ad ogni occorrenza dello spazio funzionava (ed
era una modifica sul file trasferito in ftp), comunque "tutto è bene quel
che finisce bene".
Grazie tante dell'aiuto (Grazie anche a te, Domizio)!!
Paulus
PS: Adesso il dubbio che mi resta è il seguente: sono scemo io o Unix?
PS II (se ti va): cosa c'è da ridire sul ciclo di lettura e l'interpolazione
del print?


del print?
Per l'interpolazione, è forse più questione di gusti che altro: a me le
variabili fra virgolette, se proprio non sono indispensabili (e non lo sono
quasi mai), piacciono poco; invece di:
 
  print salida "$testo\n";
io avrei scritto:
  print salida $testo, "\n";
Il ciclo invece è curioso: perché gli fai fare le cose "a prescindere" e
DOPO controlli che abbia letto effettivamente qualcosa? Inoltre, la
procedura corretta per determinare la fine di un file di input è
controllare se il valore dell'ultima lettura è indefinito, non se è vero
(non nullo). La distinzione è sottile, e solo raramente comporta errori, ma
pure esiste (undef è diverso da null).
Una versione più "canonica" del ciclo potrebbe essere:
    while (defined($testo = <archivo>)) {
      ...  # fai cose
      ...  # vedi gente
    }
Ciao.

a me funziona!


> PS: Adesso il dubbio che mi resta è il seguente: sono scemo io o Unix?
Domanda rischiosa: non so che OS ha il tuo cervello, però per fregare UNIX
deve essere proprio MOLTO affidabile :-)


 Ciao.
Ciao e grazie di nuovo
Paulus


 deve essere proprio MOLTO affidabile :-)
Il mio OS č MOLTO affidabile...
solo che non l'ho aggiornato con l'ultimo service pack :))
