[Roma.pm] Alca Seltzer

Emanuele Zeppieri ema_zep at libero.it
Fri Mar 3 02:50:36 PST 2006


-----Original Message-----
Aldo Calpini
Sent: Thursday, March 02, 2006 7:34 PM
To: roma at pm.org
Subject: Re: [Roma.pm] Alca Seltzer

> [...]
> l'assegnazione ha 
> come side-effect quello di restituire il valore assegnando, 

Ho dimenticato di dire che quest'affermazione non è corretta (devo
precisarlo, altrimenti non si capirebbe come un'assegnazione ad una
variabile tied possa dare come risultato un valore diverso dal valore
assegnando, come dicevo nel mio precedente messaggio.)

In Perl (come del resto nella maggior parte dei linguaggi imperativi)
l'assegnazione *non* restituisce il valore assegnando, bensì il
contenuto della variabile *dopo* l'assegnazione (per essere più
rigorosi: il valore ritornato dalla valutazione dello lvalue dopo
l'assegnazione).

Ovviamente in quasi tutti i casi non c'è differenza ma, nel caso delle
variabili tied, la differenza diventa *molto* rilevante.
Infatti come è noto il valore ritornato da una variabile tied, è il
valore ritornato dal metodo FETCH della classe a cui tale variabile è
stata legata mediante tie.
Quindi il risultato dell'assegnazione ($foo = 123), nel caso in cui $foo
sia uno scalare tied, *non* è 123, ma il valore restituito dal metodo
FETCH che, in generale, è del tutto arbitrario.
Pertanto il metodo FETCH potrebbe ad esempio restituire il valore zero,
e quindi il test

if ($foo = 123)

potrebbe tranquillamente fallire!
Accludo anche uno script dimostrativo.

... Il silenzio di Panet continua a fare danni ;-)

Ciao,
Emanuele.

=cut

use strict;

package Tier;
sub TIESCALAR {bless \my $self, shift};
sub STORE { ${$_[0]} = $_[1] };
sub FETCH { 0 };

package main;
my $foo;
tie $foo, 'Tier';
if ($foo = 123) {
    print 'OK!'
} else {
    print 'NO!'
};
# Stampa NO!
# (E se si mette use warnings continua a dare il warning.)
__END__



More information about the Roma mailing list