




Вы экранируете конвейер один раз слишком часто, вместо этого эффективно избегая обратной косой черты.
print "YES!" if ($line =~ m/^\|\s\|/);
Что о:
m/^\|\s*\|/
Спасибо. Я пробовал это раньше, но похоже, что совпадений нет. Это то, что заставило меня попробовать двойную обратную косую черту. Спасибо вам за помощь.
\ S * будет соответствовать нулю или более пробельных символов, когда, согласно вопросу, он хочет сопоставить ровно один пробельный символ.
Символ вертикальной черты следует экранировать одной обратной косой чертой в регулярном выражении Perl. (Регулярные выражения Perl немного отличаются от регулярных выражений POSIX. Если вы используете это, скажем, в grep, все будет немного по-другому.) Если вы специально ищете пробел между ними, используйте неэкранированное пространство. Они вполне приемлемы в регулярном выражении Perl. Вот краткая программа тестирования:
my @lines = <DATA>;
for (@lines) {
print if /^\| \|/;
}
__DATA__
| | Good - space
|| Bad - no space
| | Bad - tab
| | Bad - beginning space
Bad - no bars
Если вы ищете буквальную строку, вам не нужно регулярное выражение.
my $search_for = '| |';
my $search_in = whatever();
if ( substr( $search_in, 0, length $search_for ) eq $search_for ) {
print "found '$search_for' at start of string.\n";
}
Или было бы проще сделать это:
my $search_for = '| |';
my $search_in = whatever();
if ( 0 == index( $search_in, $search_for ) ) {
print "found '$search_for' at start of string.\n";
}
Вы также можете посмотреть на quotemeta, если хотите использовать литерал в регулярном выражении.
Ваше решение работает только в том случае, если пробел является пробелом. Он не работает, если это любой другой пробел, например символ табуляции.
Удалите ^ и двойные обратные косые черты. ^ Заставляет строку быть в начале строки. Поскольку вы ищете все совпадения в одной строке, вероятно, это не то, что вам нужно.
m/\|\s\|/
Вы должны предоставить больше контекста, если это не сработало.