Perl标识符中允许哪些字符?

时间:2011-01-26 00:10:14

标签: perl unicode identifier

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

  

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

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

编辑:澄清一下,找到文档很容易(比如谷歌搜索python identifiers)。我不参加“谷歌搜索”课程。

4 个答案:

答案 0 :(得分:29)

Perl整数常量

Perl中的整数常量可以是

    如果他们以^0x 开头,则在基数16中
  • 如果以^0b
  • 开头,则在基数2中
  • 如果以0
  • 开头,则在基数8中
  • 否则他们在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?"}的标量包变量,而是{{1}包。好吧,当然,除非当前包是What包。类似What$Who's包中的$s变量。

其中一个也可以包含Who 标识符 ${^形式的标识符;这些不被视为符号表中的符号引用。

单独使用单个字符的标识符可以是标点字符,包括}$$

标识符也可以是%!形式,它可以是控制字符,也可以是非控制字符所包含的抑扬符。

如果这些都不成立,则(非完全限定的)标识符遵循与具有属性$^C的字符相关的Unicode规则,后跟具有属性ID_Start的字符。但是,它允许以允许所有数字标识符和标识符开头(并且可能没有其他内容)作为下划线。你通常可以假装(但它只是假装)就像说ID_Continue,其中\w+Annex C of UTS#18中所述。也就是说,任何具有以下任何内容的东西:

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

所以[0-9]或者

^\d+$
如果你不关心探索Unicode ID_Start和ID_Continue属性的复杂性,那么

应该为非常简单的那些做。这就是它真正做到的,但我打赌你的导师不知道这一点。也许不会告诉他,呃?

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

我们还没有谈过包。

标识符中的

Perl包

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

包装分隔符可以随心所欲地^[\p{Alphabetic}\p{Decimal_Number}\p{Mark}\p{Connector_Punctuation}]+$ ::

如果包是完全限定标识符中的第一个组件,则不必指定包,在这种情况下,它表示包'。这意味着main$::foo等同于$'foo,而$main::foo等同于isn't_it() (Typo removed)

最后,作为特殊情况,允许在散列末尾使用尾部双冒号(但不是单引号),然后引用该名称的符号表。

因此isn::t_it()%main::符号表,因为您可以省略main,main也是如此。

同时%::%foo::符号表,foo%main::foo::只是为了庸俗。

摘要

很高兴看到教练为人们提供非平凡的任务。问题是教练是否意识到这是非平凡的。可能不是。

它也不仅仅是Perl。关于Java标识符,你有没有弄清楚教科书是什么?这是演示:

%::foo::

是的,这是真的。对于许多其他代码点也是如此,特别是如果在编译行上使用$ 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: ^[ 。您的工作是找到描述这些令人吃惊的不受禁用的Java标识符的模式。 提示确保包含代码点U + 0000。

那边,你问的不高兴吗?希望这可以帮助。或者其他的东西。 ☺

答案 1 :(得分:5)

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

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

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

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

[我只讨论了标识符部分。我刚刚注意到这个问题比那个更大]

答案 2 :(得分:5)

Perl文档的perlvar页面最后有一个section,大致概述了允许的语法。总结:

  1. 字母,数字,下划线和特殊序列::(或')的任意组合,前提是字母或下划线。
  2. 一系列数字。
  3. 单个标点字符。
  4. 单个控制字符,也可以写为插入符号{letter},例如^W
  5. 以控制字符开头的字母数字字符串。
  6. 请注意,除了集合1中的标识符之外的大多数标识符或者由Perl赋予特殊含义,或者是保留的,并且可以在以后的版本中获得特殊含义。但是如果你只想弄清楚什么是有效的标识符,那么在你的情况下这并不重要。

答案 3 :(得分:1)

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

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