in reply to ARGV question

$verbose will be "-v" if "-v" is the first thing in @ARGV. This is because "&&" always returns the right operand if the left operand is true. In this case, it returns the result of shift.

Replies are listed 'Best First'.
Re^2: ARGV question
by Johnny Utah (Novice) on Aug 18, 2008 at 21:28 UTC
    Thanks for the reply guys. So it first checks if @ARGV is defined. If it is, it checks if the first value in the @ARGV array is '-v'. If that is true, it shifts the '-v' value to $verbose? What happens if the first value in @ARGV is '-m'?
    Use Kubuntu/KDE/Debian? http://kubuntuway.net

      You are pretty close in your description, but not quite right. I can't think of a time that an array is "undefined". They are either empty, or non-empty.

      The snippet first checks if @ARGV is non-empty. An array evaluated in scalar context returns the number of elements it contains. Since boolean context is a special case of scalar context, @ARGV evaluates to 0 (false) if it is empty, and 1 or more (true) if has contents.

      It's best not to write code like this. If you have any switch processing to do, just use Getopt::Long. Every time I try to short cut around using it, I wind up needing it later, anyway. Your snippet will not work properly if -v is the second option. Getopt::Long would be unaffected, and it has the advantage of being tested and documented code.

      I know the making the distinction between undefined and empty may seem pedantic. But making sure that you really get these kinds of details will help you avoid some nasty, subtle bugs.


      TGI says moo

      $verbose will be false, and @ARGV remains untouched.