Newsgroup: it.comp.lang.perl
Titolo: Ottimizzazione del codice

Salve, sono un principiante e vorrei alcune dritte su come ottimizzare il
codice (per quanto riguarda la velocità di esecuzione e l'occupazione di
memoria).
1. se alcune variabili vengono utilizzate solo all'interno di un blocco,
conviene dichiararle con "my" oppure è indifferente?
2. mettiamo che io debba sostituire una consistente porzione di testo in un
file, mediante espressioni regolari. Mi conviene verificare l'intera
porzione o solo la parte iniziale e finale?
meglio
    s/_stringa_molto_lunga_/ciao/ oppure
    s/^X.*Y$/ciao/ dove X e Y sono rispettivamente l'inizio e la fine
(inequivocabili) della "_stringa_molto_lunga_"?
3. esiste un modo per porre in if due condizioni senza aprire un secondo
blocco if al suo interno?
Vi ringrazio anticipatamente per le eventuali risposte. Ho cercato eventuali
faq di it.comp.lang.perl ma non ho trovato niente. E' da un pezzo che seguo
questo ng e non mi ricordo di aver mai visto questi argomenti affrontati.
_dave_

 blocco if al suo interno?
Questa mi suona un po' strana... ad ogni modo spero che questo possa
risolvere
 if ((condizione 1) && (condizione 2)) { statement }
Ciao.

blocco if al suo interno?
elsif.
-- 
ciao, | [Per rispondere togli "toglimi" dal mio indirizzo.]
Marco | * The Internet is full. Go away.  -- Joel Furr *

 wrote:
: Salve, sono un principiante e vorrei alcune dritte su come ottimizzare il
: codice (per quanto riguarda la velocità di esecuzione e l'occupazione di
: memoria).
Usa il modulo Benchmark: non tutto e` ovvio e prevedibile nella vita,
come pure nel Perl :-) (e soprattutto al cambiare delle versioni vengono
aggiunte nuove ottimizzazioni).
: 1. se alcune variabili vengono utilizzate solo all'interno di un blocco,
: conviene dichiararle con "my" oppure è indifferente?
Per la pulizia del codice sarebbe auspicabile che si usasse "my", ma
dipende dall'utilizzo che farai del tuo programma: se e` uno scriptino
one-shot per elaborare un file e dimenticare, forse non vale la pena di
consumarsi i polpastrelli, se invece e` un programma che intendi usare
nel corso dei secoli e che dovrai manutenere, allora consuma pure i
polpastrelli, che ne vale la pena!
: meglio
:     s/_stringa_molto_lunga_/ciao/ oppure
:     s/^X.*Y$/ciao/ dove X e Y sono rispettivamente l'inizio e la fine
: (inequivocabili) della "_stringa_molto_lunga_"?
Provando:
nanux:~>perl -cw -Mre='debug' -e '/stringa lunga/'
compiling RE `stringa lunga'
size 6 first at 1
   1: EXACT <stringa lunga>(6)
   6: END(0)
anchored `stringa lunga' at 0 (checking anchored isall) minlen 13 
-e syntax OK
nanux:~>perl -cw -Mre='debug' -e '/s.*a/'         
compiling RE `s.*a'
size 7 first at 1
   1: EXACT 
(3)
   3: STAR(5)
   4:   ANY(0)
   5: EXACT <a>(7)
   7: END(0)
anchored `s' at 0 floating `a' at 
1..2147483647
 (checking floating)
minlen 2 
-e syntax OK
si vede che probabilmente e` migliore il primo metodo.
Perche`?
Nel primo caso si tratta di trovare una stringa fissa (operazione
probabilmente ottimizzata), mentre nel secondo caso il ".*" mangia tutta
la stringa, poi comincia il backtracking fino a quando non viene trovata
una 'a'. 
Attenzione pero`, perche` potresti matchare anche una stringa piu`
lunga.  Ad esempio se la tua stringa e`:
"stringa lunga, ma proprio lunga"
allora il pattern /s.*a/ matcha "stringa lunga, ma", mentre se avessi
usato /m.*?a/ avresti matchato solo "stringa".
La scrittura di RE e` un'arte arcana e per toglierti ogni dubbio ti
consiglio la lettura di:
Mastering regular expressions
J.Friedl
O'Reilly
$29.95
p. 342
-- 
Nando Santagata: Telemastica & infornatica
Key fingerprint = C2 D9 C0 8E D5 B7 04 97  AF E8 3F 3E AF 4E 7F 9E
finger nando (at) ns (dot) ipers (dot) net   for my PGP public key
Home: 
http://www.ipers.net/~nandos


Grazie per la dritta, da tempo cercavo un reference valido sull'argomento.
Sono immediatamente andato in una biblioteca e me lo sono portato a casa.
Mi sembra sia un libro indispensabile per chiunque usi le RE per questioni
non banali, in particolare per me che devo estrarre informazioni da un testo
taggato (purtroppo non XML).
Grazie e saluti
Maurizio
--
Maurizio Coppari
C.I.R.F.I.D. - University of Bologna
via Galliera 3, 40126  Bologna
e-mail: 
cop...@remove.cirfid.unibo.it
           (please remove remove in reply)