LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (http://www.linuxquestions.org/questions/programming-9/)
-   -   Problem with passing arguments in Perl (http://www.linuxquestions.org/questions/programming-9/problem-with-passing-arguments-in-perl-328415/)

bahadur 05-29-2005 11:36 PM

Problem with passing arguments in Perl
 
I am trying to make CLI. when the script starts the user will type in some command and script performs the required action.

i have used hashes for purpose of efficiency. what i do is that the command is the key of the hash and the value of the hash is a reference to a sub routine.

now i cant figure out how to pass arguments to such functions.

here is my code

Code:

sub settime($){ print "nMetrics>You have entered the settime command\n";
                        print "nMetrics>The argument given is $_[0]\n";}
        sub showtime{ print "nMetrics>You have entered the show time command\n";}
        sub error{ print "nMetrics>Invalid command line options\n";}

        $myhash{"set time"}=\&settime;
        $myhash{"show time"}=\&showtime;
        $myhash{default}=\&error;


        print "Welcome to nMetrics application monitor\n";
        print "Please type in a command\n";

        label: print "nMetrics>";
        while(<STDIN>)
        {
                chomp;
                if (exists $myhash{$_})
                          {$myhash{$_}->();}

                else
                          {$myhash{default}->();}
        goto label;
        }

now with this code i can only type in a command. if the user also has to pass some arguments with the command i cant do that.

how will i pass arguments to my sub routines?

puffinman 05-30-2005 01:47 AM

Mayhap something like this?

Code:


while (1) {

  chomp($input = <STDIN>);

  # this splits the input on whitespace
  @args = split /\s+/, $input;

  # the first argument should have been the command
  $cmd = shift @args;

  # do whatever with $cmd and @args...
  $coderef = $myhash{$cmd};

  if ($coderef and @args) {
    # valid command with args
    $coderef->(@args);
  } elsif ($coderef) {
    # valid command, no args
    $coderef->();
  } else {
    # invalid command
  }

}

I'm thinking you could also just go ahead and pass the @args array even if it's empty; an empty list should look the same to the called function as no arguments at all.


All times are GMT -5. The time now is 02:35 AM.