2013-06-17 1 views
0

동적 교체 정규 표현식을 처리하기 위해 eval을 사용하고 있습니다. 왼쪽의 값 캡처 ($ 1)가 정규 표현식의 오른쪽에 사용되지 않습니다. 도움이 될 것입니다.

#!/usr/bin/perl 
use strict; 

my $string = "test-txt"; 

# Attempt 1 
my $regexp_m = '-(\S+)$'; 
my $regexp_r = '.$1'; 
my $string2 = eval{ $string =~ s/$regexp_m/$regexp_r/; return $string; }; 

# Attempt 2 
my $regexp = 's/(\S+)$/.$1/'; 
my $string3 = eval{ $string =~ $regexp; return $string; return $string; }; 

print "Attempt 1: $string2\n"; 
print "Attempt 2: $string3\n"; 

exit; 

출력 : 시도 1. 시험 $ 1 시도 2. 시험 $ 1

답변

0

로서 daxim 코멘트 this answer by Ysth은 용액을 포함한다. 그 결과를 평가 후면

문자열로 오른쪽을 평가하십시오 Perl documentation는에 /ee 정규식 수정을 사용할 수 있습니다 말한다.

Ysth는 대체 정규 표현식의 오른쪽으로 '".$1"'을 전달합니다. /ee 수정자는 먼저이 문자열을 ".$1"으로 평가합니다. 그 후 을 eval으로 바꿔 첫 번째 캡처 그룹을 만듭니다.

근무 예 :

my $string = 'test-txt'; 
my $regexp_m = '-(\S+)$'; 
my $regexp_r = '".$1"';  # Note the double quotes, so it's a string in a string 
$string =~ s/$regexp_m/$regexp_r/ee; 
print "$string\n";