Hi Becky,
It would be interesting to know how $string gets its value. It appears you are only getting it one line at a time, which is why you only get the first match. I've modified your program very slightly by adding a loop and it prints out all 3 values from the sample lines you provided.
while (<DATA>) {
if (/\w{1,12}\s+(\d{1,5})\s+[a-zA-Z]{4}/sm){
print $1, "\n";
}
}
__DATA__
BC001593 91 NPSL
BC001593 262 NASS
BC001593 293 NAST
You know your data better than we do, but on the basis of what you've said it looks as though the regex could be simplified or even eliminated through the use of split like so:
while (<DATA>) {
my $pos = (split ' ')[1];
print $pos,"\n";
}
__DATA__
BC001593 91 NPSL
BC001593 262 NASS
BC001593 293 NAST
Just food for thought. This split trick will only work if your value of interest is always the 2nd field on each line.