Perl 编程/高级输出
在许多情况下,特别是对于 Web 编程,你会发现你想要在你的文本中放入一些东西,比如反斜杠或引号,这些东西在传统的 print 语句中是不允许的。像这样的语句
print "I said "I like mangos and bananas". ";
将无法工作,因为解释器会认为引号标记字符串的结尾。就像 Perl 中的所有东西一样,这个问题有很多解决方案。
解决这个问题最快的办法是使用单引号来包围字符串,允许在中间使用双引号。
# I said "I like mangos and bananas". print 'I said "I like mangos and bananas".';
这显然不是最好的解决方案,因为可以想象你正在尝试打印包含两种引号的字符串
# I said "They're the most delicious fruits". print 'I said "They're the most delicious fruits".';
对于像上面那样只引用少量文本的情况,一个常见的解决方案是 *转义* 字符串中的任何引号。在任何引号之前加上一个反斜杠,它们就会被视为文字字符。
print 'I said "They\'re the most delicious fruits".';
print "I said \"They\'re the most delicious fruits\".";
使用单引号,需要转义的字符是\'.
使用双引号,需要转义的字符是变量 sigils,(即$@%*)以及\"
使用\来转义保留字符当然意味着你还需要转义字符串中要使用的任何反斜杠。要使用 perl 打印第二行,你需要写
print " print \"I said \\\"They\\\'re the most delicious fruits\\\".\";"
幸运的是,Perl 为我们提供了另一种引用字符串的方法,可以避免这个问题。
Perl 提供了运算符q和qq它允许你决定哪些字符用于引用字符串。大多数标点符号都可以使用。以下是一些例子
print qq{ I said "They're the most delicious fruits!". };
print q! I said "They're the most delicious fruits\!". !;
我发现的唯一不能用于这些引号的符号是$ ` /
正如所见,虽然自定义引号选项适用于短字符串,但如果要输出很多包含很多标点符号的文本,它可能会遇到问题。对于这种情况,可以使用称为块引用的技术。
print <<OUTPUT
I said "They're the most delicious fruits!".
OUTPUT
;
在上面的例子中,任何字符的字符串都可以用来代替 OUTPUT。使用这种技术,任何东西都可以输出,无论它包含什么字符。这种方法唯一的注意事项是,关闭的 OUTPUT 必须是行上的第一个字符,前面不能有任何空格。
print <<EverythingBetween
...
...
EverythingBetween
使用这些方法中的某些方法,可以输出字符串中的变量
my $one = 'mangoes';
print "I like $one."; # I like mangoes.
print 'I like $one.'; # I like $one.
print qq@ I love $one.@; # I love mangoes.
print q#I love $one.#; # I love $one.
print <<OUT
I love $one
OUT
; # I love mangoes
print <<'OUT'
I love $one
OUT
; # I love $one
如果变量后的字符既不是字母,也不是数字,也不是下划线,Perl 会找出你的变量在哪里结束。如果不是这种情况,请将你的变量放在花括号中
my $one = 'lemon';
print "A $one is too sour; "; # A lemon is too sour;
print "${one}ade is better.\n"; # lemonade is better.
print <<OUT
I love ${one}s in $one souffle.
OUT
; # I love lemons in lemon souffle.
单引号' q{和双引号" qq <<A运算符的行为有所不同。当使用双引号时,你可以包含变量并转义任何字符,而当你使用单引号时,你只能转义单引号,并且不能包含变量。