Могу ли я разбить регулярное выражение Perl на несколько строк в моем коде?

170
16

Мне просто интересно, могу ли я разбить длинное регулярное выражение, которое у меня есть в моем коде Perl, чтобы оно было написано на нескольких строках? Я просто хочу, чтобы читаемость и компактность были неповрежденными для всех, кто мог бы просмотреть мой код после его завершения. Я ищу что-то похожее на то, как строки разбиваются на несколько строк в Perl. Например:


print "This is a string that is ". #1st line
"very long, so it is on 2 lines!"; #2nd line
# prints = "This is a string that is very long, so it is on 2 lines!"

Я не уверен, как это сделать с регулярным выражением, поскольку он не использует кавычки. Если я нажимаю кнопку ввода, я предполагаю, что он поместит новый символ строки в мое регулярное выражение, сделав его ошибочным. Я хотел бы сделать что-то вроде:


if($variable_1 = /abcde_abcde_abdcae_adafdf_      #1st regex line
abscd_casdf_asdfd_....asdfaf/){ #regex continued
# do something
} # regex looking for pattern = abcde_abcde_abdcae_adafdf_abscd_casdf_asdfd_....asdfaf

спросил(а) 2021-01-25T15:51:06+03:00 4 месяца, 4 недели назад
1
Решение
208

Использовать модификатор без пробелов


На странице руководства perlre (1) говорится:


Модификатору "/x" нужно немного больше объяснений. Он сообщает анализатор регулярных выражений, чтобы игнорировать большинство пробелов, которые не являются назад или в классе символов. Вы можете использовать это, чтобы разбить ваше регулярное выражение в (слегка) более читаемые части.



Вы можете использовать это для создания многострочных выражений. Например:

/
abcde_abcde_abdcae_adafdf_ # Have some comments, too.
abscd_casdf_asdfd_....asdfaf # Here your second line.
/x

Литеральные пространства


Если ваше совпадение будет содержать пробелы, вы должны сделать их явными в своем регулярном выражении при использовании модификатора /x. Например, /foo bar baz quux/x не будет соответствовать строке, разделенной пробелом, как вы могли бы ожидать. Вместо этого вам нужно что-то вроде следующего:


print "true\n" if
/
foo
\s+ # You need explicit spaces...
bar
\s+ # because the modifier will...
baz
\s+ # otherwise ignore literal spaces.
quux
/x;

ответил(а) 2021-01-25T15:51:06+03:00 4 месяца, 4 недели назад
141

Да, см. /x modifier на странице man perlre.

ответил(а) 2021-01-25T15:51:06+03:00 4 месяца, 4 недели назад
46

Используйте символ +. Вот пример:


push @steps, $steps[-1] +
$radial_velocity * $elapsed_time +
$orbital_velocity * ($phase + $phase_shift) -
$DRAG_COEFF * $altitude;

ответил(а) 2021-01-25T15:51:06+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема