Perl Display And Pass Command Line Arguments With @argv

by on March 20, 2007 · 15 comments· LAST UPDATED July 29, 2013

in , ,

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 <>.

Tutorial details
DifficultyEasy (rss)
Root privilegesNo
Estimated completion time10 minute

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

./ 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:

# 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";

Sample outputs:

./ -c tom -m jerry
Total args passed to / : 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";
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";
print "$ans\n";

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

Sample outputs:

Fig.01: in action

Fig.01: in action

Tweet itFacebook itG+ itDownload PDF versionFound an error/typo on this page?

{ 15 comments… read them below or add one }

1 kunal November 23, 2007 at 1:58 pm

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


2 jaspreet September 6, 2008 at 6:51 am

Helpful info! Thanks!!


3 Chazz December 10, 2008 at 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: -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.


4 Brian February 16, 2009 at 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.



5 av May 14, 2009 at 11:23 am

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


6 rt August 12, 2009 at 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”;


7 mac November 3, 2009 at 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: 10 ‘*’ 15



8 Yogesh June 20, 2010 at 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.


9 Virag February 11, 2011 at 10:41 pm

I have a problem with this
when i do bus[0] bus[1]

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


10 Vishal May 11, 2011 at 4:14 am

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


11 dileep October 20, 2011 at 2:44 pm

how to pass linux commands in perl script?


12 M5J5 January 6, 2012 at 7:34 pm

A couple of corrections if I may:

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”;

Command Lin*E* not Ling

THANKS for this post!!!


13 nixCraft January 6, 2012 at 8:19 pm

Thanks for the heads up!


14 David April 9, 2012 at 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 for details

for e.g.

[root@here]# cat
my $argc = @ARGV;
my $lastIndex = $#ARGV;
print "argc=$argc lastIndex=$lastIndex\n";
[root@here]# ./
argc=0 lastIndex=-1
[root@here]# ./ arg1
argc=1 lastIndex=0
[root@here]# ./ arg1 arg2
argc=2 lastIndex=1


15 Patrick October 26, 2012 at 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.


Leave a Comment

Tagged as: , , , , , , , , , , , , , , , ,

Previous Faq:

Next Faq: