in reply to Re: Getting range from N..end with list slice
in thread Getting range from N..end with list slice

And here's the doozy. This probably isn't documented, but in a list slice, the index expression is evaluated before the list expression. This means you need to know how many elements split will return before split is even called. That means you need to find an alternate code arrangement.

Thanks Ikegami! That was exactly the sort of info that I was hoping to find out in the absence of a "sure, its easy..just do X" answer). This is as close as one can get to proving a negative. So unless other info is forthcoming, I would say that my friend is mistaken because this claimed new feature just can't be implemented due to the way Perl evaluates the expression. And yes this was a trivia question. For me personally, I think the splice() solution is the winner in terms of clarity and performance.

  • Comment on Re^2: Getting range from N..end with list slice

Replies are listed 'Best First'.
Re^3: Getting range from N..end with list slice
by ikegami (Patriarch) on Nov 28, 2010 at 04:22 UTC

    To back up what I said,

    >perl -MO=Concise,-exec -e"(LIST_EXPR)[INDEX_EXPR]" 1 <0> enter 2 <;> nextstate(main 1 -e:1) v:{ 3 <0> pushmark s 4 <$> const[PV "INDEX_EXPR"] s/BARE 5 <0> pushmark s 6 <$> const[PV "LIST_EXPR"] s/BARE 7 <2> lslice vK/2 8 <@> leave[1 ref] vKP/REFC -e syntax OK

    Or a more à propos example,

    >perl -MO=Concise,-exec -e"(split)[$x..$y]" 1 <0> enter 2 <;> nextstate(main 1 -e:1) v:{ 3 <0> pushmark s 4 <|> range(other->5)[t5] lK/1 <-------- 5 <#> gvsv[*y] s 6 <1> flop lK goto 7 e <#> gvsv[*x] s f <1> flip[t6] lK 7 <0> pushmark s 8 </> pushre(/" "/) s*/64 9 <#> gvsv[*_] s a <$> const[IV 0] s b <@> split[t2] lK <-------- c <2> lslice vK/2 d <@> leave[1 ref] vKP/REFC -e syntax OK

    Now, I suspect the relative order in which the expressions are evaluated is arbitrary. It could be changed if it would be deemed useful to evaluate them in the other order.