in reply to Is there any way to make an array non-greedy?

You have a bug:
my $string = join('x', 'a'x20);
should be
my $string = join('x', ('a')x20);
Fix that and it works.

If you always have one element left over, you can make the code readable as:

use strict; use warnings; my $string = join('x', ('a')x20); my @foo = split('x', $string); my $foo = pop(@foo); print "Success!\n" if $foo eq "a";

If you always have a variable number of elements left over, you have a problem fixed as follows:

use strict; use warnings; my $string = join('x', ('a')x20); my (@foo, $foo); (@foo[0..18], $foo) = split('x', $string, 20); # <-- added limit. print "Success!\n" if $foo eq "a";

Replies are listed 'Best First'.
Re^2: Is there any way to make an array non-greedy?
by thor (Priest) on Oct 14, 2005 at 18:25 UTC
    If my real problem were as easy as my toy script, I'd certainly follow one of your above solutions. However, it's more like this:
    my ( $field1, $field2, #... $field25, @field26[0..25], $field27, $field28, #... ) = split(/\|/);
    This way, it makes it obvious that I'm grabbing a fixed number from the split return. I appreciate the terseness in your solutions, though. Now that I know that it was a problem with my test data and not my approach, I'll be using something like what I originally posted.

    thor

    Feel the white light, the light within
    Be your own disciple, fan the sparks of will
    For all of us waiting, your kingdom will come

      I think you're after something like this:

      @important_fields = (split /\|/, $string)[25..50];