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

前端之家收集整理的这篇文章主要介绍了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.f2er.com/Perl/173256.html

猜你在找的Perl相关文章