Perl에서 두 문자열을 어떻게 비교합니까?
나는 Perl을 배우고 있는데,이 기본적인 질문이 여기에서 StackOverflow를 살펴보고 좋은 대답을 찾지 못했기 때문에 물어볼 것이라고 생각했습니다.
Perl에서 두 문자열을 어떻게 비교합니까?
나는 Perl을 배우고 있는데,이 기본적인 질문이 여기에서 StackOverflow를 살펴보고 좋은 대답을 찾지 못했기 때문에 물어볼 것이라고 생각했습니다.
답변:
perldoc perlop을 참조하십시오 . 사용 lt
, gt
, eq
, ne
, 및 cmp
문자열 비교에 맞게 :
eq
왼쪽 인수가 문자열과 오른쪽 인수와 같은 경우 이진 은 true를 반환합니다.이진
ne
왼쪽 인수가 문자열과 오른쪽 인수가 아닌 경우 은 true를 반환합니다.이진
cmp
은 왼쪽 인수가 오른쪽 인수보다 작은 지, 같은지 또는 큰지에 따라 -1, 0 또는 1을 반환합니다.이진
~~
은 인수 사이에서 스마트 매치를합니다. ...
lt
,le
,ge
,gt
및cmp
기존 사용 로케일 (하지만 경우 현재 로케일에 의해 지정된 데이터 정렬 (정렬) 순서를 사용use locale ':not_characters'
) 적용됩니다. perllocale을 참조하십시오 . 레거시 이진 인코딩으로 만 유니 코드와 함께 사용하지 마십시오. 표준 Unicode :: Collate 및 Unicode :: Collate :: Locale 모듈은 데이터 정렬 문제에 대한 훨씬 강력한 솔루션을 제공합니다.
index
은 문자열이 다른 문자열의 하위 문자열인지 확인하는 데 사용 합니다.
!=
하고 ne
있기 때문에, 동일하지 않습니다 !=
와 ne
다르게 정의된다. 얼마나 힘들어요?! 숫자 비교 연산자이므로 !=
두 피연산자를 모두 숫자 로 변환합니다 perl -E 'say "equal" if not "a" != "b"'
.
cmp
비교
'a' cmp 'b' # -1
'b' cmp 'a' # 1
'a' cmp 'a' # 0
eq
동일
'a' eq 'b' # 0
'b' eq 'a' # 0
'a' eq 'a' # 1
ne
같지 않음
'a' ne 'b' # 1
'b' ne 'a' # 1
'a' ne 'a' # 0
lt
이하
'a' lt 'b' # 1
'b' lt 'a' # 0
'a' lt 'a' # 0
le
이하
'a' le 'b' # 1
'b' le 'a' # 0
'a' le 'a' # 1
gt
보다 큰
'a' gt 'b' # 0
'b' gt 'a' # 1
'a' gt 'a' # 0
ge
크거나 같음
'a' ge 'b' # 0
'b' ge 'a' # 1
'a' ge 'a' # 1
보다 perldoc perlop
은 참조하십시오.
(나는 이것을 조금 단순화하지만 cmp
빈 문자열과 대신 숫자 0 값 0
과 문자열 '1'
과 숫자 값 모두 값을 반환 합니다 1
. 이것은 동일한 값입니다 항상 Perl의 부울 연산자에서 가져옵니다. 부울 또는 숫자 연산에 대한 반환 값만 사용해야합니다.이 경우 차이는 실제로 중요하지 않습니다.)
eq
, gt
, lt
등 ... 정확하지 그들은 참 또는 거짓으로 돌아갑니다. 만 cmp
특정 숫자 값을 반환합니다.
leg
대신 cmp
일반 비교에 사용되는 것을 제외하고는 동일한 연산자를 사용 합니다.
문자열 비교 연산자의 Sinan Ünür 종합 목록에 추가하여 Perl 5.10은 스마트 일치 연산자를 추가합니다.
스마트 일치 연산자는 유형에 따라 두 항목을 비교합니다. 5.10 동작에 대해서는 아래 차트를 참조하십시오 (5.10.1에서는이 동작이 약간 변경되는 것으로 보입니다).
perldoc perlsyn
"스마트 매칭 상세" :스마트 매치의 행동은 논증의 유형에 따라 다릅니다. 항상 정류 적입니다. 즉와
$a ~~ $b
동일하게 동작합니다$b ~~ $a
. 동작은 다음 표에 의해 결정됩니다. 어느 순서로든 적용되는 첫 번째 행이 일치 동작을 결정합니다.
$ a $ b 일치 유형의 암시 적 일치 코드 ====== ===== ===================== ============== (과부하가 모든 것을 능가합니다) 코드 [+] 코드 [+] 참조 동등성 $ a == $ b 모든 코드 [+] 스칼라 하위 진리 $ b −> ($ a) 해시 해시 해시 키 동일 [정렬 키 % $ a] ~~ [정렬 키 % $ b] 해시 배열 해시 슬라이스 존재 grep {exists $ a −> {$ _}} @ $ b 해시 정규식 해시 키 grep grep / $ b /, 키 % $ a 해시 모든 해시 항목이 존재합니다 $ a −> {$ b} 배열 배열 배열이 동일 함 [*] 배열 정규식 배열 grep grep / $ b /, @ $ a 배열 Num 배열은 숫자 grep을 포함합니다 $ _ == $ b, @ $ a 배열 모든 배열은 문자열 grep $ _ eq $ b, @ $ a를 포함합니다. 정의되지 않은 undefined! defined $ a 모든 정규식 패턴 일치 $ a = ~ / $ b / Code () Code () 결과는 $ a −> () eq $ b −> ()와 같습니다. 모든 Code () 간단한 폐쇄 진실 $ b −> () # $ a 무시 숫자 numish [!] 숫자 같음 $ a == $ b 모든 Str 문자열 동등성 $ a eq $ b 임의의 숫자 숫자 동등성 $ a == $ b 임의의 문자열 동등성 $ a eq $ b +-프로토 타입 (있는 경우)이 ""가 아닌 코드 참조 여야합니다. ( ""프로토 타입이있는 서브 시스템은 아래의 'Code ()'항목으로 처리됩니다) *-즉, 각 요소는 다른 요소의 동일한 색인 요소와 일치합니다. 정렬. 순환 참조가 발견되면 참조로 넘어갑니다. 평등. ! − 실수 또는 숫자처럼 보이는 문자열"일치 코드"는 물론 실제 매칭 코드를 나타내지 않습니다. 의도 된 의미를 설명하기 위해서입니다. grep과 달리 스마트 매치 연산자는 가능할 때마다 단락됩니다.
오버로드를 통한 사용자 지정 일치
~~
연산자 를 오버로드하여 개체가 일치하는 방식을 변경할 수 있습니다 . 이것은 일반적인 스마트 일치 의미를 능가합니다. 참조하십시오overload
.
이 질문의 명백한 내용은 다음과 같습니다.
Perl에는 텍스트와 숫자에 대한 고유 한 데이터 유형이 없습니다. 둘 다 "scalar" 유형으로 표시됩니다 . 달리 말하면, 문자열 을 그대로 사용하면 문자열 은 숫자 입니다.
if ( 4 == "4" ) { print "true"; } else { print "false"; }
true
if ( "4" == "4.0" ) { print "true"; } else { print "false"; }
true
print "3"+4
7
텍스트와 숫자는 언어에 따라 다르지 않기 때문에 ==
두 경우 모두 올바른 작업을 수행하기 위해 연산자를 단순히 오버로드 할 수 없습니다 . 따라서 Perl은 eq
값을 텍스트로 비교합니다.
if ( "4" eq "4.0" ) { print "true"; } else { print "false"; }
false
if ( "4.0" eq "4.0" ) { print "true"; } else { print "false"; }
true
한마디로 :
==
또는을 사용 !=
하여 두 피연산자를 숫자로 비교eq
또는을 사용 ne
하여 두 피연산자를 텍스트로 비교스칼라 값을 비교하는 데 사용할 수있는 다른 함수와 연산자가 많이 있지만이 두 형식의 차이를 아는 것이 첫 번째 중요한 단계입니다.
두 문자열의 차이점을 추출하려면 String :: Diff를 사용할 수 있습니다 .