컴파일하지 않아서 올바르지 않습니다. 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
은 유니 코드의 경우 폴딩을 구현합니다.
구문이 완전히 잘못되었습니다. 이 코드를 실행 해 보셨습니까? 또한 첫 번째 코드 블록에서 단일 문자열에 대해 이야기하고 있으며 갑자기 두 번째 문자열에 배열이있을 것입니다. – simbabque
코드를 작성하려고합니다. 나는 그것이 정확하지 않을지도 모른다라는 것을 안다. – mahmood
그러면 아마 실행을 시도해야합니다. 일반적으로 코드 작성에는이를 실행하는 것이 포함됩니다. 적어도 나에게는. ;) 그리고 당신이 그것을 실행하고 싶지 않다면, 여전히'perl -c'를 사용하여 구문 검사를 할 수 있습니다. – simbabque