我在理解 /e 正则表达式修饰符的简单用法时遇到了一些困难。
my $var = 'testing';
$_ = 'In this string we are $var the "e" modifier.';
s/(\$\w+)/$1/ee;
print;
返回:“在此字符串中,我们正在测试“e”修饰符。”
我不明白为什么需要两个“e”修饰符。据我所知, $1 应该从字符串中捕获“$var”,然后单个“e”修饰符应该能够用变量的值替换该变量。然而,我一定是误解了一些东西,因为仅使用一个“e”修饰符尝试上述代码并不能明显地替换字符串中的任何内容。
不好意思问这么简单的问题!
Thanks.
这不完全是一个“简单”的问题,所以不要自责。
问题是,用一个单一的/e
,RHS 被理解为代码,其eval
的结果用于替换。
那个 RHS 是什么?它是$1
。如果您评价$1
,你发现包含字符串 $var
。它不包含所述变量的内容,只是$
随后是一个v
随后是一个a
随后是一个r
.
因此你必须评估它两次,一次是为了转动$1
into $var
,然后再次将之前的结果转为$var
到字符串中"testing"
。你可以通过双倍来做到这一点ee
上的修饰符s操作员 http://perldoc.perl.org/perlop.html#s%2fPATTERN%2fREPLACEMENT%2fmsixpodualgcer.
您可以通过运行它来轻松检查这一点/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.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)