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

".." is the range operator. It can create a list of ascending numbers. You need to know the start and end of the range. In general, there's nothing you can count to determine the start and end of the range when doing a 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.

Some solutions:

(undef, undef, undef, my @set) = split /\s+/, $x; my @set = split /\s+/, $x; splice(@set, 0, 3); my @set = sub { @_[3..$#_] }->( split /\s+/, $x );

The last one hasn't been mentioned yet.

Update: Changed HTML coding so that users of "Enforce proper nesting" could see the DELeleted text.

Replies are listed 'Best First'.
Re^2: Getting range from N..end with list slice
by Marshall (Canon) on Nov 28, 2010 at 01:04 UTC
    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.

      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.

Re^2: Getting range from N..end with list slice
by BrowserUk (Patriarch) on Nov 28, 2010 at 17:24 UTC
    The last one hasn't been mentioned yet.

    All of them had been mentioned, including the last one. Quite why you feel the need to repeat others...

      The OP found great value in my post, so your poor opinion of it doesn't count for much to me.