2010-06-30 2 views
5

использования моего обычного 'X' было:фанки 'X' в Perl

print("#" x 78, "\n"); 

конкатенация 78 раз строки "#". Но недавно я натолкнулся на этот код:

while (<>) { print if m{^a}x } 

Что печатает каждую строку ввода, начинающуюся с символа 'a'. Я понимаю часть соответствия регулярного выражения (m {^ a}), но я действительно не вижу, что здесь делает «x».

Любое объяснение будет оценено.

ответ

18

Это модификатор для регулярного выражения. Модификатор x сообщает perl игнорировать пробелы и комментарии внутри регулярного выражения.

В вашем примере кода это не имеет значения, потому что в регулярном выражении нет пробелов или комментариев.

+0

Благодарим Вас за это ясное объяснение. –

+1

Возможно, стоит отредактировать упоминание о том, что вы можете получить это через 'perldoc perlre'; это даже на первой странице! – leander

5

В этом случае «х» является модификатором регулярных выражений, который «расширяет удобочитаемость вашего шаблона, разрешая пробелы и комментарии». согласно документации perl. Однако здесь представляется излишним

+2

Не «избыточное», но «ненужное». –

+3

@clintp: и разница между избыточным (что означает «ненужным») и ненужным? –

+1

«избыточное» означает не просто «ненужное». Это означает «ненужное из-за чего-то другого, которое служит той же цели». В этом случае нет ничего, что могло бы заставить регулярное выражение игнорировать пробелы/комментарии. Там просто нет пробелов/комментариев, поэтому нет необходимости игнорировать их. – pkaeding

6

«x» в вашем первом случае, является оператором повторения, который берет строку в качестве левого аргумента и количество раз, чтобы повторить в качестве правильного аргумента. Perl6 может копировать списки, используя оператор повторения «xx».

В следующем примере используется регулярное выражение m{^a}x. Хотя вы можете использовать разные типы разделителей, неофиты могут использовать знакомые обозначения, в которых используется косая черта: m/^a/x

«x» в регулярном выражении называется модификатором или флагом и является лишь одним из многих необязательные флаги, которые могут быть использованы. Он используется, чтобы игнорировать пробелы в шаблоне регулярных выражений, но также позволяет использовать обычные комментарии внутри. Поскольку шаблоны регулярных выражений могут быть очень длинными и запутанными, использование пробелов и комментариев очень полезно.

Ваш пример очень короткий (все, что он говорит, это если первая буква строки начинается с «a»), поэтому вам, вероятно, не нужны пробелы или комментарии, но вы могли бы, если бы захотели.


Пример:

m/^a  # first letter is an 'a' 
     # <-- you can put more regex on this line because whitespace is ignored 
     # <-- and more here if you want 
/x 
+0

спасибо vol7ron, я не знал, что вы можете добавлять комментарии в regex – 2010-07-04 17:31:14

Смежные вопросы