Hi
Ich habe irgendwo mal gelesen, dass my und our als lexikalisch bezeichnet wurden, obwohl our ja nur am Rande was mit den lexikalischen Variablen zu tun hat (schließlich sind's ja eigentlich Packagevariablen). Darum hielt ich es für betonenswert, dass die Unterscheidung nur für my-Variablen gilt.
Einverstanden?
jaaa ... diese "lexical" Terminologie ist auch wirklich nervig!
My und Our haben AFAIK einen "lexical scope", was bedeutet das eine our-deklaration nur innerhalb seines Blockes gilt. Statt "lexical variable" - was auch in den Perl-Fehlermeldungen erscheint würd ich lieber von "privaten Variablen" reden. (halt privatbesitz des lexical scopes)
Ich habe selbst auch diese Tage begriffen was "our" von einer ohne "use strict" undeklarierten Packagevariablen unterscheidet.
Im folgenden Beispiel erstrecken sich der scope der mit our deklarierten Variablen über mehrere package- Anweisungen. Deswegen ist es wichtig zu betonen das our einen lexical scope hat, noch wichtiger wäre die Leute würden gleich defensiv klammern. Bei "use vars" hingegen ist das Verhalten wie ohne strict.
use strict;
use warnings;
package drei;
our ($x,$y);
package zwo;
use vars qw{$x $y };
package main;
our ($x);
use vars qw { $y };
($x,$y)=("main","main");
{ package zwo;
$y="zwo";
$x="zwo";
}
{ package drei;
$y="drei";
$x="drei";
}
# hier wieder package main
$\="\n";$,=",";
print def($x), def($y); #: drei,drei
print def($main::x), def($main::y); #: drei,undef
print def($zwo::x), def($zwo::y); #: undef,undef
print def($drei::x), def($drei::y); #: undef,drei
sub def{
# value or undef
if (defined $_[0]) {
return $_[0];
}else {
return "undef" ;
}
}
Tschau
Kurt