≡ Menu

Perl Display And Pass Command Line Arguments With @argv

How do I read or display command-line arguments with Perl?

Perl command line arguments stored in the special array called @ARGV. The array @ARGV contains the command-line arguments intended for the script. $#ARGV is generally the number of arguments minus one, because $ARGV[0] is the first argument, not the program’s command name itself. Please note that $ARGV contains the name of the current file when reading from <>.

Perl @ARGV examples

Use $ARGV[n] to display argument.

Use $#ARGV to get total number of passed argument to a perl script.

For example, if your scriptname is foo.pl:

./foo.pl one two three

You can print one, two, three command line arguments with print command:

print "$ARGV[0]\n";
print "$ARGV[1]\n";
print "$ARGV[2]\n";

Or just use a loop to display all command line args:

#!/usr/bin/perl
# get total arg passed to this script
my $total = $#ARGV + 1;
my $counter = 1;
 
# get script name
my $scriptname = $0;
 
print "Total args passed to $scriptname : $total\n";
 
# Use loop to print all args stored in an array called @ARGV
foreach my $a(@ARGV) {
	print "Arg # $counter : $a\n";
	$counter++;
}

Sample outputs:

./script.pl -c tom -m jerry 
Total args passed to /script.pl : 4
Arg # 1 : -c
Arg # 2 : tom
Arg # 3 : -m
Arg # 4 : jerry

More examples

#!/usr/bin/perl -w
if ($#ARGV != 2 ) {
	print "usage: mycal number1 op number2\neg: mycal 5 + 3 OR mycal 5 - 2\n";
	exit;
}
$n1=$ARGV[0];
$op=$ARGV[1];
$n2=$ARGV[2];
$ans=0;
if ( $op eq "+" ) {
	$ans = $n1 + $n2;
}
elsif ( $op eq "-"){
	$ans = $n1 - $n2;
}
elsif ( $op eq "/"){
	$ans = $n1 / $n2;
}
elsif ( $op eq "*"){
	$ans = $n1 * $n2;
}
else {
	print "Error: op must be +, -, *, / only\n";
	exit;
}
print "$ans\n";

Save and run script as follows:
$ chmod +x mycal.pl
$ ./mycal.pl
$ ./mycal.pl 5 + 3
#### Note: * need to be escaped under UNIX shell ###
$ ./mycal.pl 5 \* 3

Sample outputs:

Fig.01: mycal.pl in action

Fig.01: mycal.pl in action

Share this tutorial on:

Your support makes a big difference:
I have a small favor to ask. More people are reading the nixCraft. Many of you block advertising which is your right, and advertising revenues are not sufficient to cover my operating costs. So you can see why I need to ask for your help. The nixCraft, takes a lot of my time and hard work to produce. If you use nixCraft, who likes it, helps me with donations:
Become a Supporter →    Make a contribution via Paypal/Bitcoin →   

Don't Miss Any Linux and Unix Tips

Get nixCraft in your inbox. It's free:



