2017-11-30 16 views
6

perl 텍스트 대체는 매우 간단하고 강력합니다. 에서perl 스크립트에서 변수 옵션을 사용하는 방법

if ($IgnoreCase) {$opt = "gi"} else {$opt = "g"} 

$string =~ s/$source/$replace/$opt; 

결과 : 내가 좋아하는, 변수 치환과 스크립트를 수행 할 운영자가 예상 발견

스칼라 ...

는 할 수있는있는 posibility이 있습니까 옵션 변수?

답변

13

당신은 당신이 할 수있는 모든 경우에 /g을 사용하고 있기 때문에, perldoc perlre

하나 이상 포함 된 패턴 매치 수정이 주제에

my $opt = $IgnoreCase ? "(?i)" : ""; 

$string =~ s/$opt$source/$replace/g; 

더, 켜져 (또는 수 패턴의 나머지 또는 둘러싸는 패턴 그룹 (있는 경우)의 나머지 부분에 대해 "-"로 시작하면 꺼집니다.

이것은 동적으로 생성 된 패턴 (예 : 구성 파일에서 읽거나 인수에서 가져온 것, 테이블 어딘가에 지정하는 패턴)에 특히 유용합니다. 대소 문자를 구분하지 않는 패턴의 경우 패턴 앞에 (? i)를 포함하면됩니다.

+1

약간 설명해 주시겠습니까 – ssr1012

+0

빠른 답변 주셔서 감사합니다. 그것은 나를 완벽하게 만들어 준다. – Horst

+3

'i'와 같은 것은 런타임에 괄호를 사용하여 다시 켜고 끌 수 있습니다. 정규식 엔진의 동작을 근본적으로 변경하기 때문에 'g'로는이 작업을 수행 할 수 없습니다. – Sobrique

7

약간 the excellent answerСухой27에서 명확히하기 위해 :

당신이 본 것처럼

, 당신은합니다 (s/// 연산자의 옵션 섹션에서 변수를 사용할 수 없습니다 아니라, 당신은 eval 사용 할 수 있다면하지만 것 아주 나쁜 아이디어).

그러나 정규식 일치 항목으로 옵션을 가져 오는 유일한 방법은 아닙니다. (?...) 구문 안에 정규 표현식 문자열을 사용할 수도 있습니다. 예를 들어 m/(?i)foo/은 정확히 m/foo/i과 같습니다. /g은 약간 다른 옵션 클래스이므로이 옵션을 사용할 수 없습니다.

하지만이 (?...) 문자열은 정규식의 일부이기 때문에 변수를 사용하여 정규식에 포함시킬 수 있습니다.

my $opt = $IgnoreCase ? "(?i)" : ""; 

$string =~ s/$opt$source/$replace/g; 

자세한 내용은 "Extended Patterns" in perldoc perlre을 참조하십시오.

+0

이 클래스의 옵션 (/ g와 같은)에 대한 방법이 있습니까? – Horst

+2

@Horst : 아니요,'/ g' 옵션은 정규식 엔진이 근본적인 방식으로 작동하는 방식을 변경하기 때문에 - 그리고 엔진이 시작된 후에는 변경하기에는 너무 늦었습니다. –

+0

이것을 처리하는 또 다른 방법은 3 차 연산자 또는 단순히 적절한 옵션을 제공하지 않고 더 나아가서 전체 정규식을 제공하는 if-else 제어 구조입니다. 그런 다음/g 옵션은 하나가 될 수 있고 다른 하나는 될 수 없습니다. –