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

Perl Regex’e'(eval)修饰符与s ///

发布时间:2020-12-15 21:23:16 所属栏目:大数据 来源:网络整理
导读:我有一点麻烦理解这个简单的使用/ e regex修饰符。 my $var = 'testing';$_ = 'In this string we are $var the "e" modifier.';s/($w+)/$1/ee;print; 返回:“在这个字符串中,我们测试”e“修饰符。 我不明白为什么需要两个’e’修饰符。就我可以看到,$
我有一点麻烦理解这个简单的使用/ e regex修饰符。
my $var = 'testing';
$_ = 'In this string we are $var the "e" modifier.';

s/($w+)/$1/ee;

print;

返回:“在这个字符串中,我们测试”e“修饰符。

我不明白为什么需要两个’e’修饰符。就我可以看到,$ 1应该从字符串捕获’$ var’,然后单个’e’修改器应该能够替换变量的值。我必须误解一些东西,不过,因为尝试上面的代码只有一个“e”修饰符不会明显替代字符串中的任何东西。

对不起,问这样一个简单的问题!

谢谢。

解决方法

这不是一个“简单”的问题,所以不要打败自己。

问题是,使用单个/ e,RHS被理解为其求值结果用于替换的代码。

什么是RHS?这是$ 1。如果你评价$ 1,你会发现包含字符串$ var。它不包含所述变量的内容,只是$后面跟着一个v,后面跟着一个a,后面跟着一个r。

因此,必须评估两次,一次将$ 1转换为$ var,然后再次将$ var的上一个结果转换为字符串“testing”。你通过在s operator双重ee修改器。

你可以很容易地检查这一点,运行它与一个/ E或其中两个。这里是一个演示二,加上使用符号解引用的第三种方式 – 因为它引用包符号表,只适用于包变量。

use v5.10;

our $str = q(In this string we are $var the "e" modifier.);
our $var = q(testing);

V1: {
    local $_ = $str; 
    s/($w+)/$1/e;
    say "version 1: ",$_;

}

V2: {
    local $_ = $str;
    s/($w+)/$1/ee;
    say "version 2: ",$_;
}

V3: {
    no strict "refs";
    local $_ = $str;
    s/$(w+)/$$1/e;
    say "version 3: ",$_;
}

运行时,产生:

version 1: In this string we are $var the "e" modifier.
version 2: In this string we are testing the "e" modifier.
version 3: In this string we are testing the "e" modifier.

(编辑:李大同)

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

    推荐文章
      热点阅读