Символ |
используется для чередования в регулярном выражении.Вам нужно избежать этого, если вы хотите сопоставить буквальный символ |
:
m/^\s*\|\s+(.+)/
Кроме того, если я собираюсь рискнуть предположением, я бы сказал, что причина всегда сводится к "провалу"подпрограмма из-за этого регулярного выражения.С чередованием (как написано) оно соответствует любой строке, которая начинается с \s*
ИЛИ \s+(.+)
, что буквально является любой строкой из-за оператора звездочки в \s*
.
Редактировать: Что касается вашего комментария, эти примеры не будут сопоставлены ни с одним из ваших регулярных выражений из-за привязки (^
).Если мы возьмем, например, строку ping 4.2.2.2; pwd
, то получится, что механизм регулярных выражений начинает сопоставлять начало строки, потому что она привязана.Начальный \s*
совпадает правильно, повторяя ноль раз, фактически ничего не делая в этом случае.Затем он ищет совпадение ;
, но следующий символ - 4
, таким образом, он терпит неудачу.То же самое относится и ко второй строке, которую вы указали.Это также сломалось бы, если бы после ;
не было пробела, так как вы использовали \s+
.
Честно говоря, если вы действительно хотите просто запретить любую строку, даже содержащую символы <
, >
, ;
, |
или &
, проще всего было бы просто вставить их всех в класс персонажа и сравнить с ним, используя m/[&;|<>]/g
.Поскольку это регулярное выражение не занято, оно будет соответствовать в любой точке строки.Это полностью запретило бы эти символы, означая, что они не могут появляться в строках или в чем-либо подобном.Возможно, это не то, что вам нужно, но это применимо к правилам, которые вы в настоящее время сформулировали («Предполагается, что пять регулярных выражений соответствуют любому тексту, который содержит & или; или <или> или |»).