Schrift
[thread]12803[/thread]

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

Leser: 2


<< >> 3 Einträge, 1 Seite
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?
betterworld
 2008-11-21 23:51
#116518 #116518
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Nach eval sollte man immer $@ überprüfen.

Da steht eine Fehlermeldung drin, denn Dein Code konnte nicht ausgeführt werden, weil man unter strict halt nicht so einfach globale Variablen erzeugen kann.

Übrigens solltest Du auf Deine Widgets noch pack oder sowas aufrufen.
FoolAck
 2008-11-22 01:26
#116520 #116520
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Arg, da hätt ich auch drauf kommen können, naja.
Stimmt, "warn $@ if $@" stand noch irgendwie auf der todo-Liste im Hinterkopf, und das ich das strict in des kleineren Testskripts weggelassen hab war einfach Tippfaulheit.

Ge->pack()ed werden die widgets, hatte ich nur vergessen zu pasten.
Danke vielmals.
<< >> 3 Einträge, 1 Seite



View all threads created 2008-11-21 23:10.