Как мога да попреча на Perl да интерпретира \ като екраниращ знак?

Как мога да отпечатам адресен низ, без да накарам Perl да приеме наклонените черти като екраниращи знаци? Не искам да променям низа, като добавям и още екраниращи знаци.


person kk.    schedule 22.01.2010    source източник
comment
Бихте ли публикували кода, който причинява проблема?   -  person David Norman    schedule 22.01.2010
comment
Съжалявам, няма да имате късмет. `\` е символът за екраниране и ако искате да имате буквален, трябва да го екранирате.   -  person Chris Lutz    schedule 22.01.2010


Отговори (4)


Това, за което питате, се нарича интерполация. Вижте документацията за Quote-Like Operators на perldoc perlop, но по-конкретно начинът да го направите е със синтаксиса, наречен тук-документ, комбиниран с единични кавички:

Единичните кавички показват, че текстът трябва да се третира буквално, без интерполация на съдържанието му. Това е подобно на единични низове в кавички, с изключение на това, че обратните наклонени черти нямат специално значение, като \ се третират като две обратни наклонени черти, а не като една, както биха направили във всяка друга конструкция в кавички.

Това е единствената форма на цитиране в perl, където няма нужда да се притеснявате за избягване на съдържание, нещо, което генераторите на кодове могат и използват добре.

Например:

my $address = <<'EOF';
[email protected]\with\backslashes\all\over\theplace
EOF

Може да искате да прочетете за различните други оператори за цитиране, като qw и qq (в същия документ, както споменах по-горе), тъй като те са много често използвани и правят добра стенограма за други по-дълги начини за избягване на съдържание.

person Ether    schedule 22.01.2010
comment
И аз се сетих за това! По някаква причина си помислих, че все пак ще интерполира обратните наклонени черти. Глупавият Python ме кара да бъркам интерполацията на низове. (Единствената бележка, която трябва да добавите към този отговор е, че това добавя евентуално нежелано добавяне на нов ред в края на данните.) - person Chris Lutz; 22.01.2010
comment
@Chris: наистина, в който случай substr() или chomp() ще го оправят добре. - person Ether; 22.01.2010
comment
Не забравяйте обаче, че можете да избегнете ' и \ дори в низове с единични кавички. Трябва да променя документите, за да отбележа това. :) - person brian d foy; 22.01.2010

Използвайте единични кавички. Например

print 'lots\of\backslashes', "\n";

дава

lots\of\backslashes

Ако искате да интерполирате променливи, използвайте оператора ., както в

$var = "pesky";
print 'lots\of\\' . $var . '\backslashes', "\n";

Забележете, че трябва да избегнете обратната наклонена черта в края на низа.

Като алтернатива можете да използвате join:

print join("\\" => "lots", "of", $var, "backslashes"), "\n";

Бихме могли да дадем много по-полезни отговори, ако ни дадете примерен код.

person Greg Bacon    schedule 22.01.2010

Зависи от какво избягвате, но подобните на Quote оператори може да помогнат.

Вижте man страницата на perlop.

person pavium    schedule 22.01.2010

Използвайте обратната наклонена черта два пъти,

print "This is a backslah character \\";
person Sridharan Gopal    schedule 27.04.2013