Thread variable sub auf Tk button (4 answers)
Opened by Kalle at 2009-08-28 00:47

LanX-
 2009-08-28 01:18
#125040 #125040
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Lesestoff: http://perldoc.perl.org/perlref.html#Using-Referen...


Code (perl): (dl )
1
2
3
4
5
6
7
8
create_input_window('Test1',\&testsub1);  #übergebe Referenz eines benannten Subs
create_input_window('Test2',\&testsub2);

#...
#  my $subtoexecute = sub{testsub1($mw_edit->get('1.0', 'end'))}; # <-- wie 
# kann man hier testsub1 durch die Variable $thissub ersetzen ?

my $subtoexecute = sub{ $thissub->($mw_edit->get('1.0', 'end') ) };


die Frage ist ob du die Subs überhaupt extra benennen musst oder nicht gleich unbenannt auf Scalare legst, also

Code (perl): (dl )
1
2
my $testsub1=sub {...};
create_input_window('Test1',$testsub1);


mit einer Dispatchtable würdest du dann den Schritt vom Scalar zum Hashelement machen, was bei vielen "gleichartigen" Subs Sinn ergibt!

Code (perl): (dl )
1
2
$table{testsub1}=sub {...};
create_input_window('Test1',$table{testsub1});


oder auch äquivalent

Code (perl): (dl )
1
2
3
4
%table=( testsub1 => sub {...}, 
         testsub2 => sub {...}, 
         ...
       );


UPDATE: denn mit einer dispatchtable kannst du jetzt hergehen und statt eines coderefs wieder nur einen String resp. Key an create_input_window() übergeben und dort wird intern %table ausgelesen

Code (perl): (dl )
1
2
3
create_input_window('Test1','testsub1');
#...
  my $subtoexecute = sub{ $table{$thissub}->($mw_edit->get('1.0', 'end') ) };


die Frage ist dann nämlich ob es nicht einfach reicht nur den Titel als Key zu nehmen:

Code (perl): (dl )
1
2
3
4
5
6
my $table{Test1}=sub {...};

create_input_window('Test1');

#...
   my $subtoexecute = sub{ $table{$title}->($mw_edit->get('1.0', 'end') ) };


... noch schlanker und eleganter gehts dann kaum noch! 8)

PS: Wenn ich jetzt einen Post-Titel setzen könnte wärs "Ode an die Dispatchtabelle" ;-)
Last edited: 2009-08-28 02:14:38 +0200 (CEST)

View full thread variable sub auf Tk button