my und our

Hallo,

ich habe ein - nur aus meiner Sicht? - merkwürdiges Verhalten des
Perl-Compilers entdeckt.

In einem Programm deklariere ich brav - "use strict" und "use warnings"
sind natürlich aktiviert - in einer Funktion eine Variable $fz mit "my":

my $fz = 'VTX_Link';

Später greife ich dann auf die Variable $fz zu, die den erwarteten Wert
enthält, und alles ist ok.

Nun habe ich in dieser - relativ umfangreichen - Funktion herumgebastelt
und irgendwann nach dem "my" zufällig _dieselbe_ Variable mit "our"
noch einmal deklariert, wohlgemerkt: in derselben Funktion (dh., im selben
lexikalischen Bereich):

our $fz = 'VTX_Linkstate';

Das überschreibt klarerweise das mit "my" deklarierte $fz, welches später,
zu dem Zeitpunkt also, wo ich mir den "my"-Wert erwarte, den "our"-Wert
hat. Mit "klarerweise" meine ich, dass ich eine gute halbe Stunde nach dem
Fehler gesucht habe, weil IN DIESEM FALL KEINERLEI MELDUNG
ausgegeben wird.

Wird in einem Block zweimal dieselbe Variable mit "my" deklariert, gibt's
einen Fehler, detto, wenn dies mit "our" geschieht. Und auch wenn zuerst
mit "our", dann mit "my" deklariert wird, kommt die Fehlermeldung

"my" variable $fz masks earlier declaration in same scope at ...

Nur wenn zuerst "my" und dann "our" verwendet wird, bekommt man
keinerlei Hinweis, nicht einmal mit "use warnings" oder der -W Option.

Ist (bei mir) unter 5.6.1, 5.8.6 und 5.8.7 (andere Versionen habe ich z.Z.
nicht zur Verfügung) nachvollziehbar.

Was meint die Gruppe dazu? Ist das ein Fehler? Falls ja, an wen müsste
man den wie reporten?

Danke für eure Antworten, und schöne Grüße aus Wien,

Ferry

