in reply to perlref repeats last of array

I suspect that you have have an extra key to the "Memory" value. A diagnostic print keys %choices; will tell.

Do you realize you're using symbolic references to code? use strict; would have told you that. Here's one cure:

my %choices = ( 'File Systems' => \&fs_sub, 'Memory' => \&mem_sub ); for (keys %choices) { $choice_menu->command( -label => $_, -activebackground => '#CCCCCC', -command => $choices{$_}); }

Update: Your code from the reply works here without doubling the Memory line. So does the modified code I suggested. I wonder if Tk says no strict 'refs'; somewhere?

After Compline,
Zaxo

Replies are listed 'Best First'.
Re: Re: perlref repeats last of array
by Kickstart (Pilgrim) on Nov 26, 2001 at 12:21 UTC
    I tried exactly that and I got reference errors. It's very confusing, but the code I posted works fine with 'use strict'. Here is the complete code so far. You are the second person to tell me that it won't work under use strict, but it does here.
    #!/usr/bin/perl -w use strict; use Tk; use diagnostics; # Just for testing my $wintitle = 'TkSysinfo'; my %choices = ( 'fs_sub' => 'File Systems', 'mem_sub' => 'Memory' ); my $mw = MainWindow->new; $mw->title("$wintitle"); $mw->minsize(600, 400); $mw->configure(-background => '#AAAAAA'); my $menus = $mw->Frame(-relief => 'groove', -borderwidth => 3, -background => '#EEEEEE' )->pack(-side => 'top', -fill => 'x'); my $choice_menu = $menus->Menubutton(-text => 'Choose Info', -background => '#EEEEEE', -activebackground => '#EEEEEE', -foreground => '#000000', )->pack(-side => 'left'); foreach (keys(%choices)) { $choice_menu->command(-label => $choices{$_}, -activebackground => '#CCCCCC', -command => \&$_); } # EXIT $choice_menu->separator; $choice_menu->command(-label => 'Exit', -activebackground => '#CCCCCC', -command => sub{$mw->destroy}); # Define updates to main window sub fs_sub{}; sub mem_sub{}; MainLoop;

    Kickstart

      Well, regarding our converstaion in chat about the gratuitious use of symrefs and a better way. The simplest solution is to reverse your hash:
      my %choices = ( 'File Systems' => \&fs_sub, 'Memory' => \&mem_sub ); foreach (keys(%choices)) { $choice_menu->command(-label => $_, -activebackground => '#CCCCCC', -command => %choices{$_}); }
      Now its easy to see what you are doing (providing a disptach table) and its no less code or stress.

      HTH

      Yves / DeMerphq
      --
      Have you registered your Name Space?