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

Aldo Calpini dada at perl.it
Mon Aug 6 06:21:57 PDT 2007


che dire... Emanuele ha ragione, non esistono prove inconfutabili del 
fatto che our sia deprecato. io del resto lo sapevo benissimo, ma quando 
mi sono reso conto che Flavio stava arrampicandosi sugli specchi, gli ho 
un po' fatto da spalla, per evitargli di fare una figuraccia... sapete 
quant'è sensibile quel ragazzo...

no, eh? :-)

d'accordo, è stato il classico abbaglio di una notte di mezza estate. 
derivante anche dal fatto, però, che a me - al di là dell'apprezzamento 
ufficiale - our nun me piace proprio. e in questo almeno sento di non 
sentirmi del tutto solo :-)

e siccome nutro da sempre una forma di latente sadismo verso gli equini 
deceduti, voglio puntualizzare su quanto...

Emanuele Zeppieri wrote:
> 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.
>   

detta così sembra quasi un complimento! invece... la cosa che trovo 
orenda (si, con una erre) è quel "visibile". fondamentalmente, le 
variabili our *non* hanno uno scope. ma usandole come variabili di 
package *sembra* che ce l'abbiano. prendete ad esempio questo:

  {
      our $x = 42;
  }
  print "x=$x\n"; # ==> 42

o perfino questo:

  $x = 42;
  print "x=$x\n"; # ==> 42
  {
      our $x = 43;
      print "x=$x\n"; # ==> 43
  }
  print "x=$x\n"; # ==> 43

notate che il primo esempio ha addirittura il coraggio di non compilare 
con use strict! il messaggio dice: Variable "$x" is not imported. ma 
imported de che?

le variabili our introducono delle variabili di package (o, nel caso del 
solo package main, sostanzialmente delle variabili globali), e 
delimitarle in uno scope ne altera solo la visibilità da parte di 
*altri* package senza qualifica completa. la loro definizione non va mai 
out-of-scope (ok, mai fino a fine programma o EOF :-).

quindi:

- non sono "scopabili" come le variabili local
- pur non essendolo, si lamentano con strict quando vengono "scopate"
- sbrodolano la loro visibilità su altri package definiti nello stesso file

non sembra un po' meno bello anche a voi our adesso? :-)


cheers,
Aldo


More information about the Roma mailing list