Newsgroup: it.comp.lang.perl
Titolo: i miei soliti casini...

Perchè tutto questo (che funziona):
while ($r=<IN>) {
      if ($r=~ /string/) {
        print $r;
}
}
non fa la stessa cosa di questo (che non funziona)
print $r=~ /string/ while <IN>;
cosa manca?
ciao
stefano

cosa manca?
Intanto, dal mio punto di vista, piů che mancare c'č troppa roba: io non
metterei tanta roba in un'istruzione print; in particolare, non ci metterei
assegnazioni e confronti, che sembra facciano apposta a restituire sempre
qualcosa di diverso da quello che ci si aspetta (e magari fare, nel mentre,
operazioni accessorie di cui si farebbe volentieri a meno). E questa č
l'altra cosa che non va: il risultato di ($r =~ /string/) non č una stringa,
ma un valore logico vero o falso, secondo che $r soddisfi o no l'espressione
regolare /string/.
Per farti restituire $r dovresti mettere un'espressione ancora piů
complessa, che non sto neppure a scriverti qui, per il motivo detto sopra.
La prima forma del ciclo va benissimo, e non c'č nessun motivo di doverla
cambiare. Eventualmente, se proprio non puoi fare meno di sintetizzare, puoi
tentare una cosa cosě:
  while (<IN>) {
      print if (/string/);
  }
Ciao.

questo:
    : print $r=~ /string/ while <IN>;
non stampa nulla perché nessuno definisce $r. E non tentare di scrivere
questo:
    print $r=~ /string/ while $r=<IN>;
perché ti stamperebbe il risultato di $r=~ /string/ che č 1 (quindi
otterresti '11...' numero di volte in cui si verifica un match).
Comunque questo funziona ma č un po' bruttino :-)
    while ($r=<IN>) {
          if ($r=~ /string/) {
            print $r;
    }
    }
forse cosě č piů semplice:
    while (<IN>)
    {
          if (/string/) {print}
    }
e cosě č ancora meglio:
    while (<IN>) {print if /string/}
--
perl -MLWP::Simple -e "getprint(' 
http://perl.4pro.net
 ')"

 Grazie! Come sempre esaurientissimi ;-)
Scusate una domanda: ma da quanto è che 'pasticciate' con Perl, così giusto
per farmi un'idea di quanto ancora dovrò assillarvi! e aggiungo che sono
quasi del tutto sprovvisto di un background informatico.
ciao
stefano

: Scusate una domanda: ma da quanto č che 'pasticciate' con Perl, cosě
giusto
: per farmi un'idea di quanto ancora dovrň assillarvi! e aggiungo che sono
: quasi del tutto sprovvisto di un background informatico.
non č (solo) una questione di tempo, ma soprattutto di materia grigia. Sei
sei un genio, in un paio di mesi potrai correggere le nostre cazzate, se sei
uno zuccone, fra qualche anno sarai ancora lě a chiedere le cose piů
semplici :-)


 print $r=~ /string/ while <IN>;
   Una soluzione molto "Perl" (nel senso di economia di caratteri 
immessi) potrebbe essere:
	map { print if /string/ } <IN>
o, ancora piu` economico:
	print (grep /string/,<IN>)
-- 
Alla prossima,
Marco

> print (grep /string/,<IN>)
questa è la più bella e più appropriata di tutte


	map { print if /string/ } <IN>
Generalmente e` sconsigliato usare map in void context [1]
map serve per generare una nuova lista applicando "qualcosa"
a tutti gli elementi di una lista data. In questo caso stai 
generando questa lista per poi buttarla via, usando soltanto 
i side-effect di questo "qualcosa".
Molto meglio la versione con grep, IMO.
ciao
Stefano
    [1] 
http://www.perldoc.com/perl5.8.0/pod/perlfaq6.html
    #What's-wrong-with-using-grep-or-map-in-a-void-context

Tutto ciň mi ispira una domanda: quanto č necessaria in perl la concisione?
voglio dire, ci sono e soprattutto quali sono gli effettivi vantaggi
nell'essere concisi?
ciao
stefano -stefano minor ,:-))

La mia domanda precedente nasce da queste due considerazioni (forse date dal
fatto che sono ancora poco pratico):
1. con il while associato ad if, per ora riesco ad inserire un maggior
numero di elementi di controllo, ad esempio:
while (!eof(IN)) {
 $r=<IN>;
 if ($r=~ /stringaA/ && $r!~ /stringaB/) {
 print $r;
 print OUT $r;
}
}
2. con il frammento di codice appena riportato, scrivo anche in OUT, cosa
che non fa:
print OUT (grep /RNA/,<IN>);
...e per come la vedo io, dovrebbe farlo.
stefano

 Tutto ciň mi ispira una domanda: quanto č necessaria in perl la concisione?
   Il Perl nasce come (ed in parte, rimane tuttora) linguaggio di 
