Re: perl qstn...

On Sun, 04 Apr 2010 02:01:53 -0700, Gary Kline <kline@xxxxxxxxxxx> wrote:
thanks for your url as well and the others to posted. but it seems
like overkill since i dont need any explicit option or argument. i
just need the script to tell me whether i have an arg or not.
following is something i've kept in one of my junk drawers from when i
was learning to write bourne sscripts. it uses the "$[token]" syntax
that determines whether there are Any args on the cmdline. if not,
the script prints a message and exits.

if [ $# -eq 0 ]
echo "No args; need filename."
echo "$1"

After a couple hours experimentation, the following does the same for my
perl scripts:

$argc = @ARGV;
if (! $argc ) {
printf("No args; need filename.\n");
else {
printf("%s\n", @ARGV);

Yes, that's very close to the sh(1) version. Perl's behavior in this
case is described in the 'perlvar' manpage:

@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. See $0
for the command name.

In other words, when @ARGV appears in "scalar context" it yields the
'size' of the @ARGV array, e.g.:

% cat
printf("%d .. args = [%s]\n", int(@ARGV), join(', ', (@ARGV)));

% perl
0 .. args = []

% perl 1
1 .. args = [1]

% perl 1 2 3
3 .. args = [1, 2, 3]

So when int(@ARGV) is zero you know that there are no arguments at all.

This means you can write your sh version like this in Perl:


if (int(@ARGV) == 0) {
die "No args; at least one filename expected";
printf("%s\n", join(' ', (@ARGV)));

This is "good enough" as a command-line handling trick for really simple
scripts, but you should probably have a look at the Getopt::Std and the
Getopt::Long modules for longer scripts. Using them will make your
option parsing code much cleaner and easier to change in the future.

freebsd-questions@xxxxxxxxxxx mailing list
To unsubscribe, send any mail to "freebsd-questions-unsubscribe@xxxxxxxxxxx"