2017-11-18 1 views
-1

perl에서는 문자열에 부분 문자열을 찾고 싶습니다. 그 결과는 진실/거짓이며 그 다음에 무엇을해야할지 결정할 것입니다. 좋은 게시물은 here이지만, 사용법이 저에게는 모호합니다.perl에서 일치하는 부분 문자열, 예 또는 아니오

my $big_string = "Hello Good World"; 
my $pat = "world"; 

대문자/소문자는 중요하지 않지만 사실로 만들고 싶습니다.

use List::Util 'any'; 
my $match_found = any { /$pat/ } @big_string; 
if (match_found) 
    print "yes\n"; 
else 
    print "no\n"; 

맞습니까? 이 목적을 위해 더 나은 API가 있습니까?

+2

구문이 완전히 잘못되었습니다. 이 코드를 실행 해 보셨습니까? 또한 첫 번째 코드 블록에서 단일 문자열에 대해 이야기하고 있으며 갑자기 두 번째 문자열에 배열이있을 것입니다. – simbabque

+0

코드를 작성하려고합니다. 나는 그것이 정확하지 않을지도 모른다라는 것을 안다. – mahmood

+3

그러면 아마 실행을 시도해야합니다. 일반적으로 코드 작성에는이를 실행하는 것이 포함됩니다. 적어도 나에게는. ;) 그리고 당신이 그것을 실행하고 싶지 않다면, 여전히'perl -c'를 사용하여 구문 검사를 할 수 있습니다. – simbabque

답변

3

컴파일하지 않아서 올바르지 않습니다. if/else은 항상 Perl에서 {블록을 나타냅니다. 또한 if (match_found) 변수에 $ sigil이 누락되었습니다.

대소 문자를 구분하지 않으려면 (대문자와 소문자의 차이점을 무시하려면) i 플래그를 정규식에 추가해야합니다.

마지막으로 코드는 @big_string 배열을 정의하지 않고 $big_string 스칼라 만 정의합니다.

그래서 :

use strict; 
use warnings; 
use List::Util 'any'; 

my $big_string = "Hello Good World"; 
my $pat = "world"; 

my $match_found = any { /$pat/i } $big_string; 
if ($match_found) { 
    print "yes\n"; 
} else { 
    print "no\n"; 
} 

이 코드는 작동합니다,하지만이 개선 될 수있다.

우선 any을 사용하십시오. 이 정규식해야하는데 같은 $pat이 보이지 않는,

my $match_found = $big_string =~ /$pat/i; 

둘째, 우리는 확인하는 여러 문자열 목록이 없습니다. 그것은 평범한 문자열입니다. 이것은 알파벳 숫자 문자 (예 : world)에 대해서는 아무런 차이가 없지만, 일반적으로 우리는 정규식으로 해석 될 의도가없는 문자열에서 모든 정규식 메타 문자를 이스케이프해야합니다. 마지막으로

use strict; 
use warnings; 

my $big_string = "Hello Good World"; 
my $pat = "world"; 

my $match_found = $big_string =~ /\Q$pat\E/i; 
if ($match_found) { 
    print "yes\n"; 
} else { 
    print "no\n"; 
} 

, 우리는 심지어 간단한에 대한 정규식이 필요하지 않습니다 : 이것은 우리의 개선 된 버전이

my $match_found = $big_string =~ /\Q$pat\E/i; 

입니다 : 이것은 quotemeta 기능 (또는 \Q\E 약식) 수행 할 수 있습니다 부분 문자열 검색. 대신 우리는이 작업을 수행 할 수 있습니다

use feature 'fc'; 
my $match_found = index(fc($big_string), fc($pat)) >= 0; 

fc은 유니 코드의 경우 폴딩을 구현합니다.

+0

그리고'fc'는 5.16+에서만 사용 가능합니다. – simbabque

+0

나는이 작업을 위해 정규식을 사용하지 않을 것이라고 생각한다. 부분 문자열 일치를 찾고 싶습니다. 두 문자열 모두 일반 텍스트이고 패턴은 전체 단어입니다. – mahmood

+2

@ imbabque 5.16은 5 년간 나왔습니다. 나는 그걸로 괜찮아. :-) – melpomene

관련 문제