scripting, il che, molte volte, significa realizzare brevemente 
programmi di utilita` piuttosto che applicativi di grandi dimensioni. E` 
evidente che se devi scrivere qualche riga di codice, risparmiare 
qualche carattere e` positivo, specialmente se non sei un programmatore 
vero e proprio e quindi la programmazione, di fatto, apparentemente 
sottrae tempo ai tuoi doveri "istituzionali".
   Larry Wall, inoltre, ha provveduto a realizzare una sintassi 
decisamente aperta (i sostenitori di altri linguaggi sostengono 
addirittura l'uso del termine "prona") ai "giochini" di offuscamento da 
coincisione, la quale e` divenuta quindi un'arte: se ci fai caso, alcuni 
guru del Perl firmano addirittura i loro articoli con brani di codice 
del tutto incomprensibile, ad una prima, superficiale occhiata, proprio 
per dimostrare il livello raggiunto in questa forma di espressione.
   Diciamo che non e` un obbligo: in parte diverte, in parte aiuta (chi 
scrive, ovviamente, meno chi legge). ;)
-- 
Alla prossima,
Marco

 ...e per come la vedo io, dovrebbe farlo.
e in effetti funziona!
prova a far girare questo:
========= CODE ===========
print STDOUT grep /string/,<DATA>;
__DATA__
bla bla string bla
bla bla
bla string bla
========= END CODE ===========
e vedrai che va.
Comunque l'argomento della concisione, è qualcosa che puoi tranquillamente
trascurare quando sei alle prime armi. Concentrati sul fatto che il
ptrogramma funzioni innanzi tutto, e poi se hai tempo cercherai di
riscriverlo meglio. personalmente mi riesce più semplice capire un code
conciso che un code pieno di assegnazioni esplicite da tutte le parti che
fanno la stessa cosa che si sarebbe potuto fare in una riga, però per un
principiante potrebbe essere vero il contrario.
Perl è un linguaggio pratico: prima risolvi il problema come meglio sai
fare, e poi lo perfezioni.


 Molto meglio la versione con grep, IMO.
   Vero. Se non stessimo parlando del Perl, direi che e` fatta apposta. :)
-- 
Alla prossima,
Marco

 fare, e poi lo perfezioni.
Questo di sicuro! sarà un mesetto che mi ci dedico seriamente e non sai
quanto mi è già stato d'aiuto. ovviamente senza il vostro aiuto, poco avrei
fatto.;-))
stefano

...e per come la vedo io, dovrebbe farlo.
Intendi dire che il codice che usa il while scrive su due handler,
mentre la seconda versione scrive soltanto su uno?
Giusto un chiarimento.
ciao
Stefano

 Giusto un chiarimento.
Volevo dire che il ciclo while scrive sia a video (print $r) sia nel
filehandler OUT (print OUT $r). Nel mio post precedente, io avevo aggiunto
OUT al suggerimento con il grep di Marco, credendo che funzionasse come nel
ciclo. Effettivamente, invece, senza parentesi (come suggerito da Domizio)
scrive nell'OUT. Visto che ci discutiamo su, ho notato anche un'altra cosa.
Se scrivo
[...]
print (grep /string/,<IN>);
print OUT grep /string/,<IN>;
[...]
lo script printa a video ciň che voglio, ma non nel il file creato/aperto
per OUT, che rimane vuoto. Se metto # davanti al primo print (diventa un
commento), lo script printa ciň che voglio nell'OUT!!!(...e ovviamente non
lo fa a video!). Why?
mi sto facendo troppe pippe mentali? in fondo voglio capire quello che
faccio.
ciao
stefano

 lo fa a video!). Why?
print "pippo";  stampa a video come dici tu... che vuol dire su STDOUT cioè:
print STDOUT "pippo";
però questo:
print OUT "pippo";
stamperà nel filehandle OUT e quindi NON su STDOUT e quindi non a video.


 nell'OUT!!!(...e ovviamente non lo fa a video!). Why?
Perche il primo grep "esamina" tutto l'hadler IN e il secondo non ha 
piu' nulla da leggere.
-- 
Saluti,
Giancarlo

 piu' nulla da leggere.
ma allora, per farle fare entrambe le cose, stampare su STDOUT e OUT,
bisogna per forza ricorrere al ciclo? adesso posto il msg, ma vado a
controllare una cosa....
Stefano

bisogna per forza ricorrere al ciclo?
No, puoi riposizionare il puntatore di <IN> all'inizio del file. Ma perché
mai dovresti volerlo fare? (O anche, che cos'hai contro i cicli? Tanto un
grep è un ciclo implicito, mica altro.)
Ciao.