Thread Kann im Tk-bind Callback keine Variablen per eval "erstellen" (2 answers)
Opened by FoolAck at 2008-11-21 23:10

FoolAck
 2008-11-21 23:10
#116516 #116516
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Moin, ich hab mir folgendes kleines Tk eval Script geschrieben, aber ich kann irgendwie keine neuen Variablen erstellen:
Code (perl): (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
28
29
30
31
32
33
34
35
36
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
use Tk;

local $Data::Dumper::Indent = 0;
my $mw = MainWindow->new(-title => "Tk / Eval");

my $expr   = '';
my $input  = $mw->Entry(-width => 50, -textvariable => \$expr);
my $output = $mw->Listbox(-width => 50, -height => 15);

my $data = {
    mw      => $mw,
    input   => $input,
    output  => $output,
    expr    => \$expr,
};

$input->bind('<Return>', [\&evalCode, $data]);

MainLoop();


sub evalCode {
    my (undef, $data) = @_;
    my $retval = eval ${$data->{expr}};
    ${$data->{expr}} = '';

    my $dumped = Dumper $retval;
    $dumped =~ s/^\$VAR\d+ = //;

    $data->{output}->insert("end", $dumped);
    return;
}

Wenn ich nun etwas wie '@foo = qw/a b c/' oder ähnliches eingebe, was eine (globale) Variable ins Leben rufen würde, gibt eval immer undef zurück. Die Zuweisung funktioniert also nicht. Sie funktioniert allerdings, wenn ich irgendwo am Anfang des Scripts ein paar dummy Variablen mit my deklariere. Wenn ich zum Beispiel in Zeile 13 'my @foo' hinzufüge, funktioniert es. (Dann natürlich nur für @foo)

Seltsam schmeltsam, kann Jemand sehen was ich hier falsch mache? Ich komm nicht drauf.

Das hier funktioniert komischerweise:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
use Data::Dumper;
use Tk;
my $mw = MainWindow->new()->bind('<Return>', [\&foo]);
  
MainLoop();

sub foo {
    my $retval = eval '%h = (foo => q{bar}); \%h';
    print Dumper $retval;
}


Das hier funktioniert ebenfalls:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
use Data::Dumper;
use Tk;

my $foo = '%h = (foo => q{bar}); \%h';
my $mw = MainWindow->new()->bind('<Return>', [\&foo, $foo]);
  
MainLoop();

sub foo {
    my (undef, $foo) = @_;  
    my $retval = eval $foo;
    print Dumper $retval;
}


Suggestions?

View full thread Kann im Tk-bind Callback keine Variablen per eval "erstellen"