Я пытаюсь совместить обратную косую черту с последующим символом выхода, например t
, n
, r
, или \
.. как в строке JSON. Для упрощения рассмотрим только \t
и \\
.. Например:Матч обратной косой черты с последующим символом эвакуации
use feature qw(say);
use strict;
use warnings;
use Data::Dump qw(dump);
my @data = (
[q{\t}, qr/\\t/], #ok
["\\", qr/\\/], #ok
["\\", qr/[\\]/], #ok
["\t", qr/\t/], #ok
["\t", qr/[\t]/], #ok
[q{\\\t}, qr/(\\[\\\t])*/], #not ok
[q{\\\t}, qr/(\\\\[\\\\t])*/ ],#ok
);
for my $i (0..$#data) {
my ($str, $regex) = @{$data[$i]};
my $match_result = ($str =~ /^$regex$/) ? "ok" : "not ok";
say(
"$i : "
. dump($str)
. ' =~ '
. dump($regex)
. ' : '
. $match_result
);
}
Выход:
0 : "\\t" =~ qr/\\t/ : ok
1 : "\\" =~ qr/\\/ : ok
2 : "\\" =~ qr/[\\]/ : ok
3 : "\t" =~ qr/\t/ : ok
4 : "\t" =~ qr/[\t]/ : ok
5 : "\\\\t" =~ qr/(\\[\\\t])*/ : not ok
6 : "\\\\t" =~ qr/(\\\\[\\\\t])*/ : ok
Вопрос заключается в том, почему тест # 5 терпят неудачу. Я бы подумал, что это будет правильное регулярное выражение. Что мне здесь не хватает?
Спасибо за приятное разъяснение! Есть, по крайней мере, две вещи, которые я пропустил. Во-первых, двойная обратная косая черта в 'q' считается единственной обратной косой чертой. Таким образом, семь аргументов chararacter для 'q {\\\\\\ t}', становятся строкой длиной 4 символа. Во-вторых, как вы указали, '' t 'становится' \ x09' внутри 'qr'. То, что я хотел сделать для теста № 5, было, вероятно, «[q {\\\\\\ t}, qr/(\\ [t \\]) * /]' –
@ HåkonHægland: похоже, что вы схватил его. Многие не понимают, что в одинарных кавычках * одиночные * обратные косые черты сохраняются и не нуждаются в удвоении. Это означает, что пути Windows, такие как «C: \ Windows \ System32 \ drivers», прекрасны. Единственная проблема возникает, когда вам нужна скрытая обратная косая черта, которая * * должна быть экранирована, или UNC-путь, такой как '\\ SERVER \ backup \ 20150415', должен быть выражен как' \\\ SERVER \ backup \ 20150415 ' '. (На самом деле там нужны только три обратной косой черты, но четыре кажутся лучше.) – Borodin