[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: