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

Hello Monks, I'm trying to solve a problem that I'm having with my code. Basically I'm grabbing a block of text as a string; the block consist of defined header strings for exmaple: A (it is the header of first string) then B, C & D for any subsequent string. all four constitude a block. On "D" string there is a value that I'm trying to match. Just to be exact, it is located in sequence 8. it is where the number resides. For some reason I cannot get to the value. I'm wondering if you have any ideas on how to solve this problem... Thanks in advance
A|string| B|string| C|string| D|string|
Here is the code:
#!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 $acct = ""; my @field; my %newblock; my %partofblock; my @accounts = qw(77403 77404 77406 77407 77408 77409 77411 77412 7741 +3 77414 77416 77418); my $infile = 'c:/testfile.txt'; my $outfile = 'c:/idxfile.txt'; open IN, "<$infile" or die "Couldn't open $infile, $!"; open OUT,">$outfile" or die "Couldn't open $outfile, $!"; $newblock{$_} = 1 for qw(MSH); $partofblock{$_} = 1 for qw(EVN PID FT1); while (<IN>) { 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") { foreach $acct (@accounts) { if ($field[8] = $acct ) { $suppress = 1; } } } $buffer .= "$_\n"; } processbuffer(); sub processbuffer { print OUT $buffer unless $suppress; $buffer=""; $suppress = 0; }

Replies are listed 'Best First'.
Re: Find a value from an array in a string
by Thelonius (Priest) on Mar 13, 2003 at 19:43 UTC
    Three notes:
    1. Did you remember that arrays are zero-based? Is it $field[8] you want or $field[7]?
    2. You didn't chomp() your input line, so the last field will have a newline at the end. Hey! That's my bug!
    3. You would do better with a hash for the accounts
    my %skipaccount; $skipaccount{$_} = 1 for qw(77403 77404 77406 77407 77408 77409 77411 +77412 77413 77414 77416 77418); later: $suppress = 1 if $skipaccount{$fields[8]};
      Dear Monk, I appreciate your help. I owe you a million. Could you tell me if there may be any other way that I could match the array number to the number located in Sequence 8 on the FT1 line.?? Thanks in advance.
      while (<IN>) { chomp(); 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[7] == $skipaccount{$_}) { $suppress = 1 if $skipaccount{$field[7]}; } } $buffer .= "$_\n"; } processbuffer(); sub processbuffer { print OUT $buffer unless $suppress; $buffer=""; $suppress = 0; }
      MSH|^~\&||||||||||||| EVN||||| PID||||||||||||||||||||| FT1|||||||77413| MEV|||||||||||||||||||
        Instead of:
        if ($field[0] eq "FT1") { if ($field[7] == $skipaccount{$_}) { $suppress = 1 if $skipaccount{$field[7]}; } }
        you just need:
        if ($field[0] eq "FT1") { $suppress = 1 if $skipaccount{$field[7]}; }
        Of course there are a lot of ways to do it--TMTOWTDI
Re: Find a value from an array in a string
by diotalevi (Canon) on Mar 13, 2003 at 19:28 UTC

    I don't understand your data. Please provide a better set of example data. You were very unclear on how your data is structured.

      This is just an example
      MSH|^~\&||||||||||||| EVN||||| PID||||||||||||||||||||| FT1|||||||77413| MEV|||||||||||||||||||
      The number that I'm trying to match with the array (@accounts) is located in FT1, Sequence 8 or position 8 "77413". I'll appreciate your help.