If I'm understanding the specs in a comment and your regex, perhaps the following will be helpful:
use strict;
use warnings;
# Remove (exclude) lines beginning with "bl", "BL" or "_" and releases
+ with a label with xx.yy.zzz.nnn(n)
while (<DATA>) {
print unless /^(?:bl|_)|\.\d{3}\.\d{3,}$/i;
}
__DATA__
_STUDYABCD1234_1.00
_STUDYABCD1234_1.00.5678
STUDYABCD1234_1.00
STUDYABCD1234_1.00.000
p_STUDYABCD1234_1.00.000
p_STUDYABCD1234_1.00.000.5678
bl_STUDYABCD1234_1.00.000
bl_STUDYABCD1234_1.00.000.5678
BL_STUDYABCD1234_1.00.000
BL_STUDYABCD1234_1.00.000.5678
Output:
STUDYABCD1234_1.00
STUDYABCD1234_1.00.000
p_STUDYABCD1234_1.00.000
The regex:
/^(?:bl|_)|\.\d{3}\.\d{3,}$/i
^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | |
| | | | | | | | + - Case-insensitive
| | | | | | | + - From the end of the string
| | | | | | + - Three or more digits
| | | | | + - A decimal point
| | | | + - Three digits
| | | + - A decimal point
| | + - OR
| + - Match either "bl" or "_"
+ - From the beginning of the string
The script just skips (excludes) those lines that you don't want, instead of making them blank.