Term-Menus

 view release on metacpan or  search on metacpan

README  view on Meta::CPAN

    Term::Menus is cross platform compatible.

    Term::Menus was initially conceived and designed to work seemlessly with
    the perl based Network Process Automation Utility Module called
    Net::FullAuto (Available in CPAN :-) - however, it is not itself
    dependant on other Net::FullAuto components, and will work with *any*
    perl script/application.

    Reasons to use this module are:

    * You have a list (or array) of items, and wish to present the user a
      simple CMD enviroment menu to pick a single item and return that item
      as a scalar (or simple string). Example:

         use Term::Menus;

         my @list=('First Item','Second Item','Third Item');
         my $banner="  Please Pick an Item:";
         my $selection=&pick(\@list,$banner);
         print "SELECTION = $selection\n";

      The user sees ==>

         Please Pick an Item:

             1      First Item
             2      Second Item
             3      Third Item

         (Press [F1] for HELP)

         ([ESC] to Quit)   PLEASE ENTER A CHOICE:

      --< 2 >-<ENTER>----------------------------------

      The user sees ==>

         SELECTION = Second Item

    * You have a large list of items and need scrolling capability:

         use Term::Menus;

         my @list=`ls -1 /bin`;
         my $banner="   Please Pick an Item:";
         my $selection=&pick(\@list,$banner);
         print "SELECTION = $selection\n";

      The user sees ==>

         Please Pick an Item:

             1      arch
             2      ash
             3      awk
             4      basename
             5      bash
             6      cat
             7      chgrp
             8      chmod
             9      chown
             10     cp

         a.  Select All   f.  FINISH
                             ___
         93 Total Choices   |_v_| Scroll with ARROW keys   [F1] for HELP

         ([ESC] to Quit)   PLEASE ENTER A CHOICE:

      --<ENTER>--------------------------------------

         Please Pick an Item:

             11      cpio
             12      csh
             13      cut
             14      date
             15      dd
             16      df
             17      echo
             18      ed
             19      egrep
             20      env

         a.  Select All   f.  FINISH
                              ___
         93  Total Choices   |_v_| Scroll with ARROW keys   [F1] for HELP

         ([ESC] to Quit)   PLEASE ENTER A CHOICE:

      --< 14 >-<ENTER>----------------------------------

      The user sees ==>

         SELECTION = date

    * You need to select multiple items and return the selected list:

         use Term::Menus;

         my %Menu_1=(

            Item_1 => {

               Text    => "/bin Utility - ]Convey[",
               Convey  => [ `ls -1 /bin` ],

            },

            Select => 'Many',
            Banner => "\n   Choose a /bin Utility :"
         );

         my @selections=&Menu(\%Menu_1);
         print "SELECTIONS = @selections\n";

      The user sees ==>

         Choose a /bin Utility :

             1      /bin Utility - arch
             2      /bin Utility - ash
             3      /bin Utility - awk
             4      /bin Utility - basename
             5      /bin Utility - bash
             6      /bin Utility - cat
             7      /bin Utility - chgrp
             8      /bin Utility - chmod
             9      /bin Utility - chown
             10     /bin Utility - cp

         a.  Select All   c.  Clear All   f.  FINISH
                             ___
         93 Total Choices   |_v_| Scroll with ARROW keys   [F1] for HELP

         ([ESC] to Quit)   PLEASE ENTER A CHOICE:

      --< 3 >-<ENTER>----------------------------------

      --< 7 >-<ENTER>----------------------------------

      The user sees ==>

         Choose a /bin Utility :

             1      /bin Utility - arch
             2      /bin Utility - ash
          *  3      /bin Utility - awk
             4      /bin Utility - basename
             5      /bin Utility - bash
             6      /bin Utility - cat
          *  7      /bin Utility - chgrp
             8      /bin Utility - chmod
             9      /bin Utility - chown
             10     /bin Utility - cp

         a.  Select All   c.  Clear All   f.  FINISH
                             ___
         93 Total Choices   |_v_| Scroll with ARROW keys   [F1] for HELP

         ([ESC] to Quit)   PLEASE ENTER A CHOICE:

      --< f >-<ENTER>----------------------------------

      The user sees ==>

         SELECTIONS = /bin Utility - awk /bin Utility - chgrp

    * You need sub-menus:

         use Term::Menus;

         my %Menu_2=(

            Name   => 'Menu_2',
            Item_1 => {

               Text   => "]Previous[ is a ]Convey[ Utility",
               Convey => [ 'Good','Bad' ]

            },

            Select => 'One',
            Banner => "\n   Choose an Answer :"
         );

         my %Menu_1=(

            Name   => 'Menu_1',
            Item_1 => {

               Text   => "/bin/Utility - ]Convey[",
               Convey => [ `ls -1 /bin` ],
               Result => \%Menu_2,

            },

            Select => 'One',
            Banner => "\n   Choose a /bin Utility :"
         );

         my $selection=&Menu(\%Menu_1);
         print "\n   SELECTION=$selection\n";

      The user sees ==>

         Choose a /bin Utility :

            1.        /bin Utility - arch
            2.        /bin Utility - ash
            3.        /bin Utility - awk
            4.        /bin Utility - basename
            5.        /bin Utility - bash
            6.        /bin Utility - cat
            7.        /bin Utility - chgrp
            8.        /bin Utility - chmod
            9.        /bin Utility - chown
            10.       /bin Utility - cp

         a.  Select All   c.  Clear All   f.   FINISH
                             ___
         93 Total Choices   |_v_| Scroll with ARROW keys   [F1] for HELP

         ([ESC] to Quit)   PLEASE ENTER A CHOICE:

      --< 5 >-<ENTER>----------------------------------

         Choose an Answer :

             1      bash is a Good Utility
             2      bash is a Bad Utility

         (Press [F1] for HELP)

         ([ESC] to Quit)   PLEASE ENTER A CHOICE:

      --< 1 >-<ENTER>----------------------------------

      The user sees ==>

         SELECTIONS = bash is a Good Utility

    * You have a large amount of text, or instructional information, and
      want a *banner only screen* that displays the banner only (no
      selections) and that moves to the next screen/menu with just a press
      of the ENTER key. Yet, you want to preserve selections from earlier
      menus, and/or return to more menus after user completes reading the
      banner only screens. You can also navigate backwards and forwards
      through these screens.

         use Term::Menus:

         my %Menu_1=(

            Name   => 'Menu_1',
            Banner => "\n   This is a BANNER ONLY display."

         );

         &Menu(\%Menu_1);

      The user sees ==>

         This is a BANNER ONLY display.

         ([ESC] to Quit)   Press ENTER to continue ...

    * You want to use perl subroutines to create the text items and/or
      banner:

         use Term::Menus;

         sub create_items {

            my $previous=shift;
            my @textlines=();
            push @textlines, "$previous is a Good Utility";
            push @textlines, "$previous is a Bad Utility";
            return @textlines;
                   ## return value must be an array
                   ## NOT an array reference

         }

         sub create_banner {

            my $previous=shift;
            return "\n   Choose an Answer for $previous :"
                   ## return value MUST be a string for banner

         }

         my %Menu_2=(

            Name   => 'Menu_2',
            Item_1 => {

               Text   => "]Convey[",
               Convey => "create_items(]Previous[)",

            },

            Select => 'One',
            Banner => "create_banner(]Previous[)",

         );

         my %Menu_1=(

            Name   => 'Menu_1',
            Item_1 => {

               Text   => "/bin/Utility - ]Convey[",
               Convey => [ `ls -1 /bin` ],
               Result => \%Menu_2,

            },

            Select => 'One',
            Banner => "\n   Choose a /bin Utility :"
         );

         my @selection=&Menu(\%Menu_1);
         print "\n   SELECTION=@selection\n";

      The user sees ==>

         Choose a /bin Utility :

             1      /bin Utility - arch
             2      /bin Utility - ash
             3      /bin Utility - awk
             4      /bin Utility - basename
             5      /bin Utility - bash
             6      /bin Utility - cat
             7      /bin Utility - chgrp
             8      /bin Utility - chmod
             9      /bin Utility - chown
             10     /bin Utility - cp

         a.  Select All   c.  Clear All   f.  FINISH
                             ___
         93 Total Choices   |_v_| Scroll with ARROW keys   [F1] for HELP

         ([ESC] to Quit)   PLEASE ENTER A CHOICE:

      --< 5 >-<ENTER>----------------------------------

         Choose an Answer for bash :

             1      bash is a Good Utility
             2      bash is a Bad Utility

         (Press [F1] for HELP)

         ([ESC] to Quit)   PLEASE ENTER A CHOICE:

      --< 1 >-<ENTER>----------------------------------

      The user sees ==>

         SELECTION = bash is a Good Utility

    * You want to use anonymous subroutines to create the text items and/or
      banner (see the more detailed treatment of anonymous subroutines and
      Term::Menus macros in a later section of this documentation):

         use Term::Menus;

         my $create_items = sub {

            my $previous=shift;
            my @textlines=();
            push @textlines, "$previous is a Good Utility";
            push @textlines, "$previous is a Bad Utility";
            return \@textlines;
                   ## return value must an array reference

         };

         my $create_banner = sub {

            my $previous=shift;
            return "\n   Choose an Answer for ]Previous[ :"
                   ## return value MUST be a string for banner

         };

         my %Menu_2=(

            Name   => 'Menu_2',
            Item_1 => {

               Text   => "]Convey[",
               Convey => $create_items->(']Previous['), # Subroutine executed
                                                        # at runtime by Perl
                                                        # and result is passed
                                                        # to Term::Menus.

                                                        # Do not use this argument
                                                        # construct with Result =>
                                                        # elements because only Menu
                                                        # blocks or subroutines can
                                                        # be passed. (Unless the
                                                        # return item is itself
                                                        # a Menu configuration
                                                        # block [HASH] or an
                                                        # anonymous subroutine
                                                        # [CODE])

            },

            Select => 'One',
            Banner => $create_banner, # Perl passes sub itself at runtime and
                                      # execution is carried out by Term::Menus.

         );

         my %Menu_1=(

            Name   => 'Menu_1',
            Item_1 => {

               Text   => "/bin/Utility - ]Convey[",
               Convey => [ `ls -1 /bin` ],
               Result => \%Menu_2,

            },

            Select => 'One',
            Banner => "\n   Choose a /bin Utility :"
         );

         my @selection=&Menu(\%Menu_1);
         print "\n   SELECTION=@selection\n";

      The user sees ==>

         Choose a /bin Utility :

             1      /bin Utility - arch
             2      /bin Utility - ash
             3      /bin Utility - awk
             4      /bin Utility - basename
             5      /bin Utility - bash
             6      /bin Utility - cat
             7      /bin Utility - chgrp
             8      /bin Utility - chmod
             9      /bin Utility - chown
             10     /bin Utility - cp

         a.  Select All   c.  Clear All   f.  FINISH
                             ___
         93 Total Choices   |_v_| Scroll with ARROW keys   [F1] for HELP

         ([ESC] to Quit)   PLEASE ENTER A CHOICE:

      --< 5 >-<ENTER>----------------------------------

         Choose an Answer for bash :

             1      bash is a Good Utility
             2      bash is a Bad Utility

         (Press [F1] for HELP)

         ([ESC] to Quit)   PLEASE ENTER A CHOICE:

      --< 1 >-<ENTER>----------------------------------

      The user sees ==>

         SELECTION = bash is a Good Utility

    Usage questions should be directed to the Usenet newsgroup
    comp.lang.perl.modules.

    Contact me, Brian Kelly <Brian.Kelly@fullautosoftware.net>, if you find
    any bugs or have suggestions for improvements.

  What To Know Before Using

    * There are two methods available with Term::Menus - &pick() and
      &Menu(). "&Menu()" uses "&pick()" - you can get the same results using
      only "&Menu()". However, if you need to simply pick one item from a
      single list - use "&pick()". The syntax is simpler, and you'll write
      less code. ;-)

    * You'll need to be running at least Perl version 5.002 to use this
      module.

