Мое решение похоже на решение Манни, но я рекомендую использовать while
для построчного чтения файла. Вы можете использовать substr (), как он, но регулярное выражение с якорями и без квантификаторов будет довольно быстрым:
my @barcodes;
while( <$fh> )
{
next unless m/^Barcode:\*([0-9]{5})/;
push @barcodes, $1;
}
В зависимости от того, что еще я делал, я мог бы вместо этого просто использовать карту. Выражение карты находится в контексте списка, поэтому оператор m // возвращает список совпадений в любых скобках:
my @barcodes = map { m/^Barcode:\*([0-9]{5})/ } <$fh>;
Я подозреваю, что любой реальный ответ содержал бы немного больше кода, чтобы предупредить вас о строках, которые начинаются с Barcode:
, но в которых отсутствует номер. Мне еще предстоит встретить идеальный входной файл:)
Якорь \ G получает совпадение с регулярным выражением, в котором вы остановились с последним совпадением в той же строке, в данном случае сразу после двоеточия:
my @barcodes;
while( <$fh> )
{
next unless m/^Barcode:/;
unless( m/\G\*([0-9]{5])/ )
{
warn "Barcode is missing number at line $.\n";
next;
}
push @barcodes, $1;
}