-1

So here's my sample

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"; 

How do I add a regex variable (A regex match variable)to the $marksearchpat and to the $markreplacepat

4

1 回答 1

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;
于 2012-06-11T23:09:51.307 回答