http://www.perlmonks.org?node_id=1002115


in reply to Re: @array elements multiplication with another array elements.
in thread @array elements multiplication with another array elements.

$#arr returns a zero indexed length of items list $#arr = 3

I think it is fundamentally misleading to refer to what  $#array returns as a "length". Rather, I would say it is the highest index of the array, and depends on what the $ARRAY_BASE special variable (aka $[ – see perlvar) has been set to (but don't do that!).

Replies are listed 'Best First'.
Re^3: @array elements multiplication with another array elements.
by Don Coyote (Hermit) on Nov 04, 2012 at 12:31 UTC

    Thanks Anomolous, point noted. I should also reflect that it is not truly the map operator that is using the $#arr construct to obtain the highest array index as such, rather it is being used by the .. range operator. As map expects a list of some description to work with after the modifiying operation. In this case we give the list in scalar context of a range, much like the for iterator, so perl goes ah yah, this is some funky for loop right, and cooly proceeds.

    I will now look into how the $ARRAY_BASE special variable affects the $# variable. I would not have thought a difference would be made, being as the highest index of an array is always going to be the highest index? (unless $[ is set higher perhaps... hmm...).

    *Footsteps echo quietly away as Coyote trundles off into the dark echoing corridors of the echosome vaults.

      I will now look into how the $ARRAY_BASE special variable affects the $# variable.

      By all means investigate the-special-variable-whose-name-must-not-be-written to learn its heterodoxy, but never use this impious and odious monstrosity lest your script be shunned throughout all lands and ages, and your name be cursed by maintainers.

      >perl -wMstrict -le "$[ = 654; my @ra = 0 .. 12; print $#ra; " Use of assignment to $[ is deprecated at -e line 1. 666