Почему в этом примере Perl конкатенация строк с экранированными символами работает иначе? - PullRequest
2 голосов
/ 02 ноября 2011

там: я новичок в Perl, и у меня проблема с конкатенацией строк.У меня есть две строки ниже:

my $string1 = "hello\U\Q \t\n\f\b\aWorld" . "\n" . "\E";
my $string2 = "hello\U\Q \t\n\f\b\aWorld\n\E";

Они выглядят одинаково для меня, пока я не распечатаю их.$string1 выглядит следующим образом:

hello\ \    \
\
 \WORLD

и с звонком.

$string2 это:

hello\ \    \
\
 \WORLD\

с тем же звонком,и обратная косая черта в хвосте.

Почему $string2 получает обратную косую черту в конце, а $string1 нет?

Ответы [ 2 ]

10 голосов
/ 02 ноября 2011

Когда вы используете \Q, вы говорите ему заключать в кавычки (ставьте обратную косую черту перед) все символы, которые не соответствуют \w. В результате вы получаете обратную косую черту каждый раз, когда в вашем коде есть обратная косая черта. например \a создает звук колокольчика, но к вашей строке добавляется обратный слеш. Когда вы используете \Q, он ведет себя так, пока не достигнете \E или до конца строки.

Когда вы создаете $string1, у вас фактически есть 3 отдельные строки, которые вы добавляете вместе, поэтому они оцениваются отдельно. В результате \Q.

влияет только на первый из трех элементов.

Во втором примере \n\E приводит к \\ в строке. Когда вы распечатываете это, это приводит к появлению обратной косой черты.

Надеюсь, что это имеет смысл.

7 голосов
/ 02 ноября 2011

Поскольку \Q заключает в кавычки любые метасимволы (включая "\") до \E или до конца строки. Если вы хотите, чтобы они печатали одинаково, используйте:

my $s1 = "hello\U\Q \t\n\f\b\aWorld" . "\Q\n" . "\E";

Для проверки:

my $s2 = "hello\U\Q \t\n\f\b\aWorld\n\E";
$s1 eq $s2 && print '$s1 is equal to $s2', "\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...