bradcathey has asked for the wisdom of the Perl Monks concerning the following question:

Fellow Monasterians:

I have an array where I want to eliminate all the elements between, and including, the two starting and ending elements. So, in my example below, I'd like to end up with a @array of one 1{ two } three six, eliminating 2{ four five }. I found a way (thanks to Q&A), but it looks rather clunky (and I get a "Use of initiated value" in my second regex test). Is there a shorter way, like grep or map (though I like this one because it doesn't create a new array)? Golf anyone?

#!/usr/bin/perl -w use strict; my @array = qw( one 1{ two } three 2{ four five } six ); my $i = 0; my $start; while ( $i <= $#array ) { if ($start && $array[$i] =~ /}/) { splice @array, $i, 1; undef $start; $i++; } if ($start || $array[$i] =~ /2{/) { $start = 1; splice @array, $i, 1; } else { $i++; } } print @array;

Thanks all!

Update: fixed spelling and clarity


—Brad
"Don't ever take a fence down until you know the reason it was put up. " G. K. Chesterton

Replies are listed 'Best First'.
Re: A better way to splice between 2 elements in array
by Aristotle (Chancellor) on Aug 07, 2004 at 21:01 UTC
    #!/usr/bin/perl use strict; use warnings; my @array = qw( one 1{ two } three 2{ four five } six ); @array = grep ! ( /2{/ .. /}/ ), @array; print "@array";

    See perlop about .. in scalar context, the flip-flop operator.

    Makeshifts last the longest.

      Thanks Aristotle, you have me shaking my head. A great lesson indeed. I read the perlop and believe you were referring to:

      In scalar context, ``..'' returns a boolean value. The operator is bistable, like a flip-flop, and emulates the line-range (comma) operator of sed, awk, and various editors. Each ``..'' operator maintains its own boolean state. It is false as long as its left operand is false. Once the left operand is true, the range operator stays true until the right operand is true, AFTER which the range operator becomes false again.

      Thanks again.


      —Brad
      "Don't ever take a fence down until you know the reason it was put up. " G. K. Chesterton