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

Rei*_*ica 10 unicode perl identifier

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

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

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

编辑:澄清一下,找到文档很容易(比如谷歌搜索python标识符).我不参加"谷歌搜索"课程.

tch*_*ist 31

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
Run Code Online (Sandbox Code Playgroud)

请参阅3 const,以及稍后的negate操作码?这告诉你一堆,包括优先的好奇心.

Perl标识符

通过符号解除引用指定的标识符对其名称完全没有任何限制.

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

还可以具有表单${^标识符的标识符} ; 这些不被视为符号表中的符号解引.

单独使用单个字符的标识符可以是标点符号,包括$$%!.

标识符也可以$^C是一种形式,它可以是控制字符,也可以是非控制字符所包含的抑扬符.

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

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

所以^\d+$无论如何

^[\p{Alphabetic}\p{Decimal_Number}\p{Mark}\p{Connector_Punctuation}]+$
Run Code Online (Sandbox Code Playgroud)

如果你不关心探索Unicode ID_Start和ID_Continue属性的复杂性,应该为真正简单的那些做.这就是它真正做到的,但我打赌你的导师不知道这一点.也许不会告诉他,呃?

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

我们还没有谈过包装.

标识符中的Perl包

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

该包分离器或者是::'在您的心血来潮.

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

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

因此%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: ^[
Run Code Online (Sandbox Code Playgroud)

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

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

  • 请注意Brendan - 如果你真的想向你的老师提出这个War和Piece大小的答案,作为文档的一部分,说明为什么你的Perl标识符regex需要2页,并且他开始质疑被引用者的理智,请告诉他提供答案的人可以轻松地写一本关于Perl编程的书. (5认同)
  • @Brendan:我确信你的导师也不认为这会很难.我担心在这里有如此多的学术追求,获得好成绩的最好方法是给出你期望的答案,而不是试图准确地模拟现实的答案,这个现实远比给予分配的人复杂得多.可想而知的. (5认同)

ike*_*ami 5

作业要求您使用参考手册,所以我将用这些术语回答.

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

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

$ perl -E'use utf8; $é=123; say $é'
123
Run Code Online (Sandbox Code Playgroud)

[我只讨论了标识符部分.我只是注意到问题比这更大]

  • 学习新语言总是好的.它为您提供了解决许多问题的新视角. (7认同)
  • @Brendan:与Perl相比,Python正则表达的"错误"并非如此:真实和完整的Unicode支持,包括没有这种广泛的构建,[UTS#18标准符合](http://www.unicode) .org/reports/tr18 /),[结构化语法正则表达式](http://stackoverflow.com/questions/764247/why-are-regular-expressions-so-controversial/4053506#4053506)用于将声明与执行分开,像`s/\((?:[^()]*+ |(?0))*\)// g`这样的东西的递归来剥离嵌套的parens,定制属性和套管,回溯控制,调试和仪器,&c&c&c! (7认同)
  • @Brendan:关键是你可以实时完成真正的工作. (4认同)

Ano*_*on. 5

Perl文档的perlvar页面末尾有一个部分,大致概述了允许的语法.综上所述:

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

请注意,除了集合1中的标识符之外的大多数标识符要么被Perl赋予特殊含义,要么被保留,并且可能在以后的版本中具有特殊含义.但是如果你只想弄清楚什么是有效的标识符,那么在你的情况下这并不重要.

  • 我担心这代表了一个**非常简化的现实版本.您将不得不检查词法分析器的`scan_ident`函数,以及`UTF8_IS_START`,`isALNUM_utf8`和`UTF8_IS_CONTINUED`宏.对于第一近似,标识符仅包含字母,Mark,Decimal_Number或Connector_Punctuation类型字符.你也忘记了MJD风格的变量,如`$ {^ TAINT}`和`$ {^ UNICODE}`.但这并不意味着你不能拥有`$ {"!##%^& - !!" }`类型变量; 那些是完全有效的.他们只是不能成为词汇.**HTH &&手!** (7认同)
  • @Anon:"找到文档是一种分心"?**异教徒!** (3认同)