11

我正在做正则表达式作业,其中一个问题是:

使用在线语言参考手册确定 Java、Python、Perl 和 C 的整数数字常量和标识符的正则表达式。

我不需要关于正则表达式的帮助,我只是不知道 Perl 中的标识符是什么样的。我找到了描述CPythonJava的有效标识符的页面,但我找不到任何关于 Perl 的信息。

编辑:澄清一下,查找文档是很容易的(比如在谷歌搜索python 标识符)。我没有参加“做谷歌搜索”的课程。

4

4 回答 4

32

Perl 整数常量

Perl 中的整数常量可以是

  • 以 16 为基数,如果它们以^0x
  • 以 2 为基数,如果它们以^0b
  • 以 8 为基数,如果它们以0
  • 否则它们以 10 为基数。

在该领导者之后是该基数中任意数量的有效数字以及可选的下划线

请注意,数字并不意味着\p{POSIX_Digit};这意味着\p{Decimal_Number},这真的很不一样,你知道的。

请注意,任何前导减号都不是整数常量的一部分,这很容易通过以下方式证明:

$ perl -MO=Concise,-exec -le '$x = -3**$y'
1  <0> enter 
2  <;> nextstate(main 1 -e:1) v:{
3  <$> const(IV 3) s
4  <$> gvsv(*y) s
5  <2> pow[t1] sK/2
6  <1> negate[t2] sK/1
7  <$> gvsv(*x) s
8  <2> sassign vKS/2
9  <@> leave[1 ref] vKP/REFC
-e syntax OK

看到 3 const,以及更晚的negate操作码?这告诉你一堆,包括对优先级的好奇。

Perl 标识符

通过符号解引用指定的标识符对其名称绝对没有任何限制。

  • 例如,100->(200)调用以参数命名100的函数(100, 200)
  • 另一方面,${"What’s up, doc?"}在当前包中按该名称引用标量包变量。
  • 另一方面,${"What's up, doc?"}指的是标量包变量,其名称是${"s up, doc?"}并且不在当前包中,而是在What包中。好吧,除非当前包是What包,当然。Similary$Who's是包中的$s变量Who

一个也可以有标识符形式的${^标识符};这些不被视为对符号表的符号取消引用。

仅具有单个字符的标识符可以是标点符号、include$$%!.

标识符也可以是 形式$^C,它可以是控制字符,也可以是后跟非控制字符的抑扬符。

如果这些都不成立,则(非完全限定)标识符遵循与具有属性的字符相关的 Unicode 规则,ID_Start然后是具有属性的字符ID_Continue。但是,它推翻了这一点,允许全数字标识符和以下划线开头(并且可能没有其他内容)的标识符。您通常可以假装(但实际上只是假装)这就像在说\w+, where \wis as described in Annex C of UTS#18。也就是说,任何具有以下任何一项的东西:

  • Alphabetic 属性——它不仅包括字母;它还包含各种组合字符和 Letter_Number 代码点,以及带圆圈的字母
  • Decimal_Number 属性,而不仅仅是[0-9]
  • 具有 Mark 属性的任何和所有字符,而不仅仅是那些被视为 Other_Alphabetic 的标记
  • 任何具有 Connector_Puncutation 属性的字符,其中下划线就是其中之一。

所以要么^\d+$要么

^[\p{Alphabetic}\p{Decimal_Number}\p{Mark}\p{Connector_Punctuation}]+$

如果您不想探索 Unicode ID_Start 和 ID_Continue 属性的复杂性,那么应该为真正简单的人做这件事。这就是它的真正完成方式,但我敢打赌你的教练不知道这一点。也许有人不会告诉他,嗯?

但是你应该涵盖我之前描述的不简单的那些。

而且我们还没有谈到包。

标识符中的 Perl 包

除了这些简单的规则之外,您还必须考虑标识符可以使用包名进行限定,并且包名本身遵循标识符的规则。

包装分隔符可以::随心所欲'

如果包是完全限定标识符中的第一个组件,则不必指定包,在这种情况下,它表示包main。这意味着类似$::foo$'foo等价于$main::fooisn't_it()等价于isn::t_it()(错字已删除)

最后,作为一种特殊情况,允许在哈希末尾使用尾随双冒号(但不是单引号),然后 this 引用该名称的符号表。

%main::符号表就是这样main,因为你可以省略 main,所以也是%::

同时%foo::foo符号表,%main::foo::%::foo::只是为了变态。

概括

很高兴看到教师给人们布置非平凡的任务。问题是教练是否意识到这不是微不足道的。可能不是。

它也不仅仅是 Perl。关于 Java 标识符,您是否发现教科书在撒谎?这是演示:

$ perl -le 'print qq(public class escape { public static void main(String argv[]) { String var_\033 = "i am escape: ^\033"; System.out.println(var_\033); }})' > escape.java
$ javac escape.java
$ java escape | cat -v
i am escape: ^[

对,是真的。对于许多其他代码点也是如此,尤其是-encoding UTF-8在编译行上使用时。您的工作是找到描述这些令人吃惊的不受禁止的 Java 标识符的模式。提示:确保包含代码点 U+0000。

在那里,你不高兴你问了吗?希望这可以帮助。或者其他的东西。☺</p>

于 2011-01-26T01:44:37.600 回答
5

作业要求你使用参考手册,所以我会用这些术语来回答。

Perl 文档可在http://perldoc.perl.org/获得。处理变量的部分是 perldata。这很容易给你一个有用的答案。

实际上,我怀疑文档中是否提供了完整的答案。有特殊变量(见 perlvar)和“使用 utf8;” 会极大地影响“字母”和“数字”的定义。

$ perl -E'use utf8; $é=123; say $é'
123

[我只介绍了标识符部分。我只是注意到问题比那个更大]

于 2011-01-26T00:18:43.920 回答
5

Perl 文档的 perlvar 页面末尾有一节大致概述了允许的语法。总之:

  1. 字母、数字、下划线和特殊序列::(或')的任意组合,前提是它以字母或下划线开头。
  2. 一串数字。
  3. 单个标点符号。
  4. 单个控制字符,也可以写为插入符号-{字母},例如^W.
  5. 以控制字符开头的字母数字字符串。

请注意,除了 set 1 中的标识符之外,大多数标识符要么被 Perl 赋予了特殊含义,要么被保留并可能在以后的版本中获得特殊含义。但是,如果您只是想弄清楚什么是有效标识符,那么这对您来说并不重要。

于 2011-01-26T00:19:48.157 回答
1

没有官方规范(Perl 是 perl 解释器可以解析的任何东西),这些可能有点难以辨别。

此页面包含所有整数常量格式的示例。标识符的格式需要从 perldoc 中的各个页面推断出来。

于 2011-01-26T00:17:46.100 回答