2017-02-19 12 views
3

Как я могу напечатать строку (одиночную кавычку), содержащую символы с двойным обратным слепом \\, так как это не делает Perl каким-то образом интерполируя его на однослое \? Я не хочу изменять строку, добавив еще несколько символов escape.Как я могу предохранить Perl от интерпретации двойного обратного слэша в качестве символа обратной обратной косой черты?

my $string1 = 'a\\\b'; 
print $string1; #prints 'a\b' 

my $string1 = 'a\\\\b'; 
    #I know I can alter the string to escape each backslash 
    #but I want to keep string as is. 
print $string1; #prints 'a\\b' 

#I can also use single-quoted here document 
#but unfortunately this would make my code syntactically look horrible. 
my $string1 = <<'EOF'; 
a\\b 
EOF 
print $string1; #prints a\\b, with newline that could be removed with chomp 
+0

Позвольте мне угадать ... дело с файловыми путями Windows? – Schwern

+0

Нет. Я передаю строки с одной кавычкой в ​​подпрограммы, и эти строки содержат двойную обратную косую черту. – Omar

+0

Ох. Не могли бы вы привести пример? Вам не нужно избегать двойных кавычек внутри одинарных кавычек. «Она сказала», вам не нужно избегать двойных кавычек в одинарных кавычках. »« Все в порядке. Поэтому используется 'qq []', если вы хотите интерполяцию, но не хотите избегать двойных кавычек. – Schwern

ответ

9

только процитировать построить в Perl, который не интерпретирует обратные косую черту вообще является единственным цитируемым документом здесь:

my $string1 = <<'EOF'; 
a\\\b 
EOF 
print $string1; # Prints a\\\b, with newline 

Потому что здесь-документы являются построчными, это неизбежно, что вы будете получите новую строку в конце строки, но вы можете удалить ее с помощью chomp.

Другие методы просто для того, чтобы жить с ним и правильно сбрасывать ваши строки (для небольших объемов данных) или размещать их в разделе __DATA__ или внешнем файле (для больших объемов данных).

+1

Я этого не знал! – Schwern

+0

Решение с одним кавычками здесь для каждой строки, которое у меня есть, сделает мой код синтаксически выглядящим ужасным. – Omar

+0

@ Омар хорошо, я просто излагаю факты.Вы можете сбрасывать обратную косую черту, вы можете использовать heredocs, или вы можете хранить эти пути где-то иначе, чем в исходном файле Perl. Насколько я знаю, нет никаких других разумных вариантов, поэтому выберите тот, который вам не нравится. :) – hobbs

0

Поскольку интерполяция обратной косой черты происходит в строковых литералах, возможно, вы могли бы объявить свои литералы с помощью другого произвольного символа, а затем заменить их на что-то еще позже.

my $string = 'a!!!b'; 
$string =~ s{!}{\\}g; 
print $string; #prints 'a\\\b' 

Конечно, это не должно быть !, любой символ, который не вступает в противоречие с нормальным характером в строке будет делать. Вы сказали, что вам нужно сделать несколько строк, так что вы могли бы поставить замену в функции

sub bs { 
    $_[0] =~ s{!}{\\}gr 
} 

my $string = 'a!!!b'; 
print bs($string); #prints 'a\\\b' 

P.S. Эта функция использует неразрушающий модификатор замещения /r, представленный в v5.14. Если вы используете более старую версию, то функция должна быть написана как этого

sub bs { 
    $_[0] =~ s{!}{\\}g; 
    return $_[0]; 
} 

Или, если вы хотите что-то более читаемый

sub bs { 
    my $str = shift; 
    $str =~ s{!}{\\}g; 
    return $str; 
} 
6

Если вы слегка сумасшедшие, и как идея используя экспериментальное программное обеспечение, которое обманывает внутренности perl для улучшения эстетики вашего кода, с сегодняшнего утра вы можете использовать модуль Syntax::Keyword::RawQuote, на CPAN.

use syntax 'raw_quote'; 
my $string1 = r'a\\\b'; 
print $string1; # prints 'a\\\b' 

Благодаря @melpomene для вдохновения.

+0

Это вдохновляет. – zdim