Newsgroup: it.comp.lang.perl
Titolo: Ho iniziato a studiare il perl...

Ciao ragazzi,
ho iniziato a studiare il perl e, per esercitarmi, mi sono detto, perchè
non proviamo a scrivere un programmino che mi calcola la sommatoria n.
Eccolo:
use 5.010;
use strict;
print "Calcolo Sommatoria n.\n";
print "Inserisci l'estremo sinistro dell'indice della sommatoria:\n";
my $indice_sinistro=<>;
print "Inserisci l'estremo destro dell'indice della sommatoria:\n";
my $indice_destro=<>;
my @indice =($indice_sinistro..$indice_destro);
my $sommatoria = totale(@indice);
print "Il risultato della Sommatoria n e' $sommatoria.\n";
sub totale {
my $somma;
foreach my $addendo (@_){
$somma += $addendo;
}
return $somma;
}
Lo faccio girare e tutto bene, eccetto quando dichiaro come indice della
sommatoria sinistro o destro lo 0.
Non capisco se è la subroutine totale che se ne va a male con lo zero,
che è anche il valore di undef, o cosa... ma non trovo il modo di farlo
girare in quel particolare caso.
Ho anche provato a mettere una if che mi faceva uno shift o un pop
sull'array togliendo lo 0 a seconda che fosse all'inizio array o alla fine.
Anche li, risultato della sommatoria dava zero X____X.
Chi mi svela l'arcano?
Grazie.

 Anche li, risultato della sommatoria dava zero X____X.
lì 
Ciao
Matteo

grazie, con il chomp funziona, non so perché ma stavolta non lo avevo messo.
Ti chiedo: perché allora non dava problemi con gli altri numeri; anche
quelli, senza chomp, danno come risultato "numero_digitato\n".
grazie per l'aiuto :)


 quelli, senza chomp, danno come risultato "numero_digitato\n".
Perché (complimenti!) hai appena scoperto un bug di Perl, o perlomeno 
una DWIMmery subottimale.
Anzitutto come evitarlo: o fai come ti ha detto Matteo oppure, visto che 
vuoi un range numerico, puoi forzare esplicitamente la numificazione dei 
valori letti prima di passarli all'operatore range:
my $indice_sinistro = 0 + <>;
# ...
my $indice_destro   = 0 + <>;
(tralasciando per ora il fatto che l'input utente andrebbe sempre 
validato e catturato con una regex).
Se vuoi sapere perché accade il fatto strano che hai rilevato: perché 
perl utilizza una semantica particolare nell'operatore ".." (range) 
quando il suo operando sinistro è una stringa che comincia per zero, per 
mantenere automagicamente lo zero iniziale (eventualmente anche più di 
uno) nei numeri più brevi della sequenza; esempio:
$ perl -e 'print join("-", "01".."12"), "\n"'
01-02-03-04-05-06-07-08-09-10-11-12
Insomma, l'operatore .. applica una DWIMmery estrema con operandi 
stringa, che qualche volta inevitabilmente da' risultati strani (perciò, 
come detto, se vuoi un range numerico, passagli esplicitamente operandi 
numerici e non avrai sorprese).
Il comportamento dell'operatore range con operandi stringa è documentato 
(a parte i casi patologici):
http://perldoc.perl.org/perlop.html#Range-Operators
La cosa andrebbe segnalata su perl5-porters: l'onore spetta a te, 
altrimenti se vuoi posso segnalarlo io in tua vece.
Ciao e benvenuto!

 una DWIMmery subottimale.
s/DWIMmery/DWIMery/g
;-)

 Ciao e benvenuto!

 nel poco tempo che il lavoro mi lascia per studiare.
Per adesso stai andando alla grande ;-)

 una DWIMmery subottimale.
In effetti non riuscivo a capire perché non funzionasse: ho fatto un pò 
di prove, sono arrivato per un attimo a pensare che lo 0 stesse dopo gli 
altri numeri nel codice ASCII, poi data l'ora sono andato a letto 
lasciando la domanda a qualcuno più afferrato in materia.
Bravo void.
P.S.
Il Perl è pieno di funzioni "figata" e di metodi alternativi per 
risolvere i problemi, ogni tanto se ne scopre uno nuovo e si rimane 
ammirati!

 print "Inserisci l'estremo sinistro dell'indice della sommatoria:\n";
[...]