in reply to Re: How do I find the index of the last element in an array?
in thread How do I find the index of the last element in an array?

An observation:

Juerd was just arguing against this syntax here today. I don't know what he means by: "$#foo + 1 isn't necessarily equal to @foo"(Some Perl array nuance I am not familiar with) but I tend to agree with him that using the more direct syntax:

print "index of last element: $#A";

is easier to understand and you don't have to leave future maintainers of your code guessing.

Thanks

  • Comment on Re: Answer: How do I find the index of the last element in an array?
  • Download Code

Replies are listed 'Best First'.
Re: Re: Answer: How do I find the index of the last element in an array?
by Juerd (Abbot) on Jun 02, 2003 at 06:39 UTC

    I don't know what he means by: "$#foo + 1 isn't necessarily equal to @foo"(Some Perl array nuance I am not familiar with)

    $[ = 5; my @foo = qw(a b c); printf "Number of elements: %d\n", scalar @foo; printf "Last index: %d\n", $#foo; printf "*Number of elements: %d\n", $#foo + 1; printf "*Last index: %d\n", scalar @foo - 1;
    Number of elements: 3 Last index: 7 *Number of elements: 8 *Last index: 2
    One should of course NEVER set $[, but that is besides the point.

    Juerd # { site => 'juerd.nl', plp_site => 'plp.juerd.nl', do_not_use => 'spamtrap' }

      Of course! Thanks for that answer Juerd! I'm willing to bet that "One should of course NEVER set $[" is exactly what the Camel book said too when I read about it so long ago.

      Thanks for the refresher.

Re: Re: Answer: How do I find the index of the last element in an array?
by tommyw (Hermit) on Jun 02, 2003 at 14:23 UTC

    If foo is an empty, or undefined, array, then @foo is undef, but $#foo is -1.

    In such a case, $#foo does equal scalar(@foo)-1, but scalar(@foo) does not equal $#foo+1.

    --
    Tommy
    Too stupid to live.
    Too stubborn to die.

      No, I don't think so. If @foo is empty, then scalar(@foo) is zero, not undef, and the equality holds true... (actually undef == 0 is also true, though it emits a warning)

      The only time @foo != $#foo + 1 is when you messed with $[ (but you didn't do that, did you?)

      --
      3dan

        Ack. Damn those non-scalar contexts!

        perl -e 'print $#a, "\n", @a, "\n", $#a+1, "\n"' -1 0
        Thus clearly showing that @a is undef. Which is true. In a list context...

        If I'd remembered to include scalar around it:

        perl -e 'print $#a, "\n", scalar (@a), "\n", $#a+1, "\n"' -1 0 0
        , I'd have got the right answer...

        My bad.

        --
        Tommy
        Too stupid to live.
        Too stubborn to die.