Perl è un linguaggio con una marcata dipendenza dal contesto: il risultato di un'espressione dipende da come viene utilizzato il suo risultato. Storicamente, questo ha reso il linguaggio straordinariamente flessibile, ma anche i programmatori esperti possono commettere errori se non considerano le peculiarità del funzionamento dei contesti scalari e di lista.
La questione è emersa fin dalle prime versioni di Perl, quando si supponeva che la stessa operazione potesse restituire un array o un singolo valore – ad esempio, la chiamata della funzione localtime può restituire o una lista o una stringa a seconda della situazione.
Il problema è che una cattiva gestione del contesto porta a errori inaspettati: ad esempio, elementi superflui, risultati vuoti o comportamenti strani delle espressioni logiche.
La soluzione è comprendere sempre chiaramente in quale contesto viene chiamata la funzione o l'espressione, utilizzare la funzione incorporata wantarray nelle proprie sottoprogrammi e non permettere una mescolanza implicita dei contesti.
Esempio di codice:
sub may_return { return wantarray ? (1, 2, 3) : "scalar result"; } my @arr = may_return(); # restituirà (1,2,3) my $val = may_return(); # restituirà "scalar result"
Caratteristiche principali:
È possibile determinare se un'espressione è utilizzata in contesto void all'interno della funzione stessa?
Risposta: No, solo scalare o di lista. In Perl 5 non esiste una funzione che definisca il contesto void all'interno di una sottoprogramma — la funzione wantarray restituisce undef in questo caso, ma per un altro comportamento.
Esempio di codice:
sub example { return wantarray ? (1,2) : wantarray ? undef : "scalar"; # non corretto }
Può una funzione restituire diversi tipi di dati a seconda del contesto?
Risposta: Sì, è del tutto lecito e frequentemente utilizzato.
Il comportamento degli operatori (ad esempio, shift, pop) dipende dal contesto?
Risposta: Sì. Ad esempio, quando shift viene chiamato all'interno di una funzione — dipende se viene utilizzato @_ (globalmente o lessicalmente) e se il risultato sarà passato come scalare o come lista.
Uno sviluppatore ha scritto una funzione che restituisce sempre una lista, senza considerare il contesto scalare. Se questa funzione viene chiamata in un contesto scalare, si otterrà solo l'ultimo elemento della lista.
Vantaggi:
Svantaggi:
Nella funzione viene utilizzato wantarray e viene restituita o una lista o uno scalare significativo o undef.
Vantaggi:
Svantaggi: