Newsgroup: it.comp.lang.perl
Titolo: Aiuto! Scrivo Perl come C :)

Insomma, si fa quel che si puo', ma il mio perl e' troppo primitivo...
I seguenti scampoli funzionano (per forza, sono C :)  , immagino ci
siano modi piu' Perl di scriverli, specie quei cicli for con ++$i ...
qualche consiglio per aiutarmi a migliorare?
Thx,
Pleg
1. ho una linea di testo ( $_ ) fatta cosi':
FORMAT word1 word2 word3 word4 ... wordN
Voglio scartare la keyword FORMAT, e trovare la posizione della parola
wordM (ad es., se cercassi "word2", voglio ottenere il valore 1,
indice a partire da 0), il cui valore e' nella variabile $signalName;
l'indice cercato sara' in $sigCol. Codice:
my @signals = split(/ /, $_);
shift(@signals);
my $sigCol = 0;
foreach (@signals) {
    if (/^$signalName$/) {
        last;
    }
    $sigCol = $sigCol + 1;
}
2. Il resto del file e' nella forma (semplificata): <ripetizione>
<valore> . Con una regex estraggo i due campi, dopodiche' voglio
creare una stringa in cui i caratteri <valore> vengono ripetuti
<ripetizione> volte, per ogni linea del file. Esempio: da
2  X
1  1
3  H
2  0
voglio ottenere la stringa "XX1HHH00", in $signalBitstream. Codice:
[loop sulle linee del file]
    /^R(\d+)\s+\w+\s+[10XHL]{$sigCol}([10XHL])/;
    my $reps = $1;
    my $bit = $2;
    my $tmpStr;
    for(my $i = 0; $i < $reps; ++$i) {
        $tmpStr = $tmpStr . $bit;
    }
    $signalBitstream = $signalBitstream . $tmpStr;
[fine loop]

 [fine loop]
my $signal_bitstream = '';
while (<>) {
     /(\S+)\s+(\S+)/;
     $signal_bitstream .= $2 x $1
}
Qui invece, oltre a non aver barato, ho pure aggiunto l'inizializzazione 
di $signal_bitstream.
Un'ultima cosa: non usare nomi di identificatori mixed-case, fa tanto 
javarolo.
Per il resto, stai andando alla grande.
Ciao!

 qualche consiglio per aiutarmi a migliorare?
Ah, se intendevi consigli di carattere generale: studia bene i builtin
http://perldoc.perl.org/perlfunc.html
http://pod2it.sourceforge.net/pods/perlfunc.html
consulta sempre CPAN, frequenta 
perlmonks.org
, 
perl.it
 (e la mailing 
list 
mon...@lists.perl.it
).
Se ne hai la possibilit�, magari anche l'IPW2009:
http://conferences.yapceurope.org/ipw2009/
(la partecipazione � gratuita).
E ovviamente non abbandonare il newsgroup ;-)
Quale che sia il tuo problema, � altamente probabile che sia stato gi� 
affrontato da qualcun altro. Se non proprio il tuo, un problema simile.
Ciao!

 voglio ottenere la stringa "XX1HHH00", in $signalBitstream. 
Io farei cosi':
my $signalBitstream="";
[loop...]
  my ($reps,$bit) = /^R(\d+)\s+\w+\s+[10XHL]{$sigCol}([10XHL])/;
  $signalBitstream .= $bit x $reps;
  ....
[fine loop]
print "$signalBitstream\n";
Ma sicuramente avrai risposte migliori da programmatori Perl piu' seri di
me :)

 my $sig_col = ( first_index {$_ eq $sig_name} split ) - 1;
Questo � pi� efficiente (e non usa neanche List::MoreUtils):
my $sig_col = -1;
$sig_col++ while /(\S+)/g && $1 ne $sig_name;
L'avevo detto che il codice Perl � sempre migliorabile ;-)

[cut]
Grazie a tutti, oggi mi studiero' i vostri post!
Il mio dilemma principale al momento, visto che cmq Perl lo uso poco,
e' il corretto bilanciamento tra funzionalita' e leggibilita'. Ovvero:
il codice che ho scritto io so che anche tra 6 mesi riusciro' a
leggerlo (appunto perche' sembra C :) , mentre le forme compatte,
potenti ed eleganti, magari tra due settimane devo metterci le mani e
non mi ricordo piu' come funzionano.
Si', lo so, la soluzione e' una sola: studiare :)
Pleg

 non mi ricordo piu' come funzionano.
Purtroppo e' il "problema" del Perl anche per me. Essendo la semantica
estremamente ricca ma allo stesso tempo molto compatta, se non lo usi
frequentemente tendi (ok, tendO) a dimenticarti molte cose e un codice
compatto rivisto dopo un po' di tempo richiede nuovamente di "scoprire"
cosa faceva e come lo faceva. Alla fine, finisci per scrivere un po' meno
compatto per mantenere leggibilita' (anche se forse scrivere "alla C" come
facevi e' un po' troppo, ma ovviamente devi fare cio' che e' meglio per
te).
Il tutto IMVHO.

 Si', lo so, la soluzione e' una sola: studiare :)
S�, quello non si pu� eludere, e funziona sempre ;-)
Un'altra cosa che aiuta molto nello scrivere codice manutenibile, � una 
modularizzazione proattiva del codice stesso.
Quando il codice comincia a estendersi troppo, wrappa tutto in classi e 
metodi: in questo modo il codice complesso esporr� all'utente un'API pi� 
leggibile e, d'altro canto, il tuo codice /smart/ rimarr� incapsulato 
dentro un qualche specifico metodo (auspicabilmente senza effetti 
collaterali e azioni a distanza).
Del resto nulla di nuovo: � una delle regole auree della buona 
programmazione.
Ciao!