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.

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...