Re: Regex Multi line match
Am Dienstag, 8. März 2005 17.20 schrieb William Melanson: Greetings, Greetings too :-) This is the multi line pattern in which I wish to match: tr tdb String 1.2.3.4.5.6 /b/td tdimg src=pics/green.gif alt=OK/td tr This is what I have: == #!/usr/bin/perl -w my $file='./index.html'; open INFILE, $file or die Can't open $file: $!; while (INFILE) { if (/^tr\n ^tdb String 1\.2\.3\.4\.5\.6 /b/td\n ^tdimg src\=\pics/green\.gif\ alt\=\OK\/td\n ^tr\n/smx) { print($_); } } close INFILE; == What have I been overlooking? that while (INFILE) reads just _one_ line at the time :-) [...] -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/ http://learn.perl.org/first-response
Re: Regex Multi line match
This is the multi line pattern in which I wish to match: tr tdb String 1.2.3.4.5.6 /b/td tdimg src=pics/green.gif alt=OK/td tr One way to solve this would be to read lines from the file and save chunks of N lines (4 in this case) in a temp variable. Then your regex would operate on enough of the file to have a chance of working. Something like (untested): my (@lines, $num) = ((), 4); while (INPUT) { push @lines, $_; shift @lines if @lines == $num+1; print 'lines '.($.-$num+1).' to '.($.). match\n if join('',@lines) =~ /regex goes here/; } -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/ http://learn.perl.org/first-response
Re: Regex Multi line match
On Tue, 8 Mar 2005 13:42:44 -0500, Dave Gray [EMAIL PROTECTED] wrote: This is the multi line pattern in which I wish to match: tr tdb String 1.2.3.4.5.6 /b/td tdimg src=pics/green.gif alt=OK/td tr One way to solve this would be to read lines from the file and save chunks of N lines (4 in this case) in a temp variable. Then your regex would operate on enough of the file to have a chance of working. Something like (untested): my (@lines, $num) = ((), 4); while (INPUT) { push @lines, $_; shift @lines if @lines == $num+1; print 'lines '.($.-$num+1).' to '.($.). match\n if join('',@lines) =~ /regex goes here/; } That assumes that the pattern being searched for will begin 4n lines from the beginning of the file, but just because we're looking for four lines doesn't mean the file is written in four line chunks. In fact, it probably isn't. Why don't you tell us what you're actually trying to do here; I'm guessing the goal isn't to search through a file for a literal string and then print it. If you knew what you were looking for, you wouldn't need to seach the file; you could just print it. So is the ultimate goal to perform a substitution? Count the number of occurrances? What? If it's a single, reasonably sized file, try something like: my @lines = (); my $text = join '', @lines; $text =~ /regex/ ; If it's too big to hold in memory, things get a little more interesting. HTH, --jay -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/ http://learn.perl.org/first-response
Re: Regex Multi line match
Something like (untested): my (@lines, $num) = ((), 4); while (INPUT) { push @lines, $_; shift @lines if @lines == $num+1; print 'lines '.($.-$num+1).' to '.($.). match\n if join('',@lines) =~ /regex goes here/; } That assumes that the pattern being searched for will begin 4n lines from the beginning of the file, but just because we're looking for four lines doesn't mean the file is written in four line chunks. In fact, it probably isn't. Er, no it doesn't. Read it again. It's a rolling n-line chunk of the file. Why don't you tell us what you're actually trying to do here; I'm guessing the goal isn't to search through a file for a literal string and then print it. If you knew what you were looking for, you wouldn't need to seach the file; you could just print it. So is the ultimate goal to perform a substitution? Count the number of occurrances? What? Now this I agree with. -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/ http://learn.perl.org/first-response
Re: Regex Multi line match
Dave Gray wrote: This is the multi line pattern in which I wish to match: tr tdb String 1.2.3.4.5.6 /b/td tdimg src=pics/green.gif alt=OK/td tr One way to solve this would be to read lines from the file and save chunks of N lines (4 in this case) in a temp variable. Then your regex would operate on enough of the file to have a chance of working. Something like (untested): my (@lines, $num) = ((), 4); You are assigning the list ((), 4) to @lines and nothing to $num. Perhaps you meant: my ( $num, @lines ) = ( 4, () ); Or simply: my ( $num, @lines ) = 4; John -- use Perl; program fulfillment -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/ http://learn.perl.org/first-response
Re: Regex Multi line match
On Tue, 8 Mar 2005 15:26:28 -0500, Dave Gray [EMAIL PROTECTED] wrote: Something like (untested): my (@lines, $num) = ((), 4); while (INPUT) { push @lines, $_; shift @lines if @lines == $num+1; print 'lines '.($.-$num+1).' to '.($.). match\n if join('',@lines) =~ /regex goes here/; } That assumes that the pattern being searched for will begin 4n lines from the beginning of the file, but just because we're looking for four lines doesn't mean the file is written in four line chunks. In fact, it probably isn't. Er, no it doesn't. Read it again. It's a rolling n-line chunk of the file. You are correct, I misread. --j -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/ http://learn.perl.org/first-response
Re: Regex Multi line match
my (@lines, $num) = ((), 4); You are assigning the list ((), 4) to @lines and nothing to $num. Perhaps you meant: my ( $num, @lines ) = ( 4, () ); Or simply: my ( $num, @lines ) = 4; Indeed, good catch. -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/ http://learn.perl.org/first-response