[Roma.pm] Mica finisce qui... (our vs. use vars)

Emanuele Zeppieri ema_zep at libero.it
Fri Aug 3 00:14:39 PDT 2007


Un'altra considerazione sull'argomento (che non è in polemica con
nessuno, se non con me stesso, visto che mi smentisco da solo).

Emanuele Zeppieri wrote:
> [...]
> (sia pure ricorrendo al blocco dopo la dichiarazione di package 
> terminata che, come diceva giustamente Aldo, è assolutamente sacrilega).

Un blocco dopo un terminatore d'istruzione (punto e virgola) sarà pure
brutto da vedere ma, pensandoci bene, è perfettamente corretto.

Il fatto è che il blocco non è per niente riferito alla dichiarazione di
package: esso costituisce invece uno scope lessicale del tutto
indipendente dallo scope del package (il quale va dalla dichiarazione di
package fino alla fine del blocco, o del file, che la contiene).

Faccio un esempio:

package Foo; {
     package Bar; {

     };
     our $var = 11;
}

A quale package appartiene $var?
Di primo acchito, verrebbe da dire che $var appartiene a Foo...

Invece no. Siccome i blocchi *non* sono riferiti ai package, $var
appartiene a Bar, perché la dichiarazione del package Bar vive fino alla
fine del blocco che la contiene (che è quello più esterno).
In altre parole la presenza del blocco più interno è del tutto
ininfluente e non è essa che determina lo scope del package Bar.

Riformattando il codice così forse si intuisce meglio (la formattazione
precedente era volutamente truffaldina ;-)

package Foo; {
     package Bar;
         {    };
         our $var = 99;
}

print $Bar::var; # Per verificare.

Quindi in definitiva, ancorché brutta, la commistione tra i terminatori
d'istruzione ed i blocchi è perfettamente coerente con l'usuale
semantica degli uni e degli altri.

Semmai le ambiguità derivano dal fatto che le variabili our rispondono
simultaneamente a 2 distinte regole di scope: sono visibili solo
all'interno del blocco in cui sono dichiarate (se non qualificate), ma
per quanto riguarda l'appartenenza al package seguono le regole di scope
della dichiarazione di package, che sono diverse.

Però come al solito, basta saperlo.
(A saperlo!)

Ciao,
Emanuele.


More information about the Roma mailing list