如何将变量添加到正则表达式? (Perl的)

时间:2012-06-11 21:37:53

标签: perl

所以这是我的样本

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

1 个答案:

答案 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;