Ваш первый регулярное выражение соответствует третьей строке
my $re = qr/^(?!.*compiled)(?!.*min).*$/;
while(<DATA>) {
chomp;
if (/$re/) {
say 'OK : ', $_;
} else {
say 'KO';
}
}
__DATA__
cake/app/webroot/js/compiled/shop.js
cake/app/webroot/js/compiled/shop.min.js
cake/app/webroot/js/good/thing.js
Выход:
KO
KO
OK : cake/app/webroot/js/good/thing.js
Когда вы добавляете .*
в начале, оно совпадает со всей строкой, тогда отрицательный прогноз - истина, нет compiled
или min
после того, как регулярное выражение использует все символы, поэтому совпадение истинно.