Perl 5 的 pick-your-own-quotes 运算符的合法分隔符是啥?

Posted

技术标签:

【中文标题】Perl 5 的 pick-your-own-quotes 运算符的合法分隔符是啥?【英文标题】:What are the legal delimiters for Perl 5's pick-your-own-quotes operators?Perl 5 的 pick-your-own-quotes 运算符的合法分隔符是什么? 【发布时间】:2017-09-22 21:21:30 【问题描述】:

perlop 提供了可用于qqqs 等的分隔符的各种示例,包括'/#(以@ 结尾987654328@ 而不是它自己)。但究竟允许什么规则是什么?我注意到您不能使用例如空格或字母(编辑:如果您在运算符名称后放置空格,则允许使用字母)。

【问题讨论】:

您也可以使用相同的大括号/括号,qaqa 相同(记录在perlop 的某处) @zdim,它们都产生a,但q... 并不总是与q... 相同。比较q(产生)和q(非法)。 【参考方案1】:

我们在Regex Quote-Like Operators in perlop 下m/PATTERN/msixpodualngc

使用m,您可以使用任意一对非空白 (ASCII) 字符作为分隔符 [...] 在标识符中使用有效的分隔符时,m 之后需要空格。

因此,如果您想使用单词字符作为分隔符,则需要使用空格将其与运算符分开。这适用于正则表达式和非正则表达式的使用。

$ perl -le'print qq afooa'
foo

您不需要m 的唯一一个是固相线 (/)。 唯一不需要 q 的就是撇号 (')。 唯一不需要 qq 的是引号 (")。 唯一不需要 qx 的是重音 (`)。

显然,必须转义与所选分隔符相同的引号字符。


一个有用的阅读是Gory details of parsing quoted constructs (perlop)

可以在Programming Perl 中的Pick Your Own Quotes 第 2 章 Bits and Pieces 中找到用于一般引用的简化直接规则(第三版)

...可以使用任何非字母数字、非空白分隔符

参考表格很像in perlop。

虽然这直接来自 Camel,但请注意,通过在运算符和字符串之间使用空格,我们也可以使用字母数字分隔符,如开头所示。在use utf8;Unicode may be used as well 下,感谢ysth。

感谢 ikegami 提供 cmets 和编辑。


由于问题是关于确切的规则,我想指出,我在文档中找不到一个全面的陈述。虽然这里的第一个引用是完整的,但它指的是 Regex 的使用。 perlop 中关于一般 Quote-Like 运算符的前面部分没有指定分隔符(虽然同样的规则适用)。

【讨论】:

第二个引用是错误的。您可以使用字母数字分隔符,如答案的前半部分所示。 @ikegami 谢谢...我正在考虑扩充它...这是来自骆驼的文字引述...添加了注释。这很棘手,文档不一定全面。 也可以使用非ascii字符(至少在use utf8;下) @ysth:但是在5.20之前使用s///,需要使用s◆pattern◆◆replacement◆ 但是您不能使用成对的 Unicode 括号:q«foo» 会在有或没有 use utf8; 的情况下给出错误。合理,但仍然很糟糕。

以上是关于Perl 5 的 pick-your-own-quotes 运算符的合法分隔符是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Perl-5.24.0 安装日志

在linux下的如何将perl默认版本5.8.8升级为5.10

从 Perl 5.14 升级到 5.28 后,我的 Perl 找不到 local::lib

如何降级到 perl 5.10.1?

perl 5.8 和 5.10 之间的区别 [关闭]

将 Perl 从 5.6 升级到 5.24