微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一点麻烦理解这个简单的使用/ 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.

原文地址:https://www.jb51.cc/Perl/173256.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