У меня есть эта примерная строка, содержащая 2 обратных слэша. ...
my $string = "use Ppppp\\Ppppp;";
Извините, но вы ошиблись — эта строка содержит только одну обратную косую черту*, так как \\
— это escape-последовательность в строках с двойными (и одинарными) кавычками, которая создает одиночную обратную косую черту. См. также "Операторы Quote и Quote-like" в perlop а>. Если ваша строка действительно содержит две обратные косые черты, вам нужно написать "use Ppppp\\\\Ppppp;"
или использовать heredoc, например:
chomp( my $string = <<'ENDSTR' );
use Ppppp\\Ppppp;
ENDSTR
Если вы хотите, чтобы строка выводилась как допустимый исходный код Perl (используя его экранирование), вы можете использовать один из нескольких вариантов:
my $string = "use Ppppp\\Ppppp;";
# option 1
use Data::Dumper;
$Data::Dumper::Useqq=1;
$Data::Dumper::Terse=1;
print Dumper($string);
# option 2
use Data::Dump;
dd $string;
# option 3
use B;
print B::perlstring($string);
Каждый из них будет печатать "use Ppppp\\Ppppp;"
. (Конечно, доступны и другие модули. Лично мне нравится Data::Dump
. Data::Dumper
— это основной модуль.)
Использование одного из этих модулей также является лучшим способом проверить, что ваша $string
переменная на самом деле содержит.
Если это все еще не соответствует вашим потребностям: предыдущее редактирование вашего вопроса гласило: "Как я могу правильно экранировать все специальные символы, включая обратную косую черту?" — вам нужно будет указать полный список этих символов. вы считаете спец. Вы можете сделать что-то вроде этого, например:
use 5.014; # for s///r
my $string = "use Ppppp\\Ppppp;";
print $string=~s/(?=[\\])/\\/gr;
Это напечатает $string
с удвоенной обратной косой чертой без изменения $string
. Вы также можете добавить больше символов в класс символов регулярного выражения, чтобы добавить обратную косую черту перед этими символами.
* Обновление: Так что здесь я не кажусь слишком педантичным: конечно, исходный код Perl содержит две обратные косые черты. Но есть разница между буквальным исходным кодом и тем, что в конечном итоге содержит строка Perl, точно так же, как строка "Foo\nBar"
содержит символ новой строки вместо двух буквальных символов \
и n
.
Для полноты картины, как уже обсуждалось в комментариях: \Q\E
(он же quotemeta
) в первую очередь предназначен для экранирования любых специальных символов, которые могут быть специфическими для регулярных выражений (все символы ASCII, не соответствующие /[A-Za-z_0-9]/
), поэтому он также экранирует пробелы и точку с запятой.
Поскольку вы упоминаете внешние файлы: если вы читаете строку, такую как use Ppppp\\Ppppp;
, из внешнего файла, то строка Perl будет содержать две обратные косые черты, а если вы print
, она также покажет две обратные косые черты. Но если вы хотите представить эту строку как исходный код Perl, вам нужно написать "use Ppppp\\\\Ppppp;"
(или использовать один из других методов из вопроса, на который вы ссылались а>).
person
haukex
schedule
22.01.2019
\Q\E
, который внутренне представляет собой просто интерполированную форму функции quotemeta, экранирует все символы ASCII, кроме[A-Za-z_0-9]
, как задокументировано . В частности, это означает, что пробелы будут экранированы. Что именно вы хотите избежать? - person Grinnz   schedule 22.01.2019my $str = 'use Proxy\\\\Proxy;';
— вам нужно экранировать обратную косую черту, чтобы включить их в строковые литералы в Perl, за исключением здесь-документы в одинарных кавычках или в строках в одинарных кавычках, если за ними не следует одинарная кавычка или другая обратная косая черта. - person Grinnz   schedule 22.01.2019\Q\E
не будет делать то, что ты хочешь; их работа состоит в том, чтобы избежать чего-то, что обычно означает добавление обратной косой черты. - person zdim   schedule 22.01.2019\Q\E
- избежать любых символов, которые могут быть особенными для регулярных выражений. Кажется, вам нужна какая-то другая схема экранирования, поэтому вам нужно сказать, для чего, и дать полный список того, что вы считаете всеми специальными символами, включая обратную косую черту. Может быть, вы ищете что-то вродеpp
изData::Dump
? Кроме того, важно отметить, что строка Perl"use Proxy\\Proxy;"
содержит только одну обратную косую черту. - person haukex   schedule 22.01.2019Data::Dump
? Если он показывает"use Proxy\\Proxy;"
, опять же, эта строка содержит только один символ обратной косой черты. Если он показывает"use Proxy\\\\Proxy;"
, то строка действительно содержит два символа обратной косой черты. Вам нужно сделать ту же проверку строки, которую вы ищете. - person haukex   schedule 22.01.2019"use Proxy\\Proxy;"
буквально в своей программе, вы создадите строкуuse Proxy\Proxy;
, потому что синтаксический анализатор Perl таким образом обрабатывает обратную косую черту в строковых литералах в кавычках, так что это то, что будет содержать ваша строка; но если вы прочитаете из файла текстuse Proxy\\Proxy;
в строку, у вас будет именно этот текст. - person Grinnz   schedule 22.01.2019print
а>. Как и Гриннз, я думаю, что путаница здесь, и то, что все пытаются сказать, может быть в том, что когда вы пишете"use Proxy\\Proxy;"
в исходном коде Perl, эта строка имеет только одну обратную косую черту. - person haukex   schedule 22.01.2019print
. - person melpomene   schedule 22.01.2019print
печатает только то, что есть в строке. Это не делает никакой дополнительной интерпретации. - person melpomene   schedule 22.01.2019