[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Omaha.pm] Could use your help



On Jan 18, 2007, at 11:38 AM, kiran bina wrote:
FILE: Has a lot of entries in random order of entries of my interest. I am interested in selected few whose name I wish to get from IN using the subroutine Problem: This prints only 'C' even when I have entries in IN which should allow printing A or B.
I think I do not have my return statement at the right place.

while <FILE>
{
   $string= 'Foo';
   $status= find_member_status($string)
      if ($string eq $status)
        {
           if (defined $object)
             {
  Print "A";
             }
             else
             {
 Print "B";
             }
         }
        else
        {
               Print "C";
        }
}


sub find_member_status
{
    my $name= shift;
    my $rval= 'NA';
    my $no_match_name;
    while (my $line=<IN>)
    {
        if ($line=~ /\>/)
        {
            $line=~ m/\>(gi\|\d+\|gb\|\S+\|)/;
            $no_match_name= $1;
            print "Name= $name\n";
            print "After: $no_match_name\n";
            if ($name eq $no_match_name)
             {
               $rval= $no_match_name;
               # return $rval;
                last;
            }

        }
    }
                return $rval;
}

Hmm... I think down here

    $line=~ m/\>(gi\|\d+\|gb\|\S+\|)/;
    $no_match_name= $1;
    print "Name= $name\n";
    print "After: $no_match_name\n";

your regex is demanding 'gi|' followed by digits, etc.

So $no_match_name will always be undef or start with 'gi|' followed by digits, etc. You should see that when you print "After: $no_match_name" ... ?

So, when we back up to the top:

   $string= 'Foo';
   $status= find_member_status($string)
      if ($string eq $status)

$status will always be undef or start with 'gi|' followed by digits. So it will never eq 'Foo'.

Perhaps you meant to test if $status *contains* 'Foo'?

   if ($status =~ /\Q$string\E/)

?

HTH,

j