perl 텍스트 대체는 매우 간단하고 강력합니다. 에서perl 스크립트에서 변수 옵션을 사용하는 방법
if ($IgnoreCase) {$opt = "gi"} else {$opt = "g"}
$string =~ s/$source/$replace/$opt;
결과 : 내가 좋아하는, 변수 치환과 스크립트를 수행 할 운영자가 예상 발견
는 할 수있는있는 posibility이 있습니까 옵션 변수?스칼라 ...
perl 텍스트 대체는 매우 간단하고 강력합니다. 에서perl 스크립트에서 변수 옵션을 사용하는 방법
if ($IgnoreCase) {$opt = "gi"} else {$opt = "g"}
$string =~ s/$source/$replace/$opt;
결과 : 내가 좋아하는, 변수 치환과 스크립트를 수행 할 운영자가 예상 발견
는 할 수있는있는 posibility이 있습니까 옵션 변수?스칼라 ...
당신은 당신이 할 수있는 모든 경우에 /g
을 사용하고 있기 때문에, perldoc perlre
하나 이상 포함 된 패턴 매치 수정이 주제에
my $opt = $IgnoreCase ? "(?i)" : ""; $string =~ s/$opt$source/$replace/g;
더, 켜져 (또는 수 패턴의 나머지 또는 둘러싸는 패턴 그룹 (있는 경우)의 나머지 부분에 대해 "-"로 시작하면 꺼집니다.
이것은 동적으로 생성 된 패턴 (예 : 구성 파일에서 읽거나 인수에서 가져온 것, 테이블 어딘가에 지정하는 패턴)에 특히 유용합니다. 대소 문자를 구분하지 않는 패턴의 경우 패턴 앞에 (? i)를 포함하면됩니다.
약간 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을 참조하십시오.
이 클래스의 옵션 (/ g와 같은)에 대한 방법이 있습니까? – Horst
@Horst : 아니요,'/ g' 옵션은 정규식 엔진이 근본적인 방식으로 작동하는 방식을 변경하기 때문에 - 그리고 엔진이 시작된 후에는 변경하기에는 너무 늦었습니다. –
이것을 처리하는 또 다른 방법은 3 차 연산자 또는 단순히 적절한 옵션을 제공하지 않고 더 나아가서 전체 정규식을 제공하는 if-else 제어 구조입니다. 그런 다음/g 옵션은 하나가 될 수 있고 다른 하나는 될 수 없습니다. –
약간 설명해 주시겠습니까 – ssr1012
빠른 답변 주셔서 감사합니다. 그것은 나를 완벽하게 만들어 준다. – Horst
'i'와 같은 것은 런타임에 괄호를 사용하여 다시 켜고 끌 수 있습니다. 정규식 엔진의 동작을 근본적으로 변경하기 때문에 'g'로는이 작업을 수행 할 수 없습니다. – Sobrique