METHODS

    pick - create a simple menu
            $pick = &pick ($list|\@list|['list',...],[$Banner]);

        Where *$list* is a variable containing an array or list reference.
        This argument can also be a escaped array (sending a reference) or
        an anonymous array (which also sends a reference).

        *$Banner* is an optional argument sending a customized Banner to top
        the simple menu - giving instructions, descriptions, etc. The
        default is "Please Pick an Item:"

    Menu - create a complex Menu
            $pick  = &Menu ($list|\@list|['list',...],[$Banner]);

        Where *$pick* is a variable containing an array or list reference of
        the pick or picks.

README  view on Meta::CPAN

          See Item Configuration Macros below )

   Item Configuration Hash Structures

    Each Menu Item can have an independant configurtion. Each Menu
    Configuration Hash Structure consists of elements that define and
    control it's behavior, appearance, constitution and purpose. An
    element's syntax is as you would expect it to be in perl - a key string
    pointing to an assocaited value: key => value. The following items list
    supported key names and ther associated value types:

    *   Text => 'Char String consisting of ASCII Characters'

          The *Text* element provides a customized descriptive string for
          the Item. It is the text the user will see displayed, describing
          the selection.

             Text => 'This is Item_1',

    *   Convey => [ List ] --or-- @List --or-- $Scalar --or-- 'ASCII String'
        --or-- Anonymous Subroutine --or-- Subroutine Reference --or--
        Ordinary Subroutine (*Ordinary* subroutine calls need to be
        surrounded by quotes. DO NOT use quotes with anonymous subroutine
        calls or ones called with a reference!)

          The *Convey* element has a twofold purpose; it provides for the
          contents of the "]Convey[" macro, and defines or contains the
          string or result that is passed on to child menus - if any. Use of
          this configuration element is *optional*. If "Convey" is not a
          list, then it's value is passed onto child menus. If "Convey" *is*
          a list, then the Item selected is passed onto the children - if
          any. It is important to note, *when used*, that only the resulting
          *Convey* string - *NOT* the the Item "Text" value or string, is
          conveyed to child menus. When the "Convey" element is not used,
          the full Item "Text" value is conveyed to the children - if any.
          However, the full contents of the "Text" element is *returned* as
          the *Result* of the operation when the user completes all menu
          activity. See the *Macro* section below for more information.

             Convey => [ `ls -1` ],

          NOTE: When using anonymous subroutines or subroutine references,
          there may be situations where code populating the Convey item
          encounters an error or gets data that is empty or unsatisfactory
          for some reason, and there is a need to print a message or write
          to a log or send an alert, and then return from this routine to an
          earlier menu. To force a return to a parent menu (assuming there
          is one) from a subroutine assigned to a Convey element, just
          return '<' from the subroutine. To return to any ancestor Menu in
          the stack, return this macro from the subroutine: "{Menu_Name}<"
          :-)

    *   Default => 'Char String' --or-- Perl regular expression - qr/.../

          The *Default* element provides a means to pre-select certain
          elements, as if the items were selected by the user. This can be
          done with two constructs - simple string or pre-compiled regular
          expression. Note: The "Default" element is available only when the
          "Select" element is set to 'Many' - "Select =" 'Many',>

             Default => 'base|chown',

             Default => qr/base|chown/i,

          The user sees ==>

             Choose a /bin Utility :

                 1      /bin Utility - arch
                 2      /bin Utility - ash
                 3      /bin Utility - awk
              *  4      /bin Utility - basename
                 5      /bin Utility - bash
                 6      /bin Utility - cat
                 7      /bin Utility - chgrp
                 8      /bin Utility - chmod
              *  9      /bin Utility - chown
                 10     /bin Utility - cp

             a.  Select All   c.  Clear All   f.  FINISH
                                 ___
             93 Total Choices   |_v_| Scroll with ARROW keys   [F1] for HELP

             ([ESC] to Quit)   PLEASE ENTER A CHOICE:

    *   Select => 'One' --or-- 'Many'

          The ITEM LEVEL *Select* element provides a means to inform
          Term::Menus that the specific items of a single ITEM BLOCK (as
          opposed to full menu) are subject to multiple selecting - or just
          single selection. This is useful in particular for Directory Tree
          navigation - where files can be multi-selected (or tagged), yet
          when a directory is selectedi, it forces an immediate navigation
          and new menu - showing the contents of the just selected
          directory.

          NOTE: See the RECURSIVELY CALLED MENUS section for more
          information.

             Select => 'More',

          The user sees ==>

              d  1      bin
              d  2      blib
              d  3      dist
              d  4      inc
              d  5      lib
              d  6      Module
              d  7      t
                 8      briangreat2.txt
              *  9      ChangeLog
                 10     close.perl

             a.  Select All   f.  FINISH
                                 ___
             49 Total Choices   |_v_| Scroll with ARROW keys   [F1] for HELP

             ([ESC] to Quit)   PLEASE ENTER A CHOICE:

    *   Exclude => 'Char String' --or-- Perl regular expression - qr/.../

          The *Exclude* element provides a means to remove matching elements
          from the Menu seen by the user. This element is useful only when
          the "]Convey[" macro is used to populate items. This can be done
          with two constructs - simple string or pre-compiled regular
          expression.

             Exclude => 'base|chown',

             Exclude => qr/base|chown/i,

    *   Include => 'Char String' --or-- Perl regular expression - qr/.../

          The *Include* element provides a means to create items filtered
          from a larger list of potential items available via the "]Convey["
          macro. This element is useful only when the "]Convey[" macro is
          used to populate items. The "Exclude" element can be used in
          conjunction with "Include" to further refine the final list of
          items used to construct the menu. The "Include" element - when
          used - always takes presidence, and the "Exclude" will be used
          only on the "Include" filtered results. This element can be used
          with two value constructs - simple string or pre-compiled regular
          expression.

             Include => 'base|chown',

             Include => qr/base|chown/i,

    *   Result => \%Menu_2 --or -- "&any_method()",

        * *Result* is an *optional* element that also has two important
          uses:

        * For selecting the child menu next in the chain of operation and
          conveyance,

             Result => \%Menu_2,

          --or--

        * For building customized method arguements using "&Menu()"'s
          built-in macros.

        *
             Result => "&any_method($arg1,\"]Selected[\",\"]Previous[\")",

          NOTE: *ALWAYS* be sure to surround the subroutine or method
          calling syntax with DOUBLE QUOTES. (You can use single quotes if
          you don't want interpolation). Quotes are necessary because you're
          telling "&Menu()" - *not* Perl - what method you want invoked.
          "&Menu()" won't invoke the method until after all other processing
          - where Perl will try to invoke it the first time it encounters
          the line during runtime - lo----ng before a user gets a chance to
          see or do *anything*. BUT - be sure *NOT* to use quotes when
          assigning a child menu reference to the "Result" value.

          Again, *Result* is an *optional* element. The default behavior
          when "Result" is omitted from the Item Configuration element, is
          for the selection to be returned to the "&Menu()"'s calling
          script/module/app. If the "Select" element was set to 'One', then
          that item is returned regardless of whether the Perl structure
          receiving the output is an array or scalar. If there were multiple
          selections - i.e., "Select" is set to 'Many' - then, depending on
          what structure is set for receiving the output, will determine
          whether "&Menu()" returns a list (i.e. - array), or *reference* to
          an array.

   Item Configuration Macros

    Each Menu Item can utilize a very powerful set of configuration
    *Macros*. These constructs principally act as purveyors of information -
    from one menu to another, from one element to another. There are
    currently three available Macros:

    *   ]Convey[

          "]Convey[" is used in conjunction with the *Convey* element
          (described) earlier. It's purpose to "convey" or transport or
          carry a list item associated with the "Convey" element - and
          replace the "]Convey[" Macro in the "Text" element value with that
          list item. The *Convey* mechanism utilizing the "Convey" Macro is
          essentially an *Item multiplier*. The entire contents of the list
          associated with the *Convey* element will be turned into it's own
          "Item" when the menu is displayed. Both ordinary and anonymous
          subroutines can be use to dynamically generate *Convey* lists.
          (With *]Convey[*, macros can be used only as subroutine arguments
          or in the body of anonymous subroutines - see other examples.)

             use Term::Menus;

             my %Menu_1=(

                Name   => 'Menu_1',
                Item_1 => {

                   Text   => "/bin/Utility - ]Convey[",
                   Convey => [ `ls -1 /bin` ],
                   Result => \%Menu_2,

                },

                Select => 'One',
                Banner => "\n   Choose a /bin Utility :"
             );

             my @selections=&Menu(\%Menu_1);
             print "SELECTIONS=@selections\n";

          The user sees ==>

             Choose a /bin Utility :

                 1      /bin Utility - arch
                 2      /bin Utility - ash
                 3      /bin Utility - awk
                 4      /bin Utility - basename
                 5      /bin Utility - bash
                 6      /bin Utility - cat
                 7      /bin Utility - chgrp
                 8      /bin Utility - chmod
                 9      /bin Utility - chown
                 10     /bin Utility - cp

             a.  Select All   c.  Clear All   f.  FINISH
                                 ___
             93 Total Choices   |_v_| Scroll with ARROW keys   [F1] for HELP

             ([ESC] to Quit)   PLEASE ENTER A CHOICE:

          NOTE: "]C[" can be used as a shorthand for "]Convey[".

    *   ]Previous[

          "]Previous[" can be used in child menus. The "]Previous[" Macro
          contains the *Selection* of the parent menu. Unlike the "]Convey["
          Macro, the "]Previous[" Macro can be used in both the "Text"
          element value, and the "Result" element values (when constructing
          method calls):

          The "]Previous[" Macro can also be used in the Banner.

             use Term::Menus;

             my %Menu_2=(

                Name   => 'Menu_2',
                Item_1 => {

                   Text   => "]Previous[ is a ]Convey[ Utility",
                   Convey => [ 'Good','Bad' ]
                },

                Select => 'One',
                Banner => "\n   Choose an Answer :"
             );

             my %Menu_1=(

                Name   => 'Menu_1',
                Item_1 => {

                   Text   => "/bin/Utility - ]Convey[",
                   Convey => [ `ls -1 /bin` ],
                   Result => \%Menu_2,

                },

                Select => 'One',
                Banner => "\n   Choose a /bin Utility :"
             );

             my @selections=&Menu(\%Menu_1);
             print "SELECTIONS=@selections\n";

          The user sees ==>

             Choose a /bin Utility :

                 1      /bin Utility - arch
                 2      /bin Utility - ash
                 3      /bin Utility - awk
                 4      /bin Utility - basename
                 5      /bin Utility - bash
                 6      /bin Utility - cat
                 7      /bin Utility - chgrp
                 8      /bin Utility - chmod
                 9      /bin Utility - chown
                 10     /bin Utility - cp

             a.  Select All   c.  Clear All   f.  FINISH

             93 Total Choices   |_v_| Scroll with ARROW keys   [F1] for HELP

             ([ESC] to Quit)   PLEASE ENTER A CHOICE:

          --< 5 >-<ENTER>----------------------------------

             Choose an Answer :

                 1      bash is a Good Utility
                 2      bash is a Bad Utility

             (Press [F1] for HELP)

             ([ESC] to Quit)   PLEASE ENTER A CHOICE:

          --< 1 >-<ENTER>----------------------------------

          The user sees ==>

             SELECTIONS = bash is a Good Utility

          NOTE: "]P[" can be used as a shorthand for "]Previous[".

    *   ]Previous[{ <*Menu_Name*> } i.e. Explicit Named Macro

          "]Previous[{Menu_Name}" (i.e. Explicit Named Macros) can be used
          in child menus. The "]Previous[{Menu_Name}" Macro contains the
          *Selection* of any preceding menu specified with the "Menu_Name"
          string. The "]Previous[{Menu_Name}" follows the same conventions
          as the "]Previous[" Macro - but enables access to the selection of
          i<any> preceding menu. This is very useful for Menu trees more
          than two levels deep.

          The "]Previous[{Menu_Name}" Macro can also be used in the Banner.

             use Term::Menus;

             my %Menu_3=(

                Name   => 'Menu_3',
                Item_1 => {

                   Text   => "]Convey[ said ]P[{Menu_1} is a ]Previous[ Utility!",
                   Convey => [ 'Bob','Mary' ]
                },

                Select => 'One',
                Banner => "\n   Who commented on ]Previous[{Menu_1}? :"
             );

             my %Menu_2=(

                Name   => 'Menu_2',
                Item_1 => {

                   Text   => "]Previous[ is a ]C[ Utility",
                   Convey => [ 'Good','Bad' ],
                   Result => \%Menu_3,
                },

                Select => 'One',
                Banner => "\n   Is ]P[ Good or Bad? :"
             );

             my %Menu_1=(

                Name   => 'Menu_1',
                Item_1 => {

                   Text   => "/bin/Utility - ]Convey[",
                   Convey => [ `ls -1 /bin` ],
                   Result => \%Menu_2,

                },

                Select => 'One',
                Banner => "\n   Choose a /bin Utility :"
             );

             my @selections=&Menu(\%Menu_1);
             print "SELECTIONS=@selections\n";

          The user sees ==>

             Choose a /bin Utility :

                 1      /bin Utility - arch
                 2      /bin Utility - ash
                 3      /bin Utility - awk
                 4      /bin Utility - basename
                 5      /bin Utility - bash
                 6      /bin Utility - cat
                 7      /bin Utility - chgrp
                 8      /bin Utility - chmod
                 9      /bin Utility - chown
                 10     /bin Utility - cp

             ([ESC] to Quit)   PLEASE ENTER A CHOICE:

          --< 5 >-<ENTER>----------------------------------

             Is bash Good or Bad? :

                 1      bash is a Good Utility
                 2      bash is a Bad Utility

             (Press [F1] for HELP)

             ([ESC] to Quit)   PLEASE ENTER A CHOICE:

          --< 1 >-<ENTER>----------------------------------

             Who commented on bash? :

                 1      Bob said bash is a Good Utility!
                 2      Mary said bash is a Good Utility!

             (Press [F1] for HELP)

             ([ESC] to Quit)   PLEASE ENTER A CHOICE:

          --< 2 >-<ENTER>----------------------------------

          The user sees ==>

             SELECTIONS = Mary said bash is a Good Utility!

          NOTE: "]P[" can be used as a shorthand for "]Previous[".

          "]P[{Menu_Name}" can be used as a shorthand for
          "]Previous[{Menu_Name}".

          "]C[" can be used as a shorthand for "]Convey[".

    *   ]Selected[

          "]Selected[" can only be used in a *terminal* menu. ( *A terminal
          menu is the last menu in the chain, or the last menu the user
          sees. It is the menu that defines the* "Result" *element with a
          method* "Result => &any_method()", *or does not have a* "Result"
          *element included or defined.* ) "]Selected[" is used to pass the
          selection of the *current* menu to the "Result" element method of
          the current menu:

             use Term::Menus;

             sub selected { print "\n   SELECTED ITEM = $_[0]\n" }

             my %Menu_1=(

                Name   => 'Menu_1',
                Item_1 => {

                   Text   => "/bin/Utility - ]Convey[",
                   Convey => [ `ls -1 /bin` ],

README  view on Meta::CPAN

                    my @return=();
                    if ($^O eq 'cygwin') {
                       opendir(DIR,'/cygdrive/c/') || die $!;
                    } else {
                       opendir(DIR,'/') || die $!;
                    }
                    @xfiles = readdir(DIR);
                    closedir(DIR);
                    foreach my $entry (@xfiles) {
                       next if $entry eq '.';
                       next if $entry eq '..';
                       next if -d "$entry";
                       push @return, "$entry";
                    }
                    return @return;

                 },
              },
              Banner => "   Current Directory: ]P[\n",

           );

           my $selection=Menu(\%dir_menu);

           if (ref $selection eq 'ARRAY') {
              print "\nSELECTION=",(join " ",@{$selection}),"\n";
           } else {
              print "\nSELECTION=$selection\n";
           }

