分类:
2007-01-16 16:50:11
2.6.3 选择自己的引号
尽管我们认为引起是文本值,但在 Perl 里他们的作用更象操作符,提供了多种多样的代换和模式匹配功能。Perl 为这些操作提供了常用的引起字符,还提供了更通用的客户化方法,让你可以为上面任意操作选择你自己的引起字符。在表2-3里,任意非字母数字,非空白分隔符都可以放在 / 的位置。(新行和空格字符不再允许做分隔符了,尽管老版本的 Perl 曾经一度允许这么做。)
表2-3。引起构造
常用 | 通用 | 含义 | 替换 |
' ' | q// | 文本字串 | 否 |
" " | qq// | 文本字串 | 是 |
` ` | qx// | 执行命令 | 是 |
() | qw// | 单词数组 | 否 |
// | m// | 模式匹配 | 是 |
s/// | s/// | 模式替换 | 是 |
y/// | tr/// | 字符转换 | 否 |
" " | qr// | 正则表达式 | 是 |
这里的有些东西只是构成“语法调味剂”,以避免你在引起字串里输入太多的反斜杠,尤其是在模式匹配里,在那里,普通斜杠和反斜杠很容易混在一起。
如果你选用单引号做分隔符,那么不会出现变量代换,甚至那些正常状态需要代换的构造也不发生代换。如果起始分隔符是一个起始圆括弧,花括弧,方括弧,那么终止分隔符就是对应终止字符。(嵌入的分隔符必须成对出现。)比如:
$single = q!I said, "You said, 'she sad it.'"!; $double =qq(can't we get some "good" $variable?); $chunk_of_code = q { if ($condition) { print "Gotcha!"; } };
最后一个例子表明,你可以在引起声明字符和其起始包围字符之间使用空白。对于象s///和tr///这样的两元素构造而言,如果第一对引起是括弧对,那第二部分获取自己的引起字符。实际上,第二部分不必与第一对一样。所以你可以用象s 不过,如果用 # 做为引起字符,就不允许出现空白。q#foo# 被分析为字串 'foo',而 q #foo# 引起操作符 q 后面跟着一个注释。其分隔符将从下一行获取。在两个元素的构造中间也可以出现注释,允许你这样写: tr (a-f)
[A-F];
s{foo} # 把 foo
{bar} # 换为 bar。
tr [a-f] # 把小写十六进制
[A-F]; # 换为大写