in reply to Regex, Newline, Wilcard
Almost the same as shmem, but I thought I'd use "</TABLE>" as the record separator. That gives you one extra record at the end, which you can easily ignore, but works if you don't have "\n\n". Or flip-flop; or slurp-n-split.
use strict; my $line = '='x60 ."\n"; #&RS; ⃜ #&SlurpAndSplit; sub RS { $/=q{</TABLE>}; while (<DATA>){ if (s|\s*<TABLE (.+?)>|$1|) { chomp; print $line.$_; } } } sub SlurpAndSplit { $/=undef; chomp(my @tables = split(/<\/TABLE>\s*/, <DATA>)); print map { s|<TABLE (.+?)>|$1|; "$line$_" } @tables; } sub DotDot { my @wanted; while (<DATA>) { chomp; if (/<TABLE / .. /<\/TABLE>/ ) { if (/<TABLE (.+?)>/) { push(@wanted,$1); } elsif (/<\/TABLE>/) { print $line, map {"$_\n"} @wanted; @wanted = (); } else { push(@wanted,$_); } } } } __DATA__ <TABLE name="table1"> FieldName1 VARCHAR(20) FieldName2 INT(20) FieldName3 BOOL </TABLE> <TABLE name="table"2> FieldName1 VARCHAR(20) FieldName2 INT(20) FieldName3 BOOL </TABLE>
|
|---|