USAGE and NAVIGATION

    Usage of "&pick()" and/or "&Menu()" during the runtime of a script in
    which one or both are included, is simple and intuitive. Nearly
    everything the end user needs in terms of instruction is included
    on-screen. The script-writer/developer/programmer can also include
    whatever instructions s/he deems necessary and/or helpful in the
    customizable "Banner" (as described above). There is however, one
    important feature about using "&Menu()" with sub-menus that's important
    to know about.

   Forward  ' > ' and  Backward  ' < ' Navigation

    When working with more than one "&Menu()" screen, it's valuable to know
    how to navigate back and forth between the different "&Menu()"
    levels/layers. For example, above was illustrated the output for two
    layers of menus - a parent and a child:

        The user sees ==>

           Choose a /bin Utility :

              1.        /bin Utility - arch
              2.        /bin Utility - ash
              3.        /bin Utility - awk
              4.        /bin Utility - basename
              5.        /bin Utility - bash
              6.        /bin Utility - cat
              7.        /bin Utility - chgrp
              8.        /bin Utility - chmod
              9.        /bin Utility - chown
              10.       /bin Utility - cp

           a.  Select All   c.  Clear All   f.  FINISH
                               ___
           93 Total Choices   |_v_| Scroll with ARROW keys   [F1] for HELP

           ([ESC] to Quit)   PLEASE ENTER A CHOICE:

        --< 5 >-<ENTER>----------------------------------

        The user sees ==>

           Choose an Answer :

               1      bash is a Good Utility
               2      bash is a Bad Utility

           (Press [F1] for HELP)

           ([ESC] to Quit)   PLEASE ENTER A CHOICE:

        In the above example, suppose that the user "fat-fingered" his/her
        choice, and really didn't want to "bash" bash, but wanted to bash
        awk instead. Is restarting the whole script/application now
        necessary? Suppose it was a process that had run overnight, and the
        user is seeing this menu through fogged glasses from the steam
        rising out of their morning coffee? Having to run the whole job
        again would not be welcome news for the BOSS. THANKFULLY, navigation
        makes this situation avoidable. All the user would have to do is
        type ' < ' to go backward to the previous menu, and ' > ' to go
        forward to the next menu (assuming there is one in each case):

        The user sees ==>

           Choose an Answer :

               1      bash is a Good Utility
               2      bash is a Bad Utility

           (Press [F1] for HELP)

           ([ESC] to Quit)   PLEASE ENTER A CHOICE:

         --<  >  >-<ENTER>-----------------------------

        The user sees ==>

           Choose a /bin Utility :

               1      /bin Utility - arch
               2      /bin Utility - ash
               3      /bin Utility - awk
               4      /bin Utility - basename
            -  5      /bin Utility - bash
               6      /bin Utility - cat
               7      /bin Utility - chgrp
               8      /bin Utility - chmod
               9      /bin Utility - chown
               10     /bin Utility - cp

           a.  Select All   c.  Clear All   f.  FINISH
                               ___
           93 Total Choices   |_v_| Scroll with ARROW keys   [F1] for HELP

           ([ESC] to Quit)   PLEASE ENTER A CHOICE:

        Note in the above example the Dash ' - ' in front of item 5. This
        informs the user that s/he had previously selected this item. To
        clear the selection, the user would simply choose item 5 again. This
        effectively deletes the previous choice and restores the menu for a
        new selection. If the user was satisfied with the choice, and was
        simply double checking thier selection, they simply repeat the
        navigation process by typing ' > ' - then <ENTER> - and returning to
        the child menu they left.

        If the child menu was a *multiple-selection* menu, and the user had
        made some selections before navigating back to the parent menu, the
        user would see a ' + ' rather than a ' - '. This informs the user
        that selections were made in the child menu.

           Choose a /bin Utility :

              1.        /bin Utility - arch
              2.        /bin Utility - ash
              3.        /bin Utility - awk
              4.        /bin Utility - basename
           +  5.        /bin Utility - bash
              6.        /bin Utility - cat
              7.        /bin Utility - chgrp
              8.        /bin Utility - chmod
              9.        /bin Utility - chown
              10.       /bin Utility - cp

           a.  Select All   c.  Clear All   f.  FINISH
                               ___
           93 Total Choices   |_v_| Scroll with ARROW keys   [F1] for HELP

           ([ESC] to Quit)   PLEASE ENTER A CHOICE:

   View Sorted Items ' % '

    When working with numerous items in a single menu, it may be desirable
    to see the set of choices organized in either descending or reverse
    acscii order. Term::Menus provides this feature with the *Percent* ' % '
    key. Simply type ' % ' and the items will be sorted in descending ascii
    order. Type ' % ' again, and you will see the items reverse sorted.
    Assume that we have the following menus.

        The user sees ==>

           Choose a /bin Utility :

            *  1      [.exe
            *  2      2to3
               3      2to3-3.2
            *  4      411toppm.exe
               5      a2p.exe
               6      aaflip.exe
               7      aclocal
            *  8      aclocal-1.10
               9      aclocal-1.11
            *  10     aclocal-1.12

           a.  Select All   c.  Clear All   f.  FINISH
                                 ___
           1925 Total Choices   |_v_| Scroll with ARROW keys   [F1] for HELP

           ([ESC] to Quit)   PLEASE ENTER A CHOICE:

        --< % >-<ENTER>----------------------------------

        The user sees ==>

           Choose a /bin Utility :

           *  2.        2to3
              3.        2to3-3.2
           *  4.        411toppm.exe
              759.      FvwmCommand.exe
              1650.     Ted.exe
              1782.     WPrefs.exe
              1785.     X
              1889.     XWin.exe
              1808.     Xdmx.exe
              1815.     Xephyr.exe

           a.  Select All   c.  Clear All   f.  FINISH

           (Type '<' to return to previous Menu)
                                  ___
           1925  Total Choices   |_v_| Scroll with ARROW keys   [F1] for HELP



( run in 0.724 second using v1.01-cache-2.11-cpan-5511b514fd6 )