You have to buffer each block. You need to know which segments are part of a block and which start a new block. The code will look something like this: #!perl -w
my ($fs, $cs, $rs, $ec, $ss);
setdelimiters('|^~\&');
sub setdelimiters {
($fs, $cs, $rs, $ec, $ss) = map {quotemeta} split //, $_[0];
}
use strict;
my $buffer="";
my $suppress = 0;
my @field;
my %newblock;
my %partofblock;
# Note: This is just an example. I do not know all segments that star
+t a new block
$newblock{$_} = 1 for qw(MSH);
$partofblock{$_} = 1 for qw(EVN PID PV1 FT1);
while (<>) {
if (/^(MSH)(.....)/) {
setdelimiters($2);
}
@field = split /$fs/;
if ($newblock{$field[0]}) {
processbuffer();
} elsif (!$partofblock{$field[0]}) {
print STDERR "Possible error: segment=$field[0] line $.\n";
}
if ($field[0] eq "FT1") {
if ($field[_WHATEVER_] == 123456) {
$suppress = 1;
}
}
$buffer .= "$_\n";
}
processbuffer();
sub processbuffer {
print $buffer unless $suppress;
$buffer="";
$suppress = 0;
}
|