Siechfred: externe Daten einbinden

Beitrag lesen

Ob hier our (statt my) nötig ist weiß ich nicht.

Selbstverständlich, denn my deklariert eine Variable als lokal, sodass sie nur im umschließenden Block (hier innerhalb des Packages) gültig ist (lexikalische Variable). Somit steht sie nicht zum Export in einen anderen Namensraum zur Verfügung. Variablen, die via our deklariert werden, sind zwar auch lexikalisch, aber nicht nur innerhalb des umgebenden Blocks, sondern im gesamten Package. Deshalb sind sie über die Grenzen eines Namensraumes hinweg sichtbar und werden per Default exportiert.

Letztlich ist jede Variable, die du deklarierst, zunächst global, es sei denn, du schränkst ihre Gültigkeit mittels my auf den umgebenden Block ein. Wenn du dann aus den bekannten guten Gründen das strict-Pragma verwendest, bist du gezwungen, für jede Variable den Gültigkeitsbereich festzulegen (also my bzw. our). Ohne das Pragma ist das Verhalten wie eingangs beschrieben:

{  
  my $local_foo = "I'm local";  
  $global_foo = "I'm global";  
}  
  
print ($local_foo ? "$local_foo\n" : "not declared\n");  
print ($global_foo ? $global_foo : 'not declared');

Nur wenn du use strict schreibst, musst du $global_foo mittels our deklarieren. Gleichzeitig bist du in meinem kleinen Beispiel gezwungen, den Namensraum mit anzugeben, solange sich das Script im strict-Modus befindet:

use strict;  
  
{  
  my $local_foo = "I'm local";  
  our $global_foo = "I'm global";  
}  
  
# strict für Variablen ausschalten, sonst gibt's  
# einen Fehler in der Abfrage nach $local_foo  
no strict 'vars';  
print ($local_foo ? "$local_foo\n" : "not declared\n");  
print ($global_foo ? $global_foo : 'not declared');

Man könnte das jetzt bis zum Erbrechen weiterspielen, aber ich denke, dass das Grundprinzip klar ist. Eine gute, wenn auch schon etwas ältere Abhandlung zum Thema ist (falls du sie noch nicht kennen solltest) Coping with scoping.

Siechfred

--
Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.