Thread Variable deklarieren (oder auch nicht): "strict 'vars'" dynamisch? (6 answers)
Opened by pKai at 2005-04-17 21:12

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.

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