Schrift
[thread]5770[/thread]

Exporter und local



<< >> 10 Einträge, 1 Seite
betterworld
 2003-09-27 20:21
#57524 #57524
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Kann man local auch irgendwie auf Exporter-Variablen anwenden? Folgendes Beispiel illustriert das Problem:

Datei Foo.pm
Code: (dl )
1
2
3
4
5
6
package Foo;
use Exporter;
use vars qw/@ISA @EXPORT/;
push @ISA, "Exporter";
push @EXPORT, '$foovar';
$Foo::foovar = 'hallo';


Datei useFoo.pl
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
use strict;

use Foo;

{
 local $foovar = "bye"; # Zeile 6
 print "$foovar\n"; # prints bye
 print "$Foo::foovar\n"; # prints hallo
 {
   package Bar;
   use Foo;
   print "$foovar\n"; # prints hallo
 }
}


Das local wirkt sich nur auf die importierte Variable aus, nicht aber auf das Original. Es wirkt sich auch nicht auf die in Bar importierte Variable aus.
Wenn man in Zeile 6 $Foo::foovar schreiben wuerde, waere der Effekt anders herum, und in Bar hat sich nach wie vor nichts veraendert.
Kann ich irgendwie sagen, dass ich alle Versionen der Variable, also das original sowie die Importe in allen importierenden Paketen beeinflussen will? Etwa so, wie wenn ich explizit am Anfang des Blocks eine Sicherheitskopie anlegen wuerde, dann die Variable ueberschreiben und am Ende des Blocks wieder zuruecksetzen wuerde?

Danke...

Edit: ``anders herum'' soll heissen, dass die Ausgaben der ersten beiden prints vertauscht sind.\n\n

<!--EDIT|betterworld|1064679872-->
coax
 2003-09-28 08:34
#57525 #57525
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Ich glaube verstanden zu haben was du moechtest :).
Exportier einfach den Typeglob von foovar.
Code: (dl )
1
2
3
4
5
6
7
8
9
package Foo;

use Exporter;
use vars qw/@ISA @EXPORT/;

@ISA = qw(Exporter);
@EXPORT = qw(*foovar);

$foovar = 'old';


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use Foo;

print "\$foovar\t\t\$Foo::foovar\n";
print "-" x 30,"\n";


print "$foovar\t\t$Foo::$foovar\n";

$foovar = 'new';

print "$foovar\t\t$Foo::$foovar\n";

# Ausgabe:
# $foovar         $Foo::foovar
# ------------------------------
# old             old
# new             new
\n\n

<!--EDIT|coax|1064723770-->
,,Das perlt aber heute wieder...'' -- Dittsche
kabel
 2003-09-28 14:11
#57526 #57526
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
alternativer ansatz mittels CPAN:Class::Singleton:

ist leider nicht so schön, wie perls primitive local zu benutzen, aber naja ...

Quote
$> perl -MCSLocal
my $p = CSLocal->instance ();
$p->value (42);
$p->localize ();
$p->value ("blubber di blah");
print "value is [", $p->value (), "]\n";
$p->restore ();
print "after restore [", $p->value (), "]\n";

value is [blubber di blah]
after restore [42]
$>

CSLocal.pm
[READMORE] # damn it! 8)
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package CSLocal;
use strict;
use base qw/Class::Singleton/;
my @value_stack = ();
sub undefine_value { delete $_[0]->{VALUE}; }
sub value {
my $self = shift;
$self->{VALUE} = $_[0] if @_;
$self->{VALUE};
}
sub localize {
my $self = shift;
push @value_stack, $self->value ();
$self->undefine_value ();
}
sub restore {
my $self = shift;
die "no values to restore" unless @value_stack;
my $val = pop @value_stack;
$self->value ($val);
}
1;

[/READMORE]
-- stefan
betterworld
 2003-10-04 04:08
#57527 #57527
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=coax,28.09.2003, 06:34]Ich glaube verstanden zu haben was du moechtest :).[/quote]
Ich fuerchte Du hast unrecht. Trotzdem danke :)

