2012-02-28 3 views
-1

둘 모두 내 일치 패턴에서 '리터럴'로 사용해야하는 메타 문자로 가득 찬 두 가지를 일치 시키려고합니다. \Q\E까지 문자열의 모든 메타 문자를 인용한다고 가정하고 있지만 작동하지 않습니다.Perl, 패턴 일치 및 메타 문자

그게 뭐야?

나에게 문제를주는 라인 : if (/\Q$prev\E/ !~ /\Q$ww[0]\E/) { 당신이 $ww[0] 하나에 $prev에서 문자열을 비교하려는 것 같습니다

+4

그런 두 정규 표현식을 비교할 수 없습니다. 더 많은 코드를 게시하고 수행하려는 작업을 명확히 할 수 있습니까? – MattLBeck

+3

"작동하지 않는다"는 것은 무엇을 의미합니까? '$ prev'와'$ ww [0]'을 보간하고 싶습니까, 그렇지 않습니까? – reinierpost

+3

http : // perldoc을 사용하십시오.perl.org/warnings.html. – toolic

답변

2

. 이 경우, 정규식의 일치는 다음과 같이한다 : 메타 문자를 무시 www[0]에 무엇이든 동일하지 않습니다 1$prev 경우

$result = $prev !~ /\Q$ww[0]\E/ 

$result가 반환됩니다. 그건 당신이하고 싶었던 모든 경우

그러나, 당신은뿐만 아니라 ne 사용할 수 있습니다 :

if ($prev ne $ww[0]){ 
    #do this if $prev and $ww[0] are not the same 
} 

을 또한, @toolic가 언급 한 것처럼, 스크립트의 상단에 다음 줄을 추가합니다 :

use warnings; 

스크립트의 가능한 문제점에 대한 피드백을 제공합니다. 결석

+0

많은 분들께 감사드립니다 !! 나는 평소처럼 것들을 복잡하게 끝났다. :). ($ prev ne $ ww [0]) 잘 작동했습니다. – user1238319

11

=~ 또는 !~의 사용은

/.../ 

그래서

/\Q$prev\E/ !~ /\Q$ww[0]\E/ 

($_ =~ /\Q$prev\E/) !~ /\Q$ww[0]\E/ 
0123의 약어

$_ =~ m/.../ 

약자이며

"" !~ /\Q$ww[0]\E/ 
"1" !~ /\Q$ww[0]\E/ 

당신은 단순히 원하는 : 왼쪽 정규식 일치 성공 여부에 따라 다음 중 하나에 해당합니다

$prev !~ /\Q$ww[0]\E/ # $ww[0] doesn't contains $prev 

당신이 실제로 원하는 경우

$prev !~ /^\Q$ww[0]\E\z/ # $ww[0] isn't equal to $prev 

다음은 간단하게 할 수 있습니다

$prev ne $ww[0] # $ww[0] isn't equal to $prev 

그런데 항상 use strict; use warnings;을 사용하십시오. 여기에서 문제를 확인했을 수 있습니다 (값은 $_에 따라 다를 수 있음).