Мое обычное 'x' использование было:
print("#" x 78, "\n");
Который связывает 78 раз строку "#". Но недавно я столкнулся с этим кодом:
while (<>) { print if m{^a}x }
Который печатает каждую строку входа, запускающегося с 'a'. Я понимаю regexp соответствие части (m {^a}), но я действительно не вижу то, что это 'x' делает здесь.
Любое объяснение ценилось бы.
Это модификатор для регулярного выражения. Модификатор x
указывает Perl игнорировать пробелы и комментарии внутри регулярного выражения.
В вашем примере кода это не имеет значения, потому что в регулярном выражении нет пробелов или комментариев.
«x» в вашем первом случае - это оператор повторения, который принимает строку в качестве левого аргумента и количество повторов в качестве правого аргумента. Perl6 может копировать списки с помощью оператора повторения «xx».
Во втором примере используется регулярное выражение m {^ a} x
. Хотя вы можете использовать много разных типов разделителей, новички могут использовать знакомую нотацию, в которой используется косая черта: m / ^ a / x
«x» в регулярном выражении называется модификатором или flag и является лишь одним из многих необязательных флагов, которые можно использовать. Он используется для игнорирования пробелов в шаблоне регулярного выражения, но также позволяет использовать внутри обычные комментарии. Поскольку шаблоны регулярных выражений могут быть очень длинными и запутанными, использование пробелов и комментариев очень полезно.
Ваш пример очень короткий (все, что он говорит, это если первая буква строки начинается с «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
В этом варианте использования 'x' - это модификатор регулярного выражения, который «увеличивает удобочитаемость вашего шаблона, разрешая пробелы и комментарии». согласно документации perl. Однако здесь это кажется лишним