2017-05-17 2 views
2

정규식을 사용하는 프로그램이 있는데 어떻게 든 그것을 이해하지 못합니다.누군가이 perge에서이 정규식을 설명 할 수 있습니까?

@listOfIds = &methodToGetIDs(); 
foreach my $id (@listOfIds){ 
    if($class =~ /gen/ig){ 
     #does stuff 
    } 
} 

내가 이해하는 $class 다음 "gen"이있는 경우는 if{}에 얻을 것이다하지만 때로는 그것으로 얻을 것입니다, 그래서 내가 다른 넣어 :이 같은 -

코드 + 간다 무슨 일이 있었는지 확인하고 코드는 다음과 같이 끝납니다.

my $class = "genes"; 
foreach my $id (@listOfIds){ 
    if($class =~ /gen/ig){ 
     print $class."\n"; #to see the value of class 
    }else{ 
     print "!!!".$class."\n"; #to see the difference if there's any 
    }#miss this wooops! 
} 

추측 무엇입니까? 출력은 다음과 같았다 :

genes 
genes 
!!!genes 
genes 
genes 
!!!genes 
genes 
genes 
!!!genes 

는 다른 절에 들어간 않는 이유 $class의 값이 다음 변경되지 않는 경우? 정규 표현식을 전혀 이해하지 못한다고 생각합니다. 모든 단서?

답변

2

/g 옵션을 사용하고 있기 때문에. perlop에서 : 더 이상 일치하지 않는 경우

스칼라 문맥에서, m//g의 각 실행은 일치하는 경우는 true 반환, 다음 경기를 발견하고, 거짓. 마지막 일치 이후의 위치는 pos() 기능을 사용하여 읽거나 설정할 수 있습니다. pos 참조. 일치하지 않으면 일반적으로 문자열의 시작 부분으로 검색 위치가 재설정됩니다.

그래서 처음으로 문자열을 볼 때 일치하는 항목이 표시됩니다. 그런 다음 다음 번에 첫 번째 경기가 시작된 후에 시작합니다. 나는. 위치가 문자열의 시작으로 재설정되지 않으면 첫 번째 일치가 발생하는 위치에서 계속됩니다.

/g 플래그는 모두를와 (과) 일치시킬 문자열로 사용할 수 있음을 나타 내기 위해 사용됩니다. 이는 문자열에서 하위 문자열이 몇 번 발생했는지 계산할 때 유용합니다. 귀하의 경우에는 패턴이 전혀 일치하는지 테스트하고, 그렇지 않은 경우 수행하십시오. 이 경우 /g 플래그가 필요하지 않습니다.

my $class = "genes"; 

foreach my $id (1..6){ 
    if($class =~ /gen/ig){ 
     print $class."\n"; #to see the value of class 
    }else{ 
     print "!!!".$class."\n"; #to see the difference if there's any 
    } 
} 

출력 :

genes                                           
!!!genes                                           
genes                                           
!!!genes                                           
genes                                           
!!!genes 

당신이 /g 플래그를 제거하면 당신이 얻을 때 :

genes                                           
genes                                           
genes                                           
genes                                           
genes                                           
genes 
+0

신사 숙녀에게 감사합니다. 지금은 이해하고 있습니다. 왜 그런 식으로 썼는지 물어볼 필요가 있습니다. 어쨌든, 답장을 보내 주셔서 감사합니다. – ILoveNachos

0

perlop 맨 페이지를 읽 스칼라 문맥에서

는, m의 // (G)의 각 실행이 더 이상 일치하지 않는 경우는 다음 경기, 그것이 일치하는 경우는 true 반환하고, 거짓 찾습니다. if 이후

, 모든 시간이 처음 true를 돌려주는 것, 그리고 (더 일치가없는 것처럼 두 번 인쇄 이유를 다음 잘못된 이해가 안 및 코드 표현식에서 스칼라 문맥에서 조건을 평가 컴파일되지 않습니다).

그러나 참고 :

if ($class =~ /gen/i) { 

항상$class = "genes" 때문에, 귀하의 예제에서 진실하고 변경 나타나지 않습니다. 대신 $id을 확인하셨습니까?

어쨌든 /g 수정자가 사용자 코드에 적합하지 않은 것으로 보입니다.

+0

아니 선생님, 그것은 $ 클래스를 평가하고, 그 이해가 안 무엇을, 왜 $ class가 변경되지 않으면 평가할 수 있습니까? 작성하지 않은 코드이지만 복제 할 필요가 있지만 Python에서는 이해해야 할 코드입니다. 편집 : 나 한테 그리워합니다. – ILoveNachos

관련 문제