How can I pass command-line arguments to a Perl program?

PerlCommand Line

Perl Problem Overview


I'm working on a Perl script. How can I pass command line parameters to it?

Example:

script.pl "string1" "string2"

Perl Solutions


Solution 1 - Perl

Depends on what you want to do. If you want to use the two arguments as input files, you can just pass them in and then use <> to read their contents.

If they have a different meaning, you can use GetOpt::Std and GetOpt::Long to process them easily. GetOpt::Std supports only single-character switches and GetOpt::Long is much more flexible. From GetOpt::Long:

use Getopt::Long;
my $data   = "file.dat";
my $length = 24;
my $verbose;
$result = GetOptions ("length=i" => \$length,    # numeric
                    "file=s"   => \$data,      # string
                    "verbose"  => \$verbose);  # flag

Alternatively, @ARGV is a special variable that contains all the command line arguments. $ARGV[0] is the first (ie. "string1" in your case) and $ARGV[1] is the second argument. You don't need a special module to access @ARGV.

Solution 2 - Perl

You pass them in just like you're thinking, and in your script, you get them from the array @ARGV. Like so:

my $numArgs = $#ARGV + 1;
print "thanks, you gave me $numArgs command-line arguments.\n";

foreach my $argnum (0 .. $#ARGV) {

   print "$ARGV[$argnum]\n";

}

From http://www.devdaily.com/perl/edu/qanda/plqa00001.shtml">here</a>;.

Solution 3 - Perl

foreach my $arg (@ARGV) {
    print $arg, "\n";
}

will print each argument.

Solution 4 - Perl

Alternatively, a sexier perlish way.....

my ($src, $dest) = @ARGV;

"Assumes" two values are passed. Extra code can verify the assumption is safe.

Solution 5 - Perl

Yet another options is to use perl -s, eg:

#!/usr/bin/perl -s

print "value of -x: $x\n";
print "value of -name: $name\n";

Then call it like this :

% ./myprog -x -name=Jeff
value of -x: 1
value of -name: Jeff

Or see the original article for more details:

Solution 6 - Perl

You can access them directly, by assigning the special variable @ARGV to a list of variables. So, for example:

( $st, $prod, $ar, $file, $chart, $e, $max, $flag ,$id) = @ARGV;

perl tmp.pl 1 2 3 4 5

enter image description here

Solution 7 - Perl

If the arguments are filenames to be read from, use the diamond (<>) operator to get at their contents:

while (my $line = <>) {
  process_line($line);
}

If the arguments are options/switches, use GetOpt::Std or GetOpt::Long, as already shown by slavy13.myopenid.com.

On the off chance that they're something else, you can access them either by walking through @ARGV explicitly or with the shift command:

while (my $arg = shift) {
  print "Found argument $arg\n";
}

(Note that doing this with shift will only work if you are outside of all subs. Within a sub, it will retrieve the list of arguments passed to the sub rather than those passed to the program.)

Solution 8 - Perl

my $output_file;

if((scalar (@ARGV) == 2) && ($ARGV[0] eq "-i"))

{

$output_file= chomp($ARGV[1]) ;


}

Solution 9 - Perl

If you just want some values, you can just use the @ARGV array. But if you are looking for something more powerful in order to do some command line options processing, you should use Getopt::Long.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionlamcroView Question on Stackoverflow
Solution 1 - Perluser44511View Answer on Stackoverflow
Solution 2 - PerlGeorge StockerView Answer on Stackoverflow
Solution 3 - PerlnrichView Answer on Stackoverflow
Solution 4 - Perlrastin71View Answer on Stackoverflow
Solution 5 - PerlJoao CostaView Answer on Stackoverflow
Solution 6 - PerlpkmView Answer on Stackoverflow
Solution 7 - PerlDave SherohmanView Answer on Stackoverflow
Solution 8 - Perluser3331697View Answer on Stackoverflow
Solution 9 - PerlMarcView Answer on Stackoverflow