in reply to Re: Calling subroutine with \& and passing variables
in thread Calling subrutine with \& and passing variables

Thank you for your suggestions. But I had already tried both your solutions and they did not work. See the following - code which I slighly modified to use your proposed solution \&subname, arg1, arg2, .. . PS: the code should print in the subrutine the variable $SomeVariable.

#!/usr/local/bin/perl -w use Tk; use Tk::DropSite; use strict; use vars qw($top $drop); $top = new MainWindow; $top->Label(-text => "The drop area:")->pack; $drop = $top->Scrolled('Listbox', -scrollbars => "osoe", )->pack; my $SomeVariable="xxx"; # The variable I want to pass to the subrutine $drop->DropSite (-dropcommand => [\&accept_drop, $drop, $SomeVariable], -droptypes => ($^O eq 'MSWin32' ? 'Win32' : ['KDE', 'XDND', 'Sun']) ); MainLoop; sub accept_drop { my($widget, $selection, $SomeVariable) = @_; print $SomeVariable;#printing the variable passed from the main my $filename; eval { if ($^O eq 'MSWin32') { $filename = $widget->SelectionGet(-selection => $selection, 'STRING'); } else { $filename = $widget->SelectionGet(-selection => $selection, 'FILE_NAME'); } }; if (defined $filename) { $widget->insert(0, $filename); } } __END__

Replies are listed 'Best First'.
Re^3: Calling subroutine with \& and passing variables
by IB2017 (Pilgrim) on Oct 29, 2017 at 11:11 UTC

    Of course it works! It was the order of the passed variables that was wrong! For the sake of it, here it is the working code.

    #!/usr/local/bin/perl -w use Tk; use Tk::DropSite; use strict; use vars qw($top $drop); $top = new MainWindow; $top->Label(-text => "The drop area:")->pack; $drop = $top->Scrolled('Listbox', -scrollbars => "osoe", )->pack; my $SomeVariable="xxx"; $drop->DropSite (-dropcommand => [\&accept_drop, $drop, $SomeVariable], -droptypes => ($^O eq 'MSWin32' ? 'Win32' : ['KDE', 'XDND', 'Sun']) ); MainLoop; sub accept_drop { my ($drop, $SomeVariable, $selection) = @_; print "This is my variable passed from the main: $SomeVariable\n"; my $filename; eval { if ($^O eq 'MSWin32') { $filename = $drop->SelectionGet(-selection => $selection, 'STRING'); } else { $filename = $drop->SelectionGet(-selection => $selection, 'FILE_NAME'); } }; if (defined $filename) { $drop->insert(0, $filename); } } __END__