our local

27/04/2010 - 10:16 von Paolo Peruzzi | Report spam
Hallo,

an folgendem Beispiel merke ich, dass ich die Funktion von local immer
noch nicht ganz begriffen hab:
Die mit /local/ lokalisierte Variable hat einen rekursiven
Gültigkeitsbereich in alle aufgerufenen Funktionen innerhalb des
aktuellen Blocks.
Das wollte ich nutzen, um in Teilbereichen einen Prefix für den Logger
zu definieren. Dieser soll außerdem bis in aufgerufene Funktionen
gelten.

Beispiel 1:

#!/usr/bin/perl
use strict;
use warnings;

our $logprefix = "our";

sub sub1 {
print "##### sub1: #####";
print "$logprefix";

print "-- local1 zone --";
local $logprefix = $::logprefix . ":local1";
print "$logprefix";
sub2();

print "-- local2 zone --";
$logprefix = $::logprefix . ":local2";
print "$logprefix";
sub2();
}

sub sub2 {
print "##### sub2: #####";
print "$logprefix";
}

print "##### main: #####";
print "$logprefix";
sub1();



Ergebnis 1:

##### main: #####
our
##### sub1: #####
our
our:local1
##### sub2: #####
our:local1
our:local1:local2
##### sub2: #####
our:local1:local2




Ab local2 zone hàtte ich erwartet, dass $logprefix überschrieben wird
mit ourvar:localvar2. Aber mit $::logprefix komme ich nicht mehr an die
alte Variable vor der Lokalisierung, auch nicht mit $main::logprefix.

Kann mir jemand etwas Klàrung zum local modifier geben oder gànzlich von
dem Vorhaben abraten?

Gruß,
Paolo
 

Lesen sie die antworten

#1 Wolf Behrenhoff
27/04/2010 - 10:46 | Warnen spam
Paolo Peruzzi wrote:
Hallo,

an folgendem Beispiel merke ich, dass ich die Funktion von local immer
noch nicht ganz begriffen hab:
Die mit /local/ lokalisierte Variable hat einen rekursiven
Gültigkeitsbereich in alle aufgerufenen Funktionen innerhalb des
aktuellen Blocks.
Das wollte ich nutzen, um in Teilbereichen einen Prefix für den Logger
zu definieren. Dieser soll außerdem bis in aufgerufene Funktionen
gelten.

Beispiel 1:
our $logprefix = "our";

sub sub1 {
print "##### sub1: #####";
print "$logprefix";

print "-- local1 zone --";
local $logprefix = $::logprefix . ":local1";
print "$logprefix";
sub2();

print "-- local2 zone --";
$logprefix = $::logprefix . ":local2";





Das local ist hier immer noch gültig, wir sind noch im aktuellen Block.

print "$logprefix";
sub2();
}

sub sub2 {
print "##### sub2: #####";
print "$logprefix";
}

print "##### main: #####";
print "$logprefix";
sub1();



Ab local2 zone hàtte ich erwartet, dass $logprefix überschrieben wird
mit ourvar:localvar2. Aber mit $::logprefix komme ich nicht mehr an die
alte Variable vor der Lokalisierung, auch nicht mit $main::logprefix.

Kann mir jemand etwas Klàrung zum local modifier geben oder gànzlich von
dem Vorhaben abraten?



Die "lokale Überschreibung" gilt im aktuellen Block, also bis zur }.

Was du also verwenden kannst:

print "-- local1 zone --";
{
local $logprefix = $logprefix . ":local1";
print "$logprefix";
sub2();
}

print "-- local2 zone --";
{
local $logprefix = $logprefix . ":local2";
print "$logprefix";
sub2();
}

Aber die Frage ist natürlich, ob man das so wirklich tun will oder ob
man nicht lieber das Pràfix als Parameter an sub2 übergeben sollte.

Gruß, Wolf

Ähnliche fragen