所以这是我的样本
while (<FH>) {
my $line = $_;
chomp($line);
my $marksearchpat= "href=\"\@X\@EmbeddedFile\.requestUrlStub\@X\@bbcswebdav\/xid";
my $markreplacepat= "href=\"http:\/\/www\.facepalm\.org\/bbcswebdav\/xid";
## (Mark) Duplicate input file lines to "altered" file, making substitutions as necessary.
$linenumber++;
print "Line $linenumber Has Been Read\n";
my $line2=$_;
$line2=~s/$marksearchpat/$markreplacepat/eig;
print WHOUT $line2;
print WHLOG 'At '.localtime().', I replaced '. $marksearchpat .' with '. $markreplacepat .' at line '.$linenumber.' of file '.$file."\n";
如何将正则表达式变量(正则表达式匹配变量)添加到$ marksearchpat和$ markreplacepat
答案 0 :(得分:1)
你无法用
做任何事情s/$search_pat/$replace/
因为插值根本不解释插值。这就是你添加/e
。
s/$search_pat/$replace_code/e
在上面,$replace_code
的值应该是Perl代码。 $replace_code
中的最后一个表达式计算的是替换字符串。那么Perl代码会做什么呢?以下任何一种都可以:
'http://www.facepalm.org/bbcswebdav/xid-' . $1
"http://www.facepalm.org/bbcswebdav/xid-$1"
要将其放在$replace_code
中,我们可以使用以下任何一项:
my $replace_code = '"http://www.facepalm.org/bbcswebdav/xid-$1"';
my $replace_code = q{"http://www.facepalm.org/bbcswebdav/xid-$1"};
my $replace_code = q{'http://www.facepalm.org/bbcswebdav/xid-' . $1};
etc
所以我们最终得到:
my $search_re = qr{href="\K\@X\@EmbeddedFile\.requestUrlStub\@X\@bbcswebdav/xid-([0-9]{9}_2)};
my $replace_code = q{"http://www.facepalm.org/bbcswebdav/xid-$1"};
s/$search_re/$replace_code/gie;
从技术上讲,不需要使用前瞻来捕获任何东西:
my $search_re = qr{href="\K\@X\@EmbeddedFile\.requestUrlStub\@X\@bbcswebdav/xid-(?=[0-9]{9}_2)};
my $replace_code = q{"http://www.facepalm.org/bbcswebdav/xid-"};
s/$search_re/$replace_code/gie;
这也意味着我们不需要/e
:
my $search_re = qr{href="\K\@X\@EmbeddedFile\.requestUrlStub\@X\@bbcswebdav/xid-(?=[0-9]{9}_2)};
my $replace_str = 'http://www.facepalm.org/bbcswebdav/xid-'
s/$search_re/$replace_str/gi;