[Linuxtrent] Re: W Perl ;)
- From: Guido Brugnara <gdo@xxxxxxxxx>
- To: linuxtrent@xxxxxxxxxxxxx
- Date: Fri, 01 Oct 2004 15:55:33 +0200
marco moser wrote:
Luca Manganelli wrote:
E voi per chi tifate? :)
Utilizzo Perl da anni, con successo e piena soddisfazione
comunque più che tifare per Perl ... lo utilizzo.
non mi sono impegnato + di tanto ma come faccio a converite un hash
in stringa nel formato:
key1 (valore1), key2 (valore2), ...
e' la strada + breve ?
$kk=join ',',map { "$_ (${cntword{$_}})" } keys(%cntword);
grazie
marco
L'uso dell'operatore "map" è la modalità più efficente.
Io avrei scritto qualcosa di simile a:
$kk = join ',', map "$_ ($cntword{$_})", keys %cntword;
come vedrai ho tolto le parentesi tonde e graffe ridondanti.
C'è chi preferisce aggiungere delle () per avere ben chiaro l'ordine di priorità
degli operatori/funzioni, altri come me che preferiscono limitare l'uso di ()
inutili dal punto di vista sintattico, comunque il codice generato
dall'interprete è lo stesso.
L'uso delle {} sulla funione "map" serve invece a definire un blocco di
istruzioni; quando il numero delle istruzioni è pari a 1 come in questo caso il
blocco racchiuso in {} non serve.
Uno dei motivi di incomprensione di fondo del linguaggio Perl è dovuto al fatto
che lo confronta con altri linguaggi, specialmente il "C" con i quale mostra
delle forti attinenze sintattiche che però giocano brutti scherzi.
La sintassi di base è infatti FUNZIONE par1, par2, ...; l'uso delle parentesi è
solo una "forzatura" per definire l'ordine mente in altri linguaggi delimita la
lista dei parametri.
quindi func $a, $b, $c è uguale a func($a, $b, $c)
se ad esempio vogliamo passare ad una funzione (o ad un metodo) un elenco di
parametri per nome in Perl si usa passare una lista che verrà interpetata come
hash ... vediamo:
sub my_example {
my %param = @_;
print join ',', map "$_ ($param{$_})", keys %param;
print "\n";
}
my_example( Parametro_uno => 1,
Parametro_due => 2,
Parametro_tre => 3,
Parametro_quattro => 4
);
oppure:
my_example Parametro_uno => 1, Parametro_due => 2, Parametro_tre => 3,
Parametro_quattro => 4;
senza le parentesi.
Il "trucco" è il seguente: l'operatore "=>" in realtà è ",", voi scrivete
elegantemente una sequenza di chiave => valore ma in realtà elencate una lista
(array9 di lunghezza pari, dove avete nell'ordine chiave, valore, chiave,
valore, ....
Quando assegnate ad un hash un array l'interprete costruisce l'hash prendendo
gli elementi due a due.
Attenzione: se provate il codice otterrete molto probabilmente:
Parametro_tre (3),Parametro_uno (1),Parametro_quattro (4),Parametro_due (2)
Per avere la lista in ordine alfabetico di chiave usare la funzione "sort":
print join ',', map "$_ ($param{$_})", sort keys %param;
La proprietà degli hash è di non restituire le chiavi ordinate.
I denigratori del Perl attaccano questa libertà argomentando le loro tesi con il
fatto che ciò provoca stili sintattici che rendono difficoltosa la
programmazione tra gruppi eterogenei che usano convenzioni differenti.
la Comunità Perl ha comunque condiviso uno stile che viene adottato dalla quali
totalità dei moduli CPAN, il manuale "man perlstyle" esordisce con:
"Each programmer will, of course, have his or her own preferences in regards to
for matting, but there are some general guidelines that will make your programs
easier to read, understand, and maintain"
Ok, l'interprete non obbliga a queste convenzioni; il programmatore pigro può
comunque scrivere il proprio codice e poi passarlo attraverso un filtro che
mette a posto il codice (http://perltidy.sourceforge.net/), così da renderlo
meglio comprensibile agli occhi degli altri secondo la convenzione definita nel
manuale menzionato.
Ad esempio l'esempio di codice sopra indicato diventerebbe:
sub my_example {
my %param = @_;
print join ',', map "$_ ($param{$_})", keys %param;
print "\n";
}
my_example(
Parametro_uno => 1,
Parametro_due => 2,
Parametro_tre => 3,
Parametro_quattro => 4
);
Tenete comunque presente che la perfezione è solo di Dio!
Date una occhiata anche a questo:
gdo@w04:~> perl -MO=Deparse test.pl
(%lista) = ('Uno', 1, 'Due', 2, 'Tre', 3);
my $str = join(',', sort(map("$_ ($lista{$_})", keys %lista)));
print $str, "\n";
sub my_example {
my(%param) = @_;
print join(',', map("$_ ($param{$_})", keys %param));
print "\n";
}
my_example 'Parametro_uno', 1, 'Parametro_due', 2, 'Parametro_tre', 3,
'Parametro_quattro', 4;
test.pl syntax OK
l'opzione del compilatore compila e decompila il codice facendovi vedere come
interpreta il codice.
Quale ultimo consiglio:
http://www.perl.it/documenti/perlfunc/index.html
ciao ciao
Guido
--
Per iscriversi (o disiscriversi), basta spedire un messaggio con OGGETTO
"subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxx
Other related posts: