How do I read or display command-line arguments with Perl?
Perl command line arguments stored in the special array called @ARGV.
ARGV example
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 -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
$ ./mycal.pl 5 \* 3
Note: * need to be escaped under UNIX shell.
Page last updated at 1:47 AM, January 7, 2012.
You should follow me on twitter here or grab rss feed to keep track of new changes.
Featured Articles:
- 30 Handy Bash Shell Aliases For Linux / Unix / Mac OS X
- Top 30 Nmap Command Examples For Sys/Network Admins
- 25 PHP Security Best Practices For Sys Admins
- 20 Linux System Monitoring Tools Every SysAdmin Should Know
- 20 Linux Server Hardening Security Tips
- Linux: 20 Iptables Examples For New SysAdmins
- Top 20 OpenSSH Server Best Security Practices
- Top 20 Nginx WebServer Best Security Practices
- 20 Examples: Make Sure Unix / Linux Configuration Files Are Free From Syntax Errors
- 15 Greatest Open Source Terminal Applications Of 2012

- My 10 UNIX Command Line Mistakes
- Top 10 Open Source Web-Based Project Management Software
- Top 5 Email Client For Linux, Mac OS X, and Windows Users
- The Novice Guide To Buying A Linux Laptop













{ 15 comments… read them below or add one }
Hi,
i think u wrongly misspelled the spelling of line to ling in “Perl display and pass command ling arguments with @argv”
Helpful info! Thanks!!
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.
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
Is there a limit to the num,ber of arguments a perl script can take?
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”;
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,
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
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
What is the functionlity of ‘$@’ command line argument in Perl?
how to pass linux commands in perl script?
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!!!
Thanks for the heads up!
$#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.
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.