加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何在Perl中构建一个简单的菜单?

发布时间:2020-12-15 23:25:51 所属栏目:大数据 来源:网络整理
导读:我正在研究一个需要一些基本菜单功能的Perl脚本.最终我希望每个菜单都有几个选项,然后选择返回上一个菜单或退出. 例: 这是一个菜单: 选择1 选择2 返回上一级菜单 退出 选择一个选项: 我目前有一个菜单子程序来制作菜单,但没有功能允许它返回上一个菜单. s
我正在研究一个需要一些基本菜单功能的Perl脚本.最终我希望每个菜单都有几个选项,然后选择返回上一个菜单或退出.

例:

这是一个菜单:

>选择1
>选择2
>返回上一级菜单
>退出

选择一个选项:

我目前有一个菜单子程序来制作菜单,但没有功能允许它返回上一个菜单.

sub menu
    {
        for (;;) {
            print "--------------------n";
            print "$_[0]n";
            print "--------------------n";
            for (my $i = 0; $i < scalar(@{ $_[1]}); $i++) {
                print $i + 1,".t ${ $_[1] }[$i]n";
            }
            print "n?: ";
            my $i = <STDIN>; chomp $i;
            if ($i && $i =~ m/[0-9]+/ && $i <= scalar(@{ $_[1]})) {
                return ${ $_[1] }[$i - 1];
            } else {
                print "nInvalid input.nn";
            }
        }
    }

    # Using the menu
    my $choice1  = menu('Menu1 header',@list_of_choices1);

    # I would like this menu to give the option to go back to
    # the first menu to change $choice1
    my $choice2 = menu('Menu2 header',@list_of_choices2);

我不想对所有菜单进行硬编码,并使用if / elsif语句进行所有处理,因此我将菜单转换为函数.

我的菜单目前看起来像这样……

菜单标题:

>选择1
>选择2
>选择3

?:(在此输入输入)

此解决方案仍然不允许用户返回上一个菜单或退出.我正在考虑制作一个菜单类来处理菜单,但我仍然不太喜欢面向对象的Perl.这是一个只有少量菜单的小程序,因此使用复杂的菜单构建模块可能有点过分.我想让我的代码尽可能轻松.

编辑:

感谢您的快速回复!但是仍然存在问题.当我从“Menu1”中选择一个选项并进入“Menu2”时,我希望从“Menu1”中保存选项供以后使用:

菜单1:

> Choice1< - 存储值,如果选择并转到下一个菜单
>选择2< - ...
>退出< - 退出
菜单2:

> Choice1< - 存储值,如果选择并转到下一个菜单
>选择2< - ...
>返回< - 返回上一级菜单重新选择值
>退出< - 退出
选择Choice1或Choice2应该在变量中存储一个值供以后使用,并进入下一个菜单.然后,如果您选择从Menu2返回第一个菜单,它将为您提供重新选择并重新定义变量的选项.我试图避免使用全局变量,这使得这非常困难.

在完成所有菜单并设置所有这些变量的值之后,我想运行一个子程序来处理所有选项并打印最终输出.

sub main () {

   # DO MENU STUFF HERE

   # PROCESS RESULTS FROM MENU CHOICES
   my $output = process($menu1_choice,$menu2_choice,$menu3_choice,... );
 }

此外,如果任何人使用类或其他数据结构有一个面向对象的方法,虽然它可能是矫枉过正,我仍然希望看到它,并试图绕过这个想法!

解决方法

您可以使用诸如 Term::Choose之类的模块:

use Term::Choose qw( choose );

my $submenus = {
    menu1 => [ qw( s_1 s_2 s_3 ) ],menu2 => [ qw( s_4 s_5 s_6 s_7) ],menu3 => [ qw( s_8 s_9 ) ],};
my @menus = ( qw( menu1 menu2 menu3 ) );
my $mm = 0;
MAIN: while ( 1 ) {
    my $i = choose( 
        [ undef,@menus ],{ layout => 3,undef => 'quit',index => 1,default => $mm }
    );
    last if ! $i;
    if ( $mm == $i ) {
        $mm = 0;
        next MAIN;
    }
    else {
        $mm = $i;
    }
    $i--;
    SUB: while ( 1 ) {
        my $choice = choose(
            [ undef,@{$submenus->{$menus[$i]}} ],undef => 'back' }
        );
        last SUB if ! defined $choice;
        say "choice: $choice";
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读