Schrift
[thread]6902[/thread]

Variable deklarieren (oder auch nicht): "strict 'vars'" dynamisch?



<< >> 7 Einträge, 1 Seite
pKai
 2005-04-17 21:12
#53889 #53889
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Hallo,
ist es möglich unter "use strict" dynamisch instanzierte Variablen direkt zu verwenden?
Das beste, was ich dazu bisher hinbekommen habe ist folgendes:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
use strict;
use warnings;

use Data::Dumper ();
use Constraints::Variable;
use Constraints::Rule;

Constraints::Rule::make(); # hier wird eine Var. Q erzeugt

print Data::Dumper::Dumper(\$::Q); # so geht's
no strict qw(vars);
print Data::Dumper::Dumper(\$Q); # wäre ohne 'no strict' ein Fehler

Hinter den Kulissen läuft dabei folgendes ab:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package Constraints::Rule;

use strict;
use warnings;

use Constraints::Variable;

sub make {
my $V = Constraints::Variable->new('Q', 'abc');
$V->useit('Q');

$::Q = $V;
}
1;

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package Constraints::Variable;

use strict;
use warnings;

sub new {
my $class = shift;
my ($name, $value) = @_;
bless {
-Name => $name,
-Value => $value,
}, $class;
}

sub useit {
my $class = shift;
my $varname = shift;
no strict qw(refs);

*{'main::'.$varname} = *{'Constraints::_AUTOVARS::'.$varname};
#eval qq{
# package main;
# use vars qw(\$$varname);
#}
# Das use-vars-eval schein kein Unterschied zu machen
}
1;

Der praktische Nutzen ist natürlich gering.
Ich hatte gedacht, bei meiner angedachten Constraints-Maschine die Regeln/Variablen aus einer eingelesenen Spezifikation zu erzeugen (ist auch kein Problem und weniger schreibaufwändig als direkt die Objektmethoden hinzuschreiben) und dann bei der weiteren Demonstration im Skript (Variablen umsetzten, Berechnungen auslösen) die Methodenaufrufe direkt zu verwenden und dabei die Objekte bei Ihren "natürlichen" Namen zu benennen.
CGI.pm kennt mit &import_names ja was ähnliches, aber da muss der Namensraum ebenfalls explizit angegeben werden.
Naja, ist wahrscheinlich besser gleich das komplette Interface zu der Constraints-Maschine von den Perl-Interna abzukoppeln ;)\n\n

<!--EDIT|pKai|1113758020-->
I sense a soul in search of answers.
ptk
 2005-04-18 12:39
#53890 #53890
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=pKai,17.04.2005, 19:12]ist es möglich unter "use strict" dynamisch instanzierte Variablen direkt zu verwenden?[/quote]
Man kann doch "use vars (...)" verwenden.
pKai
 2005-04-18 14:30
#53891 #53891
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Hat bei mir (siehe Kommentare im letzten CODE-Schnipsel ganz unten) nicht das bewirkt, was ich mir davon versprochen hatte.
Mit einem "statischen" "use vars" im main-Kontext geht's - keine Frage. (z. B: Parse/RecDescent.pm am Ende der Datei)
I sense a soul in search of answers.
ptk
 2005-04-18 15:16
#53892 #53892
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
"use vars" muss zur Compilezeit ausgefuehrt werden. D.h. man muesste das Array fuer "use vars" vorher (z.B. in einem BEGIN-Block) berechnen und koennte das Array dann fuer "use vars" verwenden.
pKai
 2005-04-18 15:41
#53893 #53893
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Also sollte ich das, was ich mit "dynamisch" in meiner Ursprungsfrage ausdrücken wollte, mit "nach abgeschlossener Kompilierung" neu formulieren... ;)
I sense a soul in search of answers.
ptk
 2005-04-19 01:20
#53894 #53894
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
"nach abgeschlossener Kompilierung" ist zu spaet, da perl die gesamte Datei bereits geparst und compiliert und alle strict-Fehler angemeckert hat.
pKai
 2005-04-19 14:44
#53895 #53895
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Yep, danke.
Damit ist mir der Unterschied von $Q und $::Q im Kontext von use strict;" klar geworden.
I sense a soul in search of answers.
<< >> 7 Einträge, 1 Seite



View all threads created 2005-04-17 21:12.