2010-03-20 2 views
3

방법은 다음 그렙 기능 작동 (!/0o1Iil]/ 무엇을합니까?)Perl의 grep 함수는 정규식에서 어떻게 작동합니까?

@chars = grep !/0o1Iil]/, 0..9, "A".."Z", "a".."z"; 
use Data::Dumper; 
print Dumper @chars; 

는 생산은 @chars에서 다음을 수행?

$VAR1 = 0; 
$VAR2 = 1; 
$VAR3 = 2; 
$VAR4 = 3; 
$VAR5 = 4; 
$VAR6 = 5; 
$VAR7 = 6; 
$VAR8 = 7; 
$VAR9 = 8; 
$VAR10 = 9; 
$VAR11 = 'A'; 
$VAR12 = 'B'; 
$VAR13 = 'C'; 
$VAR14 = 'D'; 
$VAR15 = 'E'; 
$VAR16 = 'F'; 
$VAR17 = 'G'; 
$VAR18 = 'H'; 
$VAR19 = 'I'; 
$VAR20 = 'J'; 
$VAR21 = 'K'; 
$VAR22 = 'L'; 
$VAR23 = 'M'; 
$VAR24 = 'N'; 
$VAR25 = 'O'; 
$VAR26 = 'P'; 
$VAR27 = 'Q'; 
$VAR28 = 'R'; 
$VAR29 = 'S'; 
$VAR30 = 'T'; 
$VAR31 = 'U'; 
$VAR32 = 'V'; 
$VAR33 = 'W'; 
$VAR34 = 'X'; 
$VAR35 = 'Y'; 
$VAR36 = 'Z'; 
$VAR37 = 'a'; 
$VAR38 = 'b'; 
$VAR39 = 'c'; 
$VAR40 = 'd'; 
$VAR41 = 'e'; 
$VAR42 = 'f'; 
$VAR43 = 'g'; 
$VAR44 = 'h'; 
$VAR45 = 'i'; 
$VAR46 = 'j'; 
$VAR47 = 'k'; 
$VAR48 = 'l'; 
$VAR49 = 'm'; 
$VAR50 = 'n'; 
$VAR51 = 'o'; 
$VAR52 = 'p'; 
$VAR53 = 'q'; 
$VAR54 = 'r'; 
$VAR55 = 's'; 
$VAR56 = 't'; 
$VAR57 = 'u'; 
$VAR58 = 'v'; 
$VAR59 = 'w'; 
$VAR60 = 'x'; 
$VAR61 = 'y'; 
$VAR62 = 'z'; 

답변

6

여기는 grep perldoc입니다. 귀하의 예제 문장은 grep EXPR,LIST 구문을 사용하고 있습니다. 즉, Perl 표현식은 EXPR을 대신 할 수 있습니다.

grep은 제공된 목록을 가져와 EXPR이 true 인 항목 만 반환합니다. 이 경우

EXPR

수단 ! /0o1Iil]/ (가독성 추가 공간) 인 "제품의 해당 항목 중 어느 것도 그 정규식과 일치하지 않기 때문에 하지는 (그들 중 어느 것도 문자열을 포함하지 않는다. 정규식 /0o1Iil]/ 일치 인 0o1Iil]) 모두 반환됩니다.

다른 포스터에서 언급했듯이 정규식은 아마도 /[0o1Iil]/으로 간주되어 혼동 될 수있는 문자를 제거합니다 (예 : 0과 o, 1 및 I). 이는 비밀번호 나 일련 번호 숫자 등

Btw 명시 적 목록 건설을 명확 BLOCK 형태로 grep을 재 작성하고합니다

@chars = grep { ! /[0o1Iil]/ } (0..9, 'A'..'Z', 'a'..'z'); 
+0

grep이 0, o, 1, I, i, l을 제외한 모든 것과 일치하도록이 예제는 실제로 열린 대괄호 인 것처럼 보입니다. – Cascabel

+0

예, 암호 또는 일련 번호 등을 생성하도록 설계된 것처럼 들리지만 모호한 문자는 없어야합니다. – rjh

+0

예 여는 대괄호를 놓쳤습니다. 답변 해주셔서 감사합니다. – portoalet

2

// 정규 표현식 매치 연산자입니다. !/[0o1Iil]/은 "대괄호 안에있는 문자와 일치하지 않습니다."라는 의미입니다. 첫 번째 슬래시 뒤에 여는 대괄호 ([)가 누락 된 것 같습니다. 다른 문자로 오인 될 수있는 모든 문자를 걸러 낼 수 있습니다 (0/O, I/I/1).

+0

누락 된'['' – vladr

1

펄 그렙의 일반 구문은 다음

grep BLOCK LIST 

그것은 LIST의 각 요소에 대한 BLOCK 평가 및 표현식이 참으로 평가되는 그 원소로 이루어진리스트 값을 반환한다.

BLOCK!/0o1Iil]/이며 0o1Iil] 패턴을 포함하지 않는 요소에 대해 true를 반환합니다. 귀하의 경우 LIST 요소 중 해당 패턴이 포함되어 있지 않으므로 grep은 전체 LIST을 반환합니다. 가 0 또는 소문자 O 또는 1, 또는 I를 포함하지 않는 그 요소가 true를 돌려주는, 또는 인공 지능 또는 알!/[0o1Iil]/, 당신은 할 것이다 :

BLOCK 같이 있었다 이 요소를 제외하고 모두 결과가 LIST입니다.

0

grep 기능은 목록에서 필터 역할을합니다.

이 경우 목록은 모두 영숫자입니다.

필터는 정규 표현식으로 지정됩니다. !not을 나타냅니다.즉, 결과 목록은 정규 표현식과 일치하는 항목을 제외해야합니다. 세트의 시작 부분에 [를 생략하면 문자 클래스와 ]를 볼 정규 표현식을 방지 할 수 있기 때문에 정규 표현식은 0o1Iil] (안 0o1Iil의 발생을 일치하려고

메타 문자.

grep {not /0o1Iil]/} 0..9, A..Z, a..z합니다 ([없이) :

목록 0..9, A..Z, a..z0o1Iil] 전혀 발생이 포함되지 않은 것을보고,이 아칸소 필터링 할 항목이 없으므로 전체 영숫자 목록을 다시 가져 오는 것입니다. 합니다 ([ 함께)

grep {not /[0o1Iil]/} 0..9, A..Z, a..z :

0, o, 1, I, i 또는 l 걸러한다 일치 목록의 아이템. 따라서 영숫자 목록을 다시 가져 오며 위에서 언급 한 6 개의 문자를 제외합니다.