gpt4 book ai didi

perl - Perl 标识符中允许使用哪些字符?

转载 作者:行者123 更新时间:2023-12-02 06:59:49 28 4
gpt4 key购买 nike

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

Using language reference manuals online determine the regular expressions for integer numeric constants and identifiers for Java, Python, Perl, and C.



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

编辑:澄清一下,查找文档很容易(就像在 Google 上搜索 python identifiers 一样)。我没有参加“进行 Google 搜索”的类(class)。

最佳答案

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 的函数与 arugments (100, 200) .
  • 另一个,${"What’s up, doc?"}引用当前包中该名称的标量包变量。
  • 另一方面,${"What's up, doc?"}指的是名称为 ${"s up, doc?"} 的标量包变量并且不在当前包中,而是在 What 中包。好吧,除非当前包是 What包,当然。类似 $Who's$s Who 中的变量包。

  • 还可以使用形式为 ${^ 的标识符。标识符 } ;这些不被视为符号表中的符号解引用。
    单个字符的标识符可以是标点字符,包括 $$%! .
    标识符也可以采用 $^C 的形式, 可以是控制字符或后跟非控制字符的抑扬符。
    如果这些都不是真的,(非完全限定的)标识符遵循与具有属性 ID_Start 的字符相关的 Unicode 规则。其次是拥有房产 ID_Continue的人.但是,它在允许全数字标识符和以下划线开头(并且可能没有其他任何内容)的标识符中覆盖了这一点。您通常可以假装(但实际上只是假装)这就像在说 \w+ ,其中 \wAnnex C of UTS#18 中所述.也就是说,任何具有以下任何一项的东西:
  • 字母属性——包括的不仅仅是字母;它还包含各种组合字符和 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::foo , 和 isn't_it()相当于 isn::t_it() . (Typo removed)
    最后,作为一种特殊情况,允许在散列末尾使用尾随双冒号(但不是单引号),然后引用该名称的符号表。
    因此 %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。
    有,你不高兴吗?希望这可以帮助。或者其他的东西。 ☺

    关于perl - Perl 标识符中允许使用哪些字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4800275/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com