\1, \2 같이 역슬래쉬 뒤에 붙는 숫자가 잘 이해가 안되고 정규식도 어떤 의미인지 모르겠습니다.
설명에 보면 어떠한 바이트라도 0이 아닌 것을 확인하는 코드라는데 어떻게해서 그렇게 되는지 모르겠습니다.
이 예제가 있는 페이지를 읽어보시면 이런 설명이 있습니다.
Quote:
These operators(bitwise operators) work differently on numeric values than they do on strings. (This is one of the few places where Perl cares about the difference.) ... Note that all bit strings are true (unless they result in the string "0").
이런 이유로 비트연산을 거친 스트링에 \x00 이 들어있는지 확인하려면 byte 별로 확인해 주어야 한다는 이야기입니다. 그리고 이 예제에서 사용된 \1, \2 는 8진수 표기로 사용되었습니다. 이를테면 "\1", "\x01", "\001", chr(1) 모두 같은 표현입니다. (보통은 \1, \2 가 정규표현식 내에서의 back reference 를 의미하지만 여기에서는 문맥에 맞지 않습니다.) 그래서 책의 내용대로 : if ( "fred" & "\1\2\3\4" ) { ... }
이렇게 해서는 그 결과가 문자열 "0" 이 아닌 이상에는 언제나 참이 될것이므로 의미가 없고, if ( ("fred" & "\1\2\3\4") =~ /[^\0]/ ) { ... }
이렇게 써야만 비트연산 결과에 대해 각 byte 에서 \x00 이 발견되는지 확인하게 된다는 것입니다.
Re: perl에서...
이 예제가 있는 페이지를 읽어보시면 이런 설명이 있습니다.
이런 이유로 비트연산을 거친 스트링에 \x00 이 들어있는지 확인하려면 byte 별로 확인해 주어야 한다는 이야기입니다. 그리고 이 예제에서 사용된 \1, \2 는 8진수 표기로 사용되었습니다. 이를테면 "\1", "\x01", "\001", chr(1) 모두 같은 표현입니다. (보통은 \1, \2 가 정규표현식 내에서의 back reference 를 의미하지만 여기에서는 문맥에 맞지 않습니다.) 그래서 책의 내용대로 :
if ( "fred" & "\1\2\3\4" ) { ... }
이렇게 해서는 그 결과가 문자열 "0" 이 아닌 이상에는 언제나 참이 될것이므로 의미가 없고,
if ( ("fred" & "\1\2\3\4") =~ /[^\0]/ ) { ... }
이렇게 써야만 비트연산 결과에 대해 각 byte 에서 \x00 이 발견되는지 확인하게 된다는 것입니다.
War doesnt determine whos right, just whos left.
댓글 달기