【问题标题】: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@ 而不是它自己)。但究竟允许什么规则是什么?我注意到您不能使用例如空格或字母(编辑:如果您在运算符名称后放置空格,则允许使用字母)。

【问题讨论】:

  • 您也可以使用相同的大括号/括号,q{a}q}a} 相同(记录在perlop 的某处)
  • @zdim,它们都产生a,但q{...} 并不总是与q}...} 相同。比较q{{}}(产生{})和q}{}}(非法)。

标签: perl quotes


【解决方案1】:

我们在Regex Quote-Like Operators in perlopm/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; 的情况下给出错误。合理,但仍然很糟糕。
猜你喜欢
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 2021-07-16
  • 2014-09-30
相关资源
最近更新 更多