使用子程序是否有一种简单的方法可以在Perl中打印字符串而不必转义每个特殊字符?
这就是我想要做的事情:
print DELIMITER <I don't care what is here> DELIMITER
显然,如果我可以将字符串作为分隔符而不是特殊字符,那将会很棒。
答案 0 :(得分:8)
perldoc perlop,在“引用和引用类操作符”下,包含您需要的所有内容。
虽然我们通常将引号视为文字值,但在Perl中它们充当运算符,提供各种插值和模式匹配 能力。 Perl为这些行为提供了惯用的引用字符,但也为您提供了一种为任何行为选择引号字符的方法 他们。在下表中,“{}”表示您选择的任何分隔符对。
Customary Generic Meaning Interpolates '' q{} Literal no "" qq{} Literal yes `` qx{} Command yes* qw{} Word list no // m{} Pattern match yes* qr{} Pattern yes* s{}{} Substitution yes* tr{}{} Transliteration no (but see below) <<EOF here-doc yes* * unless the delimiter is ''.
答案 1 :(得分:4)
$str = q(this is a "string");
print $str;
如果你的意思是带有'特殊字符'的引号和撇号
答案 2 :(得分:3)
您可以使用__DATA__
指令将所有以下行视为可以从DATA
句柄访问的文件:
while (<DATA>) {
print # or do something else with the lines
}
__DATA__
#!/usr/bin/perl -w
use Some::Module;
....
或者您可以使用heredoc:
my $string = <<'END'; #single quotes prevent any interpolation
#!/usr/bin/perl -b
use Some::Module;
....
END
答案 3 :(得分:2)
打印并没有对转义做特殊的事情,双引号字符串正在这样做。您可能想尝试使用单引号字符串:
print 'this is \n', "\n";
在单引号字符串中,必须转义的唯一字符是单引号和在字符串结尾之前发生的反斜杠(即'foo\\'
)。
重要的是要注意插值不适用于单引号字符串,所以
print 'foo is $foo', "\n";
不会打印$foo
。
答案 4 :(得分:1)
您可以使用q
或qq
几乎使用任何字符。例如:
#!/usr/bin/perl
use utf8;
use strict; use warnings;
print q∞This is a test∞;
print qq☼\nThis is another test\n☼;
print q»But, what is the point?»;
print qq\nYou are just making life hard on yourself!\n;
print qq¿That last one is tricky\n¿;
您无法使用qq DELIMITER foo DELIMITER
。但是,你可以使用heredocs产生类似的效果:
print <<DELIMITER
...
DELIMETER
;
或
print <<'DELIMETER'
...
DELIMETER
;
但您的源代码真的丑陋。
答案 5 :(得分:0)
如果你想按字面意思打印一个字符串,你就有了Perl 5.10或更高版本
say 'This is a string with "quotes"' ;
将使用换行符打印字符串。重要的是使用单引号' '
而不是双引号" "