How can I build a simple menu in Perl?

前端 未结 6 1113
野的像风
野的像风 2020-12-11 20:23

I\'m working on a Perl script that requires some basic menu functionality. Ultimately I would like each menu to have a few options and then the option to either return to th

6条回答
  •  星月不相逢
    2020-12-11 21:03

    Thanks everyone for the responses! All three of the responses were helpful in finally coming up with my solution. I decided to go with the Term::Choose module, (Thanks sid_com for the idea). My menu structure was different than you had originally suggested and it took quite a while of scratching my head to figure out how to make it do exactly what I wanted. Hopefully this solution will help someone else out who encounters a similar problem.

    I constructed the menu as shown below:

    (I have replaced my variables with more general names so it is easier to follow)

        #!/usr/bin/perl
    
        use strict;
        use warnings;
        use Term::Choose qw(choose);
    
        my @CHOICES1 = ('A','B','C');
        my @CHOICES2 = ('1','2','3');
        my @CHOICES3 = ('BLUE','YELLOW','GREEN');
    
        # function to use the choices
        sub some_function {
            print "THIS IS SOME FUNCTION!\n";
            print "Choice 1 is $_[0]\n";
            print "Choice 2 is $_[1]\n";
            print "Choice 3 is $_[2]\n";
            print "Have a nice day! :)\n";
        }
    
        sub main() {
    
            # clear the screen
            # (for some reason the build in screen clear 
            # for the module was not working for me)
            system ('cls');
    
            # create menu object
            my $menu = new Term::Choose();
    
            # menu 1
            for (;;) {
                my $choice1 = $menu->choose(
                    [@CHOICES1, undef],
                    {
                        prompt => 'Select a choice1:',
                        undef  => 'Exit',
                        layout => 3,
                    }
                );
                last if ! $choice1;
    
                # submenu 1
                for (;;) {
                    my $choice2 = $menu->choose(
                        [@CHOICES2, undef],
                        {
                            prompt => 'Select a choice2:',
                            undef  => 'Back',
                            layout => 3,
                        }
                    );
                    last if ! $choice2;
    
                    # submenu2
                    for (;;) {
                        my $choice3 = $menu->choose(
                            [@CHOICES3, undef],
                            {
                                 prompt => 'Select a choice3:',
                                undef  => 'Back',
                                layout => 3,
                            }
                        );
                        last if ! $choice3;
    
                        # function operating on all choices
                        some_function($choice1, $choice2, $choice3);
                        return;
                    }
                }
            }
        }
    
        main();
    

    I'm still very new to object oriented Perl so this took a very long time to figure out and it might not be perfect, but it gets the job done. Let me know if you have any ideas or improvements!

提交回复
热议问题