{ 18 comments… add one }
  • kunal November 23, 2007, 1:58 pm

    Hi,
    i think u wrongly misspelled the spelling of line to ling in “Perl display and pass command ling arguments with @argv”

  • jaspreet September 6, 2008, 6:51 am

    Helpful info! Thanks!!

  • Chazz December 10, 2008, 7:22 pm

    Here’s a simple way to display your command args:

     foreach (@ARGV) { print "$_\n" }

    or you can use:

      map { print "$_\n" } @ARGV;

    Also, if you want to have command line options such as (-a foo), you can use the getopts perl module. Here’s an example:

    use Getopt::Std;
      getopts ("ab:");
      print "a exists\n" if $opt_a;
      print "b = $opt_b\n" if $opt_b;

    The getopts(…) line specifies the options you want. If a letter ends with “:”, then it can provide a string. otherwise it will be a flag option. If the option exists at command line by user, you will have a variable automatically generated prefixed with $opt_. Here’s an example of the command line for the previous code:

    example.pl -a -b foo

    Would display:

    a exists
    b = foo

    The options must be single letter. For longer, more complex command options, see the Getopt::Long perl module (google is your friend).

    Hope this helps.

  • Brian February 16, 2009, 5:58 pm

    Thanks for proving the information and example for passing command line arguments with $argv. The following line of the calculator script does not work on my system, and I suspect it is related to the “*” metacharacter.

    elsif ( $op eq “*”){
    $ans = $n1 * $n2;

    Being new to Perl scripting, I have to ask if the syntax is correct for this character match? When I execute the script with a multiplication operator, the script returns an error; however, if I change the code to match “x” instead of “*” it runs perfectly.

    Sincerely,
    Brian

  • av May 14, 2009, 11:23 am

    Is there a limit to the num,ber of arguments a perl script can take?

  • rt August 12, 2009, 1:07 pm

    The first suggestion

    print “$ARGV[$0]\n”;
    print “$ARGV[$1]\n”;
    print “$ARGV[$2]\n”;

    throws an error (undeclared variable) – it uses a zero (0) for each line.

    The followring works –

    print “$ARGV[0]\n”;
    print “$ARGV[1]\n”;
    print “$ARGV[2]\n”;

  • mac November 3, 2009, 1:19 am

    Hi Brian,

    Your shell ( dos ) is substituting your * argument. you should either escape it with \* when calling the program or use something else, as you did. quotes would work too:
    calc.pl 10 ‘*’ 15

    Regards,

  • Yogesh June 20, 2010, 4:39 am

    Hi, I have a query

    Say for example I have the following in an excel sheet:

    A 1 2 3
    B 4 5 6
    C 7 8 9

    I want to get the data attached to A and say pick up 2 from there and pass it to another perl script irrespective of the cell number in which it is.

    Can u please advise me on that.
    Yogesh

  • Virag February 11, 2011, 10:41 pm

    Hi
    I have a problem with this
    when i do
    path.pl bus[0] bus[1]

    It is unable to take the arguements with the [] braces and the code terminates

  • Vishal May 11, 2011, 4:14 am

    What is the functionlity of ‘$@’ command line argument in Perl?

  • dileep October 20, 2011, 2:44 pm

    how to pass linux commands in perl script?

  • M5J5 January 6, 2012, 7:34 pm

    A couple of corrections if I may:

    1)
    print “$ARGV[$0]\n”;
    print “$ARGV[$1]\n”;
    print “$ARGV[$2]\n”;

    should be read

    print “$ARGV[0]\n”;
    print “$ARGV[1]\n”;
    print “$ARGV[2]\n”;

    2)
    Command Lin*E* not Ling

    THANKS for this post!!!

  • David April 9, 2012, 5:29 pm

    $#ARGV actually gives you the last index in the @ARGV array, not the total number of arguments passed. scalar(@ARGV) will give you the total number of arguments or just assign to a scalar.
    see http://perldoc.perl.org/perldata.html#Scalar-values for details

    for e.g.

    [root@here]# cat argv.pl
    my $argc = @ARGV;
    my $lastIndex = $#ARGV;
    print "argc=$argc lastIndex=$lastIndex\n";
    
    [root@here]# ./argv.pl
    argc=0 lastIndex=-1
    
    [root@here]# ./argv.pl arg1
    argc=1 lastIndex=0
    
    [root@here]# ./argv.pl arg1 arg2
    argc=2 lastIndex=1
    
  • Patrick October 26, 2012, 6:55 pm

    Yes, David is correct. $#ARGV is absolutely the WRONG way to get the number of arguments (that’s Bash Script Syntax; not Perl syntax). This post is misleading and should be fixed.

  • Nearco February 5, 2016, 7:54 pm

    Hi,
    Great example, any tip howto pass the parameters from an external file?.

  • JAGESH December 7, 2016, 10:23 am

    HOW TO MERGE two file by command line argument in perl

  • Rahman Adam February 4, 2017, 5:59 am

    Hi….
    Can we give the file name path to the Argv command?

Security: Are you a robot or human?

Leave a Comment

You can use these HTML tags and attributes: <strong> <em> <pre> <code> <a href="" title="">


   Tagged with: , , , , , , , , , , , , , , , ,