加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 引用 – 捕获 – 问题

发布时间:2020-12-14 02:29:49 所属栏目:百科 来源:网络整理
导读:有人可以解释一下,为什么我可以两次使用$1并得到不同的结果? perl -wle '"ok" =~ /(.*)/; sub { "huh?" =~ /(.*)/; print for @_ }-( "$1",$1 )' (发现于:How to exclude submatches in Perl?) @_参数数组的行为与您的想法不同.子程序中@_中的值实际上是 a
有人可以解释一下,为什么我可以两次使用$1并得到不同的结果?
perl -wle '"ok" =~ /(.*)/; sub { "huh?" =~ /(.*)/; print for @_ }->( "$1",$1 )'

(发现于:How to exclude submatches in Perl?)

@_参数数组的行为与您的想法不同.子程序中@_中的值实际上是 aliases for the real arguments:

The array @_ is a local array,but its elements are aliases for the actual scalar parameters.

当你这样说:

sub s {
    "huh?" =~ /(.*)/;
    print for @_;
}

"ok" =~ /(.*)/;   
s("$1",$1);

s的第一个参数中的$1立即通过字符串插值计算,但第二个参数未被计算,只是注意到子版本@_中的第二个值是$1(实际变量$1,而不是其值) .然后,在s中,正则表达式改变$1的值.现在,你的@_有一个字符串“ok”的别名,后跟$1的别名,这些别名由循环中的print解析.

如果您将功能更改为:

sub s {
    my @a = @_;
    "huh?" =~ /(.*)/;
    print for @a;
}

甚至这个:

sub s {
    local $1;
    "huh?" =~ /(.*)/;
    print for @_;
}

然后你会得到你期待的两行“ok”.有趣的(有趣的,特别的,不好笑的ha-ha)是这两个版本的s由于不同的原因产生你的预期结果.我的@a = @_;在正则表达式获得$1之前,version会在@_中提取别名的当前值; local $1; version将$1变量本地化为sub,将别名保留在@_引用来自sub外部的$1版本:

A local modifies the listed variables to be local to the enclosing block,file,or eval.

像这样的奇怪是为什么你应该总是尽快将编号的正则表达式捕获变量的值复制到你的变量中,以及为什么要在函数开头解包@_(除非你知道为什么你不想要要做到这一点).

希望我没有过多地剔除术语,这是Perl的那些奇怪的角落之一,我一直远离,因为我不喜欢杂耍剃刀刀片.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读