in reply to Code challenge: array subrange

sub ranger { my ($arr, $r, $sr) = @_; # Unneeded, plus it doesn't work. #local $[ = $r->[0]; $sr->[$_] -= $r->[0] for 0 .. 1; ($sr->[0] < $sr->[1]) ? @{$arr}[$sr->[0] .. $sr->[1]] : reverse( @{$arr}[$sr->[1] .. $sr->[0]] ); }

Update: Upon actually trying the above code, I found it doesn't work like I thought it would. However, I found that I didn't need $[ at all.

Being right, does not endow the right to be rude; politeness costs nothing.
Being unknowing, is not the same as being stupid.
Expressing a contrary opinion, whether to the individual or the group, is more often a sign of deeper thought than of cantankerous belligerence.
Do not mistake your goals as the only goals; your opinion as the only opinion; your confidence as correctness. Saying you know better is not the same as explaining you know better.

Replies are listed 'Best First'.
Re^2: Code challenge: array subrange
by davido (Cardinal) on Jan 13, 2005 at 16:23 UTC

    local $[ = $r->[0]

    I had the same thought; localize $[ and let it do the work, and probably ran into the same problem. That sent me diving back into perlvar.

    We've had drilled into our heads not to use $[ with such a strong emphasis on DON'T that I at least had completely forgotten...

    As of release 5 of Perl, assignment to $[ is treated as a compiler directive, and cannot influence the behavior of any other file. (That's why you can only assign compile-time constants to it.)


    Dave

      Actually, $[ = $r->[0]; will work, but it required more work than I cared to do.
      sub ranger { my @arr = @{$_[0]}; my ($r1, $r2) = @{$_[1]}; my ($sr1, $sr2) = @{$_[2]}; my @v = eval <<__END_EVAL__; \$[ = $r1; ($sr1 < $sr2) ? \@arr[ $sr1 .. $sr2 ] : reverse \@arr[ $sr2 .. $sr1 ]; __END_EVAL__ return @v; }

      Being right, does not endow the right to be rude; politeness costs nothing.
      Being unknowing, is not the same as being stupid.
      Expressing a contrary opinion, whether to the individual or the group, is more often a sign of deeper thought than of cantankerous belligerence.
      Do not mistake your goals as the only goals; your opinion as the only opinion; your confidence as correctness. Saying you know better is not the same as explaining you know better.