2017-12-18 17 views

답변

1

정규 표현식의 변수 보간은 문자열의 변수 보간법과 거의 같습니다. my $x = 2이 주어진다면 "$x $x+1" 문자열은 "2 2+1"이됩니다. 변수는 확장되었지만 문자열의 코드는 실행되지 않습니다.

이 문제를 해결하는 방법 중 하나는 문자열 내부에서 참조를 역 참조하는 것입니다. 이렇게하면 임의의 표현식을 포함 할 수 있지만 구문이 약간 번거 롭습니다. 일반적으로 [$x + 1]을 포함하려는 값으로 배열 참조를 만든 다음 즉시 참조를 취소합니다 : @{[$x + 1]}. 이것은 Ruby의 #{...} 보간이나 Bash $(...) 명령 대체와 유사합니다.

그래서 정규식 /$x @{[$x + 1]}/x이 작동합니다.

그러나 대부분의 경우

, 정규식 이외의 모든 계산을 수행하는 것이 훨씬 명확하게 될 것 :

my $x = 2; 
my $y = $x + 1; 
/$x $y/x; 

펄 정규식 구문 것은 동적으로 정규식의 일부를 생성 할 수 있습니다 구문이 있습니다. 위와 같이 가변 보간법을 사용하면 변수 내용을 보간하고 정규 표현식을 컴파일합니다. 그러나 고급 정규 표현식은 패턴 일치 중에 변수의 값을 변경할 수 있습니다. 이러한 지연된 정규 표현식은 (??{ ... }) 구문으로 작성할 수 있습니다. 여기 : /$x (??{ $x + 1 })/x. 그러나 이것은 매우 진보적이고 오류가 발생하기 쉬운 regex 기능입니다. 이것은 일반 정규식보다 느립니다.

1

일치 연산자 m/ 또는 대체 연산자 s///의 일치하는 부분에서 코드 실행을 제공하는 an extended pattern이 있습니다. 코드의 수익을 대체하고 패턴으로 취급하기 위하여 계속

그것의 버전은 귀하의 경우 너무

/(??{ code })/ 

$_ = 23; 
my $x = 2; 
my ($m) = /(2(??{ $x+1 }))/; 
say $m; 

또는

RE_EVAL: { 
    use re 'eval'; 
    my ($m) = /($x(??{ $x+1 }))/; 
    say $m; 
} 

경기 및 캡처입니다 23.

여기에 특별히 use re 'eval'이 허용됩니다. 일반적으로 보안상의 이유로 허용되지 않습니다.

이것은 복잡한 경고와 함께 제공되는 매우 복잡한 기능입니다. 위의 링크에서 해당 항목을 제외하고 해당 텍스트의 링크를 따라 가서 Embedded Code Execution frequency을 읽으십시오.

편의를 위해이 복잡한 도구를 사용하거나 올바르게 작성된 코드를 대신 사용하지 마십시오.