[Israel.pm] how to find lines range (regex)
Yossi Itzkovich
Yossi.Itzkovich at ecitele.com
Tue Mar 25 12:37:16 EET 2008
Thanks for the quick reply.
Assuming I have nested start-stop. How can I get the lines from the
first startPattern to the last stopPattern ?
Yossi
-----Original Message-----
From: perl-bounces at perl.org.il [mailto:perl-bounces at perl.org.il] On
Behalf Of Yitzchak Scott-Thoennes
Sent: Tuesday, March 25, 2008 12:34 PM
To: Perl in Israel
Subject: Re: [Israel.pm] how to find lines range (regex)
On Tue, March 25, 2008 3:06 am, Yossi Itzkovich wrote:
> Hi,
>
>
> What's the best/simple way to find all lines between startPattern and
> StopPattern:
>
>
> @text= ( "ahfdj\n",
> "ksjdf\n",
> "startPattern\n",
> "gjdhgf\n",
> "kljsd\n",
> "stopPattern\n",
> "jsadflj\n");
>
>
> I would like to get a list of those 2 items in the middle
It's easy to get the range *including* the start and stop elements,
and then pull them out.
@text= ( "ahfdj\n",
"ksjdf\n",
"startPattern\n",
"gjdhgf\n",
"kljsd\n",
"stopPattern\n",
"jsadflj\n");
@text_range = grep { /startPattern/ .. /stopPattern/ } @text;
print for @text_range[1..($#text_range-1)];
# or pop(@text_range); unshift(@text_range); print for @text_range;
It's kind of obscure doing it in one go:
print for grep { (/startPattern/../stopPattern/)=~/(?:[2-9]|\d\d)\z/
}
@text
Both of those assume startPattern won't appear again after stopPattern.
A more brute-force kind of way:
@text_range = @text; # copy if original array shouldn't be modified
while ((unshift(@text_range) // last) !~ /startPattern/) {}
while ((pop(@text_range) // last) !~ /stopPattern) {}
_______________________________________________
Perl mailing list
Perl at perl.org.il
http://perl.org.il/mailman/listinfo/perl
More information about the Perl
mailing list