【问题标题】:What do Perl identifiers starting with an asterisk * represent?以星号 * 开头的 Perl 标识符代表什么?
【发布时间】:2016-05-07 02:11:46
【问题描述】:

我有这个子例程,它的标识符定义如下

*VALID_NAME_REG_EX = \"[ a-zA-Z0-9_#.:@=-]+";
*MACRO_VALID_NAME  = \"MACRO_VALID_NAME";

我进一步查看了文件。它们被称为$MACRO_VALID_NAME

我猜它是用字符串的右侧替换值,但我不确定这一点并想要确认。

【问题讨论】:

标签: regex perl


【解决方案1】:
*VALID_NAME_REG_EX = \"[ a-zA-Z0-9_#.:@=-]+";

这样做的效果是将$VALID_NAME_REG_EX 指定为Perl 字符串文字"[ a-zA-Z0-9_#.:@=-]+" 的标识符

这和说的不一样

$VALID_NAME_REG_EX = "[ a-zA-Z0-9_#.:@=-]+"

将字符串复制到分配给$VALID_NAME_REG_EX的空间中,以便以后可以更改

Perl 文字必须是只读的才能有意义,因此赋值的结果是使$VALID_NAME_REG_EX 成为一个只读 变量,也称为常量。如果您尝试分配给它,您将收到类似的消息

尝试修改只读值

【讨论】:

  • @mattfreake:不是 typeglob 使它成为只读的,而是它指向一个 Perl 字符串文字,它本质上是不可修改的。如果我说*var_b = \$var_a,那么我已经让$var_b 指向与$var_a 相同的位置,即读写
  • 嗨@Borodin,您能否分享更多关于为什么 $VALID_NAME_REG_EX 在这种情况下是只读的?我发布了一个新问题:stackoverflow.com/questions/53190329/…
【解决方案2】:

perl 中的* 表示typeglob

Perl 使用称为 typeglob 的内部类型来保存整个符号表条目。 typeglob 的类型前缀是 * ,因为它代表所有类型。这曾经是通过引用将数组和散列传递给函数的首选方式,但现在我们有真正的引用,这很少需要。

现代 Perl 中 typeglob 的主要用途是创建符号表别名。本次作业:

*this = *that;

使$this 成为$that 的别名,@this 成为@that 的别名,%this 成为%that 的别名,&this 成为&that 的别名等。更安全的是使用参考。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-29
    • 2016-06-17
    • 1970-01-01
    • 2020-08-28
    • 2011-03-05
    • 1970-01-01
    • 2016-04-13
    • 2012-05-07
    相关资源
    最近更新 更多