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