How to get the total arguments in perl??
Hi,
How can I get the total arguments in perl.To be more specific if I try to execute the command Code:
perl -w myperl.pl ash ok kumar I know that @ARGV will store only the arguments passed but not the entire arguments. |
Quote:
Code:
$ cat /tmp/myperl.pl Code:
$ cat myperl2.pl Thanks! |
Quote:
Code:
#!usr/bin/perl -w Code:
[Ashok@station130 Assignment_1]$ perl -w package.pl ash ok kumar Code:
[Ashok@station130 Assignment_1]$ perl -w package.pl ash ok kumar |
Also, there is a special variable $0 which can be used to get our program name. But what about rest of the arguments(perl -w)?
|
Ahh. I see. The problem is that your perl script doesn't actually see the entire command line.
The shell sees Code:
perl -w package.pl ash ok kumar Code:
-w package.pl ash ok kumar Package.pl sees Code:
ash ok kumar For Package.pl to be able to see the entire command line, it's going to have to make a call back to the shell. The shell has a variable '$COMP_LINE' contains the entire command line, but it's not populated by default... I didn't have time to read the entire section in the Bash man pages about this, but I know that it's there. Alternatively, /proc/$$/cmdline is a virtual file which contains the command line. |
Code:
use warnings; |
Quote:
Hi bartonski and smeezekitty By using the virtual file /proc/$$/cmdline, I am not able to get the specific command line arguments like "perl","-w", etc..,. Rather I am getting the total command line arguments as entire string. I tried as below: Code:
#!usr/bin/perl Thanks for your replies. |
Quote:
Code:
> cat /tmp/asdf.pl |
Quote:
|
Quote:
|
The -w is a flag not an argument. The Perl interpreter takes that and modifies execution accordingly (it turns on warnings), but the -w is not supposed to end up in @ARGV.
To jump ahead a little bit, can you tell us more about what you are really trying to do? If your goal is to be able to write command-line scripts with flags, Perl has lots of good modules to help you do that. Take a look at GetOpt::Std or Getopt::Long. |
Quote:
To get the number of args just run $#ARGV, btw. |
Quote:
|
Another thing I'd point out is... you should really be specifying the commandline uses in the script itself--
Code:
use strict; You can see an example of this like such: Code:
perl -e 'print $0 . " has " . (($#ARGV)+1) . " args.\n"' Code:
#!/usr/bin/perl Code:
core:~/test/test22$ perl -e 'print $0 . " has " . (($#ARGV)+1) . " args.\n"' 1 2 3 |
Quote:
for( $val= 0; $val <= $#ARRAY; $val++ ){ } Which is just a C habit. However, it's all about preference, and both will work. Yay Perl :) |
Quote:
I didn't really learn that this was the right way to do things until I started working in a mixed Unix/Windows environment: I used to run perl scripts using this shebang line. Code:
#! /usr/bin/perl -w (What's worse is when someone opens one of your perl files in a windows text editor... then saves it without makeing any changes... except for the nice little ^M characters littered throughout the code. This will mess up the shebang line because /usr/bin/perl is not the same as /usr/bin/perl^M... meaning that the shebang line won't work under Unix, either). |
Quote:
Why this is happening? |
Quote:
|
Quote:
If you interpolate an array in double quotes and print it, you get each item separated by a space. If, however, you print the array unquoted, you get all the items concatenated together without any separation of any kind. Code:
#!/usr/bin/env perl Code:
telemachus ~ $ perl array_print |
Quote:
|
Quote:
I will continue to answer in my style. You can continue to disagree with my choices. Such is life. |
Quote:
As someone else wrote in this forum - instead of learning nowadays "Internet forum learning" or something like this has become immensely popular. I.e. instead of making an effort to read and understand people just ask questions in forums without making an effort first. Unfortunately, I too often had to work with people who never bothered to read the documentation on tools they were systematically/repeatedly using. It was a disaster, i.e. they didn't understand how the tools were working/what they were doing, they just new command line format for certain tasks they were routinely performing. They couldn't make even a minimal modification of the command lines when needed (i.e. all they could was, say, replacing file names on command lines), they couldn't analyze and correct mistakes they made (and we all make mistakes) - exactly because they didn't understand what they and the tools were doing. Kind of "command line monkeys" if you wish - similar to "coding monkeys". As you said, such is life. I.e. the more you do the job of others, the more the others take it for granted. |
Quote:
However, my hope is that if I give more explanation and people read what I write and think about it, they will learn. I also generally post links to fuller documentation or articles or mention books. If someone posts question after question about very basic things and doesn't show any increase in knowledge, I stop posting answers. But I don't mind writing fuller answers at first. Perl's documentation is excellent, but it can be overwhelming for someone new to the language or new to programming. I remember how it felt for me at first. Everything was in there, but (1) I couldn't always find things and (2) sometimes the explanations went way over my head. Anyhow, that's why I often write fuller answers. |
All times are GMT -5. The time now is 12:16 AM. |