Из справочной страницы perlre:
Однако вы можете пожелать рассматривать строку как
многострочный буфер, такой, что «^» будет соответствовать после любой новой строки
внутри строки (кроме случаев, когда символ новой строки является последним символом в
строка), и "$" будет соответствовать перед любой новой строкой. За счет
немного больше накладных расходов, вы можете сделать это с помощью модификатора / m на
оператор сопоставления с образцом. (Старые программы делали это путем установки $ *, но
эта практика была удалена в Perl 5.9.)
Поэтому убедитесь, что $ * или, возможно, другие предопределенные переменные не мешают.
Тем не менее, даже $ * модифицированное выражение типа / abcd ^ $ / im (обратите внимание на добавленный флаг "m") не будет ничего совпадать, потому что символ "^" соответствует только после новой строки.
Кроме того, убедитесь, что регулярное выражение не перегружено. Если импортированный пакет делает что-то вроде этого:
use overload;
sub import {
overload::constant(qr => sub { $_ = shift; s/^abcd//; $_ });
}
Тогда пустые строки будут соответствовать вашему регулярному выражению.
Кроме того, не знаю, является ли это регулярным выражением в вашем коде, и оно может быть неактуальным, но просто чтобы быть в безопасности, вы не должны неявно сопоставлять $ _, а явно указывать переменную: "$ str = ~ /abcd^$/i;".
$ _ имеет динамическую область видимости, поэтому, если у вас есть какие-либо вызовы функций, которые могут изменить $ _ в зависимости от того, где вы его определяете и где находится регулярное выражение, или если вы добавите их позже, вас ждет сюрприз:)