martedì 17 gennaio 2017

Perl e gli operatori logici a differente priorità

Alcune difficoltà che noto in molti colleghi che iniziano a programmare in Perl venendo da altri linguaggi è il concetto di contesto, la differenza fra array e liste e gli operatori a bassa e alta priorità. Con riferimento a questi ultimi mi sono reso conto di non aver mai pensato realmente al loro utilizzo, basandomi per lo piu' sul fatto che "Perl farà la cosa giusta".

Per comprendere meglio la differenza fra "or" e "and" a bassa priorità e i loro duali "||" e "&&" ad alta priorità si consideri il seguente pezzetto di codice:

my $x = 10;
my $y = 20;

my $z = $x and $y;
say "Bassa priorita' = $z";
$z = $x && $y;
say "Alta priorita' = $z";

che produce come output

Bassa priorita' = 10
Alta priorita' = 20


Anzitutto utilizzo un and-logico con il primo valore ($x) non falso per evitare che sia cortocircuitato. Inoltre si tenga presente che, a differenza di altri linguaggi, gli operatori logici di cui sopra restituiscono l'ultimo valore valutato (Perl farà la cosa giusta...), che significa che prese singolarmente le due righe di codice seguente

$x and $y;
$x && $y;

restituiscono entrambe il valore $y. Ma l'and verbale "and" ha bassa priorità, e questo significa che viene applicato successivamente ad altri operatori, nell'esempio di cui sopra dopo l'operatore di assegnamento "=". Viceversa l'and-logico simbolico viene applicato prima di altri operatori, ovvero aggiungendo un po' di parentesi il programma di cui sopra è come se fosse valutato così:

( my $z = $x ) and $y;
$z = ( $x && $y );


Ecco un esempio piu' utile:

sub value{ my ( $value ) = @_; $value; }
$z = value( 0 ) or $y;
say "Bassa priorita' = $z";
$z = value( 0 ) || $y;
say "Alta priorita' = $z";


che produce il risultato

Bassa priorita' = 0
Alta priorita' = 20

Nessun commento: