Thread Seiteneffekt von our (11 answers)
Opened by GwenDragon/Linux at 2018-07-02 16:05

haj
 2018-07-02 13:15
#188606 #188606
User since
2015-01-07
558 Artikel
BenutzerIn

user image
Dass package keinen Gültigkeitsbereich beschreibt, ist ja schon dargestellt worden, deshalb nur noch ein Nachtrag zu our:

Das Verhalten von our halte ich auch für sehr ... gewöhnungsbedürftig, um es schonend zu sagen. Erstens ist es wirklich anders als use vars, zweitens gibt es anders als bei my keinerlei Warnung, wenn die gleiche Variable selben Gültigkeitsbereich nochmal deklariert wird - auch dann nicht, wenn die zweite Deklaration in einem anderen Namensraum liegt:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use warnings;
use strict;
use 5.010;

package A;
our $test = "Alpha";

package B;
our $test = "Beta";

package main;
say '$A::test    = ', $A::test;    # Alpha
say '$B::test    = ', $B::test;    # Beta
say '$test       = ', $test;       # Beta
say '$main::test = ', $main::test; # Uninitiaized

Das gibt zwei Warnungen:
  • Name "main::test" used only once: possible typo at /tmp/a.pl line 17.
  • Use of uninitialized value $test in say at /tmp/a.pl line 17.

Es gibt also keine Warnung, dass $test nochmal deklariert wird, aber dafür zwei andere.
Die zweite Warnung ist verblüffend, weil $test ja grade erfolgreich ausgegeben wurde, hier wird also der Präfix main:: irreführend aus dem Text entfernt.

Wie Du schreibst: Meistens fällt es nicht auf, eben weil üblicherweise Perl anhand der Konvention "eine Datei = ein Modul = ein Package = eine Klasse" geschrieben wird.

Nun braucht man ja our eher selten, und es ist auch nur einer der Fallstricke, wenn man mehrere package Deklarationen in einer Datei hat. Man sollte wirklich einen triftigen Grund haben, von der Konvention abzuweichen.

View full thread Seiteneffekt von our