-+  Associazione
-+  Documenti
-+  Eventi
-+  Community
-+  Blog
-+  Link

Giugno 2014

Dom Lun Mar Mer Gio Ven Sab
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

Cerca






 

« Strehler, CMS leggero made in Italy | Home

Benvenuto Perl 5.20!
02.06.14

La versione 5.20 del Perl è ufficialmente disponibile!

Di solito non annunciamo le nuove versioni del linguaggio, ma questa introduce, oltre alla solita miriade di miglioramenti, bugfix, aggiornamenti e aggiustamenti, un paio di feature davvero innovative che riteniamo valga la pena di far conoscere:

  • Signatures
  • Postfix Dereferencing


Signatures

Ebbene SÌ, dopo solo qualche decennio, finalmente Perl adotta uno stile di segnatura (o firma) delle funzioni più in linea con... praticamente tutti gli altri linguaggi di programmazione esistenti :-)

Tutti conosciamo l'assegnamento ai valori di @_, fino ad oggi unico modo per accedere ai parametri passati ad una funzione:

sub somma {
    my($x, $y) = @_;
    return $x + $y;
}

Per quanto molto potente e flessibile (pensate a: numero variabile di argomenti, comportamenti diversi in base alla tipologia dell'input, operazioni in place sugli argomenti, eccetera), 9 volte su 10 non sono potenza e flessibilità che ci servono. Pertanto l'idioma tipico può ora essere semplificato in:

sub somma($x, $y) {
    return $x + $y;
}

Più semplice e decisamente più leggibile, soprattutto per chi si accosta al Perl per la prima volta. Non trovate?

Postfix Dereferencing

Dietro questo nome complicato (derefenziazione suffissa?) si nasconde una funzione in realtà semplice, ma che sicuramente risulterà molto gradita a chi quotidianamente ha a che fare con strutture dati complesse.

Alzi la mano chi non si è mai trovato a dover scrivere cose del tipo:

foreach my $element (@{ $data->{$key} }) {
    # ...
}

Operazione quasi banale: scorrere il contenuto di un array memorizzato in una chiave di un riferimento ad hash. Eppure, dimenticarsi una parentesi è fin troppo facile :-)

In Perl 5.20 lo possiamo (relativamente) semplificare in:

foreach my $element ($data->{$key}->@*) {
    # ...
}

Il @* finale vuol dire: valuta il risultato e dereferenzialo come array. Esistono ovviamente anche i corrispondenti %* (riferimento ad hash), &* (riferimento a funzione), $* (riferimento a scalare) e il vagamente inquietante ** (riferimento a glob).

Probabilmente questa nuova sintassi richiederà un po' di tempo per risultare naturale, ma personalmente lo ritengo un enorme passo avanti!

Allarme! Allarme!

La nota dolente, se vogliamo, è che queste nuove funzioni, seguendo una modalità introdotta con la versione 5.10, vanno abilitate esplicitamente tramite use feature.

use feature 'signatures';
sub somma($x, $y) {
    return $x + $y;
}

use feature 'postderef';
foreach my $element ($data->{$key}->@*) {
# ...
}

Non solo però: sono entrambe considerate sperimentali (come del resto given/when e l'operatore di smart-match ~~). Il loro utilizzo, pertanto, genera comunque warning da parte del compilatore...

Per affermare che siete pienamente consapevoli delle eventuali controindicazioni e volete veramente utilizzare le funzionalità, occorre un passettino in più:

use feature 'signatures';
no warnings 'experimental::signatures';

Stesso vale per 'postderef' e 'experimental::postderef'.

Personalmente trovo questo fiorire di funzionalità sperimentali piuttosto scomodo. Non tanto per la linea in più da inserire nel codice, quanto perché non è chiaro se e come le versioni future supporteranno queste funzionalità, quindi usarle in codice destinato alla produzione sembra un po'... rischioso a lungo termine.

Del resto, è comprensibile come introdurre nuove funzionalità in un linguaggio con quasi 30 anni di onorata carriera e tonnellate di codice già scritto da supportare, sia un'operazione da condurre con le pinze.

Sia come sia, benvenuta l'innovazione!

Inviato da dada il 02.06.14 10:23
Ti è piaciuto questo articolo? Iscriviti al feed!

Inviato da Anonymous il 03.06.14 15:55

Sono molte le "feature" introdotte nelle più recenti versioni di Perl 5 che probabilmente faranno contenti molti, ma ciò che io apprezzo di più è la compatibilità con il passato, dovendo mantenere del codice assai datato, senza subire alcun problema ad ogni aggiornamento.
Caratteristica difficile da riscontrare con altri linguaggi.

Inviato da Flavio il 03.06.14 21:12

Le feature sembrano interessanti anche se il mio retaggio mi spinge di solito ad evitare queste "diavolerie moderne"! Per alcune cose - come il postfix dereferencing - non capisco benissimo perché la gran cautela, probabilmente sono rimasti scottati in passato da smart match...

Mi piace anche la nuova opzione di slicing; per gli array si tratta di una novità isolata o in passato è già stato introdotto qualche meccanismo particolare per il supporto di indice-valore?

Inviato da dada il 13.06.14 15:55

@Flavio: si, era già stato introdotto each:

while(my($indice, $valore) = each @array) { ... }

funziona dalla versione 5.12.1 e NON è sperimentale :-)

cheers,
Aldo










Devo ricordare i dati personali?






D:
Sull'autore...
D:
La ML di Perl.it
Iscriviti! mongers@lists.perl.it è la lista ufficiale di Perl Mongers Italia per porre quesiti di tipo tecnico, per rimanere aggiornato su meeting, incontri, manifestazioni e novità su Perl.it.
D:
Annunci Google