Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

Re: Simple text menu

by Aristotle (Chancellor)
on Dec 29, 2002 at 01:19 UTC ( [id://222833]=note: print w/replies, xml ) Need Help??


in reply to Simple text menu

Along the lines of Juerd's code, but with implicit recursion and much less array index math (which I hate with a passion):
sub menu { my ($title, @option) = @{ shift }; my (@name, @action); ($name[@name], $action[@action]) = splice @option, 0, 2 while @option; while(1) { print "\n$title\n"; print map "$_. $name[$_ - 1]\n", 1 .. @name; print '> '; chomp (my $choice = readline *STDIN); if ($choice and $choice > 0 and $choice <= @action) { my $do_action = $action[$choice]; return unless defined $do_action; $do_action->() if 'CODE' eq ref $action; $menu($action) if 'ARRAY' eq ref $action; require Carp; Carp::croak "I don't know what to do with $action"; } else { print "Invalid choice: $choice\n" } } }
Now you can still very similarly say
#!/usr/bin/perl -w use strict; sub foo { print "FOO!\n" } sub bar { print "BAR!\n" } sub menu { ... } my ($mainmenu, $submenu); $submenu = [ 'Submenu', 'Bar', => \&bar, 'Back to previous menu' => undef, ]; $mainmenu = [ 'Main menu', 'Foo' => \&foo, 'Submenu...' => $submenu, 'Exit' => undef, ]; menu($mainmenu);
but you can also much more concisely say
menu([ 'Main menu', 'Foo' => \&foo, 'Submenu...' => [ 'Submenu', 'Bar', => \&bar, 'Back to previous menu' => undef, ], 'Exit' => undef, ]);

Makeshifts last the longest.

Replies are listed 'Best First'.
Re^2: Simple text menu
by Mutector (Acolyte) on Aug 08, 2012 at 13:54 UTC
    I think the subroutine is not entirely correct. Without te Carp which I don't have on my system I came up with this working version:
    sub menu { my ($title, @option) = @{shift(@_)}; my (@name, @action); ($name[@name], $action[@action]) = splice @option, 0, 2 while @option; while(1) { print "\n$title\n"; print map "$_. $name[$_ - 1]\n", 1 .. @name; print '> '; chomp (my $choice = readline *STDIN); if ($choice and $choice > 0 and $choice <= @action) { my $do_action = $action[$choice-1]; return unless defined $do_action; $do_action->() if 'CODE' eq ref $action[$choice-1]; menu($action[$choice-1]) if 'ARRAY' eq ref $action[$choice-1]; + } else { print "Invalid choice: $choice\n" } } }
      Carp which I don't have on my system

      Are you sure? What happens when you type:

      perl -MCarp -e0
      Carp is standard. If you don't have it, your perl installation is seriously b0rken.

        My mistake. It is there all right. I jumped to the wrong conclusion because it gave an error when trying the script.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://222833]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others exploiting the Monastery: (7)
As of 2024-04-23 14:31 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found