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:
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;
say '$B::test = ', $B::test;
say '$test = ', $test;
say '$main::test = ', $main::test;
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.