--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol [at] adv.magwien.gv.at
Ferry Bolhar [ Mi, 17 Mai 2006 19:23 ] [ ID #1318951 ]

Re: my und our

Ferry Bolhar wrote:

> Was meint die Gruppe dazu? Ist das ein Fehler?

Gegenfrage: Warum mischt Du my und our innerhalb eines
Blocks überhaupt? Ich finde das stilistisch fragwürdig.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Frank Seitz [ Mi, 17 Mai 2006 20:35 ] [ ID #1318952 ]

Re: my und our

Frank Seitz:

>> Was meint die Gruppe dazu? Ist das ein Fehler?
>
> Gegenfrage: Warum mischt Du my und our innerhalb eines
> Blocks überhaupt? Ich finde das stilistisch fragwürdig.

Es war ein Irrtum. Ich wollte - zu Testzwecken - eine weitere
Variable verwenden und habe sie daher - da "use strict" aktiv
war, mit "our" deklariert, wobei ich aber eben irrtümlich den
Namen einer bereits vorher mit "my" Deklarierten erwischt habe.

Es war mein Fehler, überhaupt keine Frage. "my" und "our"
für dieselbe Variable innerhalb eines Blocks machen keinen
Sinn. Ich finde nur, dass Perl mit "use warnings" darauf hinweisen
sollte, wie es das in allen anderen, ähnlichen Fällen (my/my,
our/our und our/my für dieselbe Variable im selben Block)
ja auch tut. Nur eben bei der Kombination my/our erhält man
keine Meldung.

Vielleicht sollte ich mal in comp.lang.perl.misc nachfragen?

LG, Ferry

--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol [at] adv.magwien.gv.at
Ferry Bolhar [ Do, 18 Mai 2006 11:31 ] [ ID #1320580 ]

Re: my und our

Ferry Bolhar wrote:
> Frank Seitz:

>>>Was meint die Gruppe dazu? Ist das ein Fehler?
>>
>>Gegenfrage: Warum mischt Du my und our innerhalb eines
>>Blocks überhaupt? Ich finde das stilistisch fragwürdig.
>
> Es war ein Irrtum. Ich wollte - zu Testzwecken - eine weitere
> Variable verwenden und habe sie daher - da "use strict" aktiv
> war, mit "our" deklariert, wobei ich aber eben irrtümlich den
> Namen einer bereits vorher mit "my" Deklarierten erwischt habe.

Deine Motivation our zu nehmen, verstehe ich immer noch nicht.
Ich sehe nicht, warum Du nicht hättest my nehmen können.

> Es war mein Fehler, überhaupt keine Frage. "my" und "our"
> für dieselbe Variable innerhalb eines Blocks machen keinen
> Sinn.

Ich meine nicht nur dieselbe Variable. Ich meine,
dass our auf Blockebene allgemein ziemlich exotisch ist.

> Ich finde nur, dass Perl mit "use warnings" darauf hinweisen
> sollte, wie es das in allen anderen, ähnlichen Fällen (my/my,
> our/our und our/my für dieselbe Variable im selben Block)
> ja auch tut. Nur eben bei der Kombination my/our erhält man
> keine Meldung.

Da stimme ich Dir zu - aus meiner Anschauung. Ob es wirklich
ein Bug ist oder ob es Gründe für dieses Verhalten gibt
in diesem local/my/our/use vars-Kuddelmuddel (obwohl großer
Perl-Fan, kann ich es nicht anders bezeichnen),
vermag ich aber nicht fundiert zu beurteilen.

> Vielleicht sollte ich mal in comp.lang.perl.misc nachfragen?

Klar. Ich selbst werde dieses Problem sicherlich nie
haben, aber wenn Du eine Antwort hast, kannst Du sie hier
ja mal wiedergeben.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Frank Seitz [ Do, 18 Mai 2006 13:06 ] [ ID #1320583 ]

Re: my und our

Frank Seitz:

> Deine Motivation our zu nehmen, verstehe ich immer noch nicht.
> Ich sehe nicht, warum Du nicht hättest my nehmen können.

Das kann ich dir verraten - weil ich die Variable auch außerhalb
des Blocks verwenden musste. Ich brauchte einfach eine neue,
globale Variable, und da ich wusste, dass ich von "use strict"
eine aufs Dach bekomme, wenn ich die Variable undeklariert
verwende, habe ich das eben mal schnell mit "our" getan und
dabei zufällig eine Variable erwischt, die ich vorher schon mit
"my" deklariert hatte. Jetzt klar?

> > Es war mein Fehler, überhaupt keine Frage. "my" und "our"
> > für dieselbe Variable innerhalb eines Blocks machen keinen
> > Sinn.
>
> Ich meine nicht nur dieselbe Variable. Ich meine,
> dass our auf Blockebene allgemein ziemlich exotisch ist.

Naja, beim Testen ist bekanntlich (fast) alles erlaubt - im fertigen
Code würde ich die Variable natürlich am Beginn des Skripts,
gemeinsam mit allen anderen deklarieren und da würde sich das
Problem nicht stellen. Aber so bin ich eben darüber gestolpert,
weil das ursprüngliche $fz am Blockende plötzlich einen falschen
Wert hatte.

>> Vielleicht sollte ich mal in comp.lang.perl.misc nachfragen?
>
> Klar. Ich selbst werde dieses Problem sicherlich nie
> haben, aber wenn Du eine Antwort hast, kannst Du sie hier
> ja mal wiedergeben.

Ja, ich poste jetzt das Ganze in c.l.p.m und sehe mal, was sich
dort bis morgen tut. Falls von Interesse, werde ich hier darauf
hinweisen; ansehen kann man sich das Ganze ja dann selber.

Schöne Grüße & danke für deine Antwort

Ferry

--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol [at] adv.magwien.gv.at
Ferry Bolhar [ Do, 18 Mai 2006 15:06 ] [ ID #1320586 ]

Re: my und our

"Ferry Bolhar" <bol [at] adv.magwien.gv.at> writes:

> [...] Ich finde nur, dass Perl mit "use warnings" darauf hinweisen
> sollte, wie es das in allen anderen, ähnlichen Fällen (my/my,
> our/our und our/my für dieselbe Variable im selben Block) ja auch
> tut. Nur eben bei der Kombination my/our erhält man keine Meldung.
> [...]

Mich überrascht das nicht, denn dass man eine globale Variable mit
einer lokalen maskieren kann. Das ist damit konsistent, dass man eine
lokale Variable eines äußeren Blocks in einem inneren Block maskieren
kann.

Peter
--
Dipl.-Ing. Peter Ehrenberg Tel.: +49 40 756604-40
Auf der Höhe 29 Netz: http://dipe.de/
21109 Hamburg Perl · Oracle · Linux · Netzwerk
Germany Softwareentwicklung · Installation · Administration
Peter Ehrenberg [ Do, 18 Mai 2006 15:15 ] [ ID #1320587 ]

Re: my und our

Peter Ehrenberg wrote:
> "Ferry Bolhar" <bol [at] adv.magwien.gv.at> writes:
>>
>>[...] Ich finde nur, dass Perl mit "use warnings" darauf hinweisen
>>sollte, wie es das in allen anderen, ähnlichen Fällen (my/my,
>>our/our und our/my für dieselbe Variable im selben Block) ja auch
>>tut. Nur eben bei der Kombination my/our erhält man keine Meldung.
>>[...]
>
> Mich überrascht das nicht, denn dass man eine globale Variable mit
> einer lokalen maskieren kann. Das ist damit konsistent, dass man eine
> lokale Variable eines äußeren Blocks in einem inneren Block maskieren
> kann.

Das erscheint logisch, es ist aber so, dass der Fall eine Warnung
produziert. Der umgekehrte Fall (our-Variable maskiert my-Variable) geht
dagegen warnungsfrei durch.

Warnung:

#!/usr/local/bin/perl -w
{
our $x = 1;
my $x = 2;
print "$x\n";
}
__END__
"my" variable $x masks earlier declaration in same scope ... line 5
2

Keine Warnung:

#!/usr/local/bin/perl -w
{
my $x = 2;
our $x = 1;
print "$x\n";
}
__END__
1

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Frank Seitz [ Do, 18 Mai 2006 16:08 ] [ ID #1320589 ]

Re: my und our

Peter Ehrenberg:

> Mich überrascht das nicht, denn dass man eine globale Variable mit
> einer lokalen maskieren kann. Das ist damit konsistent, dass man eine
> lokale Variable eines äußeren Blocks in einem inneren Block maskieren
> kann.

Der springende Punkt ist nur, dass hier nichts maskiert wird. Der Wert
der mit "my" deklarierten Variable wird tatsächlich vom Wert der
mit "our" deklarierten Variable _überschrieben_, da durch die Deklaration
mit "our" auch eine lexikalische Variable mit diesem Namen angelegt wird,
die ein Alias auf die gleichnamige globale Variable ist. Das heißt, beide
Variable "zeigen" auf denselben Wert, und selbst wenn man die mit "my"
deklarierte Variable nach der "our" Deklaration noch ansprechen könnte
(zB. durch ein Pseudo-Package "My::"; wäre vielleicht eine interessante
Erweiterung), wäre der ursprünglich zugewiesene Wert nicht mehr vor-
handen (das kann man mit dem B:: Modul nachprüfen, wenn man sich
den Scratch Pad des Blocks, (der Platz, wo lexikalische Variable
angelegt werden) genauer ansieht.

Das heißt, hier gehen Daten unbeabsichtigt verloren, und das ist etwas,
worüber Perl mit "use warnings" auf jeden Fall informieren sollte. Und
umgekehrt passiert das, wie ich geschrieben habe, ja auch.

Übrigens: in der englischsprachigen Gruppe comp.lang.perl.misc ist
man auch der Meinung, dass es sich um einen Bug handelt und Ben
Morrow, einer der XS/C-Hacker in der Gruppe, wird meine Beschrei-
bung an die p5p (Perl5 Porters = der "heilige" Gral der Perl-Entwickler)
Gruppe weitergeben. So habe ich also tatsächlich nach über 10 Jahren
(ich habe 1994, damals noch mit Perl 4, begonnen) Perlprogrammierung
wirklich noch einen "Bug" entdeckt!...

Schöne Grüße aus Wien,

Ferry

--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol [at] adv.magwien.gv.at
Ferry Bolhar [ Fr, 19 Mai 2006 12:56 ] [ ID #1322067 ]
Perl » de.comp.lang.perl.misc » my und our

Vorheriges Thema: Externes Skript einbinden: do/require
Nächstes Thema: Exporter nicht nötig?