Kabel: Dankeschoen... scheint wohl die einzige Moeglichkeit zu sein. Allerdings verstehe ich nicht so ganz, wozu Du den Singleton da brauchst\n\n

<!--EDIT|betterworld|1065226167-->
kabel
 2003-10-06 01:46
#57528 #57528
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
Quote
Kann ich irgendwie sagen, dass ich alle Versionen der Variable, also das original sowie die Importe in allen importierenden Paketen beeinflussen will?


CSLocal->instance wird immer dieselbe referenz zurückliefern => alle versionen der variable gibt es nicht, es gibt genau eine version, die damit gewünscht beeinflussbar ist.

ansonsten werde ich auch aus dem ersten posting nicht schlau. sorry. ???
-- stefan
betterworld
 2003-10-06 02:42
#57529 #57529
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Wenn man aber eh den Wert ueber eine Funktion holt, bekommt man ja immer denselben. Das hier muesste eigentlich auch funktionieren:
(Hab es jetzt nicht ausgetestet, daher habe ich mich nach Murphy irgendwo verschrieben.)
[quote=kabel,28.09.2003, 12:11]Zitat (abgeaendert)
Quote
$> perl
CSLocal::value (42);
CSLocal::localize ();
CSLocal::value ("blubber di blah");
print "value is [", CSLocal::value (), "]\n";
CSLocal::restore ();
print "after restore [", CSLocal::value (), "]\n";

value is [blubber di blah]
after restore [42]
$>

CSLocal.pm
[READMORE] # damn it! 8)
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package CSLocal;
my $VALUE;
use strict;
my @value_stack = ();
sub undefine_value { undef $VALUE; }
sub value {
       $VALUE = $_[0] if @_;
}
sub localize {
       push @value_stack, value ();
       undefine_value ();
}
sub restore {
       die "no values to restore" unless @value_stack;
       my $val = pop @value_stack;
       value ($val);
}
1;

[/READMORE][/quote]\n\n

<!--EDIT|betterworld|1065393845-->
kabel
 2003-10-06 10:57
#57530 #57530
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
nö, nicht verschrieben, value () sollte nur was sinnvolles zurückliefern ... ;)
ob dus nun so machst oder anders, ist geschmackssache.
mir gefällt das direkte aufrufen über packages weniger gut.
-- stefan
betterworld
 2003-11-30 06:39
#57531 #57531
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=betterworld,04.10.2003, 02:08][quote=coax,28.09.2003, 06:34]Ich glaube verstanden zu haben was du moechtest :).[/quote]
Ich fuerchte Du hast unrecht. Trotzdem danke :)[/quote]
Entschuldige bitte. Du hattest Recht
coax
 2003-12-01 00:05
#57532 #57532
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
[quote=betterworld,30.11.2003, 05:39][quote=betterworld,04.10.2003, 02:08][quote=coax,28.09.2003, 06:34]Ich glaube verstanden zu haben was du moechtest :).[/quote]
Ich fuerchte Du hast unrecht. Trotzdem danke :)[/quote]
Entschuldige bitte. Du hattest Recht[/quote]
kein Problem ;)
,,Das perlt aber heute wieder...'' -- Dittsche
betterworld
 2003-12-01 15:37
#57533 #57533
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Es schien mir nur zuerst etwas abstrus, wo die Verbindung zwischen Typeglobs und Exporter ist. Nun kam mir vorgestern die Erleuchtung, nachdem ich mich damit beschaeftigt hatte, wie Exporter intern arbeitet.
Es ist zwar klar, woran es (wahrscheinlich) liegt, dass typ-bezogene Aliase oder Importe nicht mit local funktionieren (naemlich an den perlinternen Datenstrukturen), aber trotzdem wuerde ich das durchaus schon als Bug bezeichnen. Was meinst Du dazu?
<< >> 10 Einträge, 1 Seite



View all threads created 2003-09-27 20:21.