2014-09-27 6 views
0

언어 번역 프로젝트를 진행 중이며 중간에 어딘가에 붙어 있습니다.문자열 내에서 따옴표 붙은 부분 문자열 수정 및 바꾸기

나는

print "$Hi $There","$Welcome $Aboard" 

같은 문자열이 상황이 내가 싶어

print "Hi There", "Welcome Aboard" 

즉, '$'를 제거, 인용 된 문자열을 추출하고 새로운 원래 교체 부분 문자열.

따옴표로 묶은 부분 문자열을 추출하고 변경할 수는 있지만 원래의 것으로 대체하려고하면 작동하지 않습니다. 샘플 코드를 표시하려면 다음을 수행하십시오.

#!/usr/bin/perl 
use strict; 
use warnings; 

my $str = "print \"\$Hi \$There\",\"\$Welcome \$Aboard\""; 
print "Before:\n$str\n"; 
my @quoted = $str =~ m/(\".*?\")/g; #Extract all the quoted strings 
foreach my $subStr (@quoted) 
{ 
    my $newSubStr = $subStr; 
    $newSubStr =~ s/\$//g; #Remove all the '$' 

    $str =~ s/$subStr/$newSubStr/g; #Replace the string**::Doesn't work** 
} 
print "After:\n$str\n"; 

대체가 실패한 이유는 알 수 없습니다. 도움을 주시면 감사하겠습니다.

답변

0

\Q\E을 정규식에 추가해야합니다. 귀하의 코드는 다음과 같이 작동

#!/usr/bin/perl 
use strict; 
use warnings; 

my $str = "print \"\$Hi \$There\",\"\$Welcome \$Aboard\""; 
print "Before:\n$str\n"; 
my @quoted = $str =~ m/(\".*?\")/g; #Extract all the quoted strings 
foreach my $subStr (@quoted) 
{ 
    my $newSubStr = $subStr; 
    $newSubStr =~ s/\$//g; #Remove all the '$' 

    $str =~ s/\Q$subStr\E/$newSubStr/g; # Notice the \Q and \E 
} 
print "After:\n$str\n"; 

무엇 무슨 일이 벌어지고 있었다 그 예를 들어이처럼 $subStr보기 :이 변수로 $Hi$There을 해석하는 경우 잘 모르겠어요 "$Hi $There"

하지만, 당신이 원하는 것처럼 리터럴 문자열과 일치하지 않았습니다. quotemeta docs에서 \Q\E에 대해 읽을 수 있습니다.

+0

고마워요. 이것은 완벽하게 작동합니다. 필자는 '$ Hi'등을 해석하지 않습니다. 파이썬 코드를 perl로 번역하는 경우, 모든 단어 앞에 '$'를 입력 한 다음 키워드, 문자열 등에서 떼어내는 중간 중간 구문 분석 단계입니다 . 도움을 주셔서 감사합니다 :) – Udeeksh

0

다음 코드를 시도하십시오 : 큰 따옴표 안에있는 부분 문자열을 추출하고 큰 따옴표로 $를 제거하려고합니다. 당신은 코드 아래에 시도 할 수 있습니다

코드 :

#!/usr/bin/perl  
use strict; 
use warnings; 

my $str = "print \"\$Hi \$There\",\"\$Welcome \$Aboard\""; 
print "Before:\n$str\n"; 

while($str =~ m/(\"[^\"]*\")/isg) #Extract all the quoted strings 
{ 
     $str =~ s/\$//isg; # Strip $ from $str 
    } 
print "After:\n$str\n"; 

펄 하나 라이너 코드 :

perl -0777 -lne "if($_ =~ m/\".*?\"/isg) {$_ =~ s/\$//isg; print $_;} else { print $_;}" Inputfile 
0
\$(?=[^"]*"(?:[^"]*"[^"]*")*[^"]*$) 

그것이 "을 사이 인 경우에만 이걸이 $를 대체 할 시도 및 ".

데모보기 당신이 당신의 정규식의 LHS에 리터럴 값에 quotemeta를 사용하지 않는, 그리고 $ 같은 특수 문자 이스케이프되지 않기 때문에

http://regex101.com/r/lS5tT3/61

0

현재 문제입니다.

그러나 잘못된 도구를 사용하여 시작하고 있습니다. 당신이 m//를 사용하여 첫 번째 일치하고 다음 대부분 s///를 사용하여 교체 유혹하는 경우

당신은 당신이 RHS에서 코드를 실행할 수 있도록이 /e Modifier를 사용하여 블록을 교체 사용 할 필요가있다.

다음은 시도하는 것처럼 검색 및 바꾸기입니다.

#!/usr/bin/perl 
use strict; 
use warnings; 

my %substitute = (
    '$Hi'  => 'Bye', 
    '$There' => 'Somewhere', 
    '$Aboard' => 'Away', 
); 

my $str = 'print "$Hi $There","$Welcome $Aboard", $Hi'; 

$str =~ s{(".*?")}{ 
    (my $quoted = $1) =~ s{(\$\w+)}{ 
     $substitute{$1} || $1 
    }eg; 
    $quoted 
}eg; 

print "$str\n"; 

출력 :

print "Bye Somewhere","$Welcome Away", $Hi 

만약 내가 단지 4 개 변수의 3 새로운 가치를 창조하고, 또한 대체되지 않습니다 방법을 보여 따옴표의 외부 변수를 포함하는 방법, 참고 귀하의 의도는 Perl 코드를 파싱하는 것입니다. 그렇다면 PPI을 사용해야합니다. 모듈을 사용하는 몇 가지 예는 my answers에서 확인할 수 있습니다.

관련 문제