Newsgroup: it.comp.lang.perl
Titolo: Qualcosa di diverso da RE in perl.

E' la prima volta che posto qui. Sto' affrontando il PERL
da poco e mi sono dato un compitino: una CGI.
Sara' il solito gestore di forum, senza pretese, ma il problema
dell' efficienza preferisco pormelo ugualmente, anche per abituarmi.
Ho esperienza di programmazione C e da quanto vedo, in perl
per accedere all' ennesimo carattere di una stringa devo
scrivere l' apposita regular expression. In C sono abituato ad
indirizzare direttamente il carattere e questo credo sia molto
piu' efficiente che creare un automa a stati finiti e farlo scattare
fino all ennesimo carattere. Esiste in perl una funzione del
tipo
$carattere = getennesinocarattere $stringa $indice;
e
setennesinocarattere $stringa $valore $indice;
che si traducano in codice di indirizzamento diretto del C?
ciao
roberto.

 setennesinocarattere $stringa $valore $indice;
substr($stringa,$indice,0) = $carattere;
Per altre info ti consiglio di consultare il Camel Book.
bye
silvio

immaginavo che ci fosse.
Grazie e ciao!!
Roberto.

 farlo scattare fino all ennesimo carattere. 
  Il Perl e` un linguaggio di alto livello orientato alla stringa: se
hai necessita` di leggere un dato carattere all'interno di una stringa,
puoi usare la subroutine /substr/, ma, a meno che non ci siano
specifiche piuttosto stringenti in tal senso (*), ti conviene anche
iniziare a pensare di aver sbagliato qualcosa.
	Alla prossima,
		Marco
(*) Per esempio, leggere ed analizzare un file di record a campi 
    di misura fissa.

    di misura fissa.
In questo caso, direi che al posto di /substr/ è preferibile utilizzare
/unpack/.
-- 
Roberto Lupi
|[ Work:     
http://www.lupex.net/
 ]|
Leggete e firmate la petizione per promuovere l'uso di software open-source
nella pubblica amministrazione su 
http://www.interlex.it/

 preferibile utilizzare /unpack/.
  Non credo: se la stringa e` di testo e` certamente piu` veloce la
substring; l'uso di /unpack/, in questo caso utilizzata solo con
stringhe di caratteri, assomiglia molto al classico cannone contro la
formica.
	Alla prossima,
		Marco

Ringrazio tutti. Eseguire una CGI non e' un problema, gia'
alcuni moduli funzionano. Uso Linux con Apache.
Vorrei ottimizzare una parte fatta un po' alla svelta.
Precisamente un accesso a file database di messaggi
indicizzati con un metodo rudimentale ISAM fatto con un
file di testo. Il perche' della scelta e' ora inutile da
discutere. Altri forum usano una directory con un file per
ogni messaggio, ma questo mangia molti inode sul server.
inoltre non ho voluto usare DBM perche' deprecated e 
connessioni a SQL server non e' sempre garantito che sia
disponibile sui server che danno spazio CGI gratuito.
Tecnologia minima quindi, e quello che manca farlo a mano
usando solo PERL.
Grazie per le cortesi risposte.
Ciao.
Roberto.

 inoltre non ho voluto usare DBM perche' deprecated
Quello che e' 'deprecated' non e' l'uso di DBM bensi' l'uso di 'dbmopen' per
aprire i file DBM.
perldoc -f dbmopen dice:
  dbmopen HASH,DBNAME,MASK
     [This function has been largely superseded by the
     'tie' function.]
     [...]
ciao, marco
--
Marco Cacchiani                                
e-mail:ma...@sirius.pisa.it
Public pgp key:         
http://www.sirius.pisa.it/marco/pgp_public_key.asc
Sirius Servizi Informatici                     e-mail: 
in...@sirius.pisa.it
Parco Teatro Pasolini, 1                       Phone:  +39 (50) 865120
I-56019 - Vecchiano                            Fax:    +39 (50) 860260
(Pisa - ITALIA)                                
http://www.sirius.pisa.it/


Sicuramente è più veloce /substr/, ma trovo /unpack/ più immediato:
my ($field1, $field2, $field3 ...) = unpack("a5 a7 a6 ...", $_);
piuttosto che 
my $field1 = substr($_, 0, 5);
my $field2 = substr($_, 5, 7);
my $field3 = substr($_, 12, 6);
...
Comunque l'I/O dovrebbe risultare il compito più dispendioso, riducendo -
per files di una cerca dimensione - il gap in velocità tra /unpack/
e /substr/.
