Ваше регулярное выражение говорит следующее:
/^ - if the line starts with
( - start a capture group
Clinton| - "Clinton"
| - or
[^Bush] - Any single character except "B", "u", "s" or "h"
| - or
Reagan) - "Reagan". End capture group.
/i - Make matches case-insensitive
Итак, другими словами, ваша средняя часть регулярного выражения сводит вас с ума.Поскольку это группа типа «ловить все», она разрешает любую строку, которая не начинается ни с одной из прописных или строчных букв в «кусте».Например, эти строки будут соответствовать вашему регулярному выражению:
Our president, George Bush
In the news today, pigs can fly
012-3123 33
Вы либо делаете отрицательный прогноз, как предлагалось ранее, либо просто делаете два регулярных выражения:
if( ($string =~ m/^(Clinton|Reagan)/i) and
($string !~ m/^Bush/i) ) {
print "$string\n";
}
Как mirod указал в комментариях, вторая проверка совершенно не нужна при использовании каретки (^
) для сопоставления только с началом строк, поскольку строки, начинающиеся с «Клинтона» или «Рейгана», никогда не могут начинатьсяс "Бушем".
Однако это было бы справедливо без карет.