[Pdx-pm] evil @ARGV syntax

Michael G Schwern schwern at pobox.com
Tue Jul 19 12:14:03 PDT 2005


On Tue, Jul 19, 2005 at 11:05:05AM -0700, Randall Hansen wrote:
>      if( $#ARGV + 1 < 1 || $#ARGV + 1 > 2 ) {
> 
> which seems like a complicated way of writing:
> 
>      if( @ARGV < 1 or @ARGV > 2 ) {
> 
> i've tested this and found it to be true.  my question is, why on  
> earth would someone write this the first way?  it's one thing not to  
> understand scalar context; it seems entirely insane to add those ones  
> before the less|greater than tests.
> 
> am i missing an idiom?  historical reason?  does @ARGV behave oddly  
> enough in certain contexts that these gymnastics are necessary?

Lots of poorly written Perl books (which is to say most of them prior to 2000)
never clearly teach $num_things = @things.  See 
http://mungus.schwern.org/~schwern/litmus_test/index.html
for some examples.

Adding one to $#ARGV is to make the operation more like how people think.  
Rather than think "if the index of @ARGV is less than 0 or greater than 1" 
they want to express the more natural "if I got less than 1 argument or more 
than 2".  Its also reflexive.  $#array + 1 is how folks are often taught to
get the number of elements in an array.

The ironic thing is this is all a really complicated way of saying the much
more natural:

	# if I got 1 or 2 args...
	if( @ARGV == 1 or @ARGV == 2 ) {
		...
	}


-- 
Michael G Schwern     schwern at pobox.com     http://www.pobox.com/~schwern
Ahh email, my old friend.  Do you know that revenge is a dish that is best 
served cold?  And it is very cold on the Internet!


More information about the Pdx-pm-list mailing list