Perl에서 두 문자열을 어떻게 비교합니까?


178

Perl에서 두 문자열을 어떻게 비교합니까?

나는 Perl을 배우고 있는데,이 기본적인 질문이 여기에서 StackOverflow를 살펴보고 좋은 대답을 찾지 못했기 때문에 물어볼 것이라고 생각했습니다.


3
먼저 Perl과 함께 제공되는 훌륭한 문서를 참조하십시오.
— Sinan Ünür

5
Learning Perl (저는 공동 저술 한) 과 같은 책을 확인하고 싶을 수도 있습니다 . 이 질문은 매우 기본적이기 때문에이 질문에 대한 답이 없습니다. 튜토리얼을 통해 기본 사항을 빠르게 선택할 수 있습니다.
— brian d foy

답변:


184

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 모듈은 데이터 정렬 문제에 대한 훨씬 강력한 솔루션을 제공합니다.


9
하나만 더 있으면 동일하지 않습니다.
— PJT

4
$ str1 = ~ "$ str2"(/ $ str2 / 아님)가 $ str2가 $ str1의 하위 문자열인지 확인한다고 언급 할 수 있습니다.
— Daniel C. Sobral

@Daniel index은 문자열이 다른 문자열의 하위 문자열인지 확인하는 데 사용 합니다.
— Sinan Ünür

3
@Daniel : = ~ "$ str2"와 = ~ / $ str2 / 사이에는 실질적인 차이가별로 없습니다 (또는 그 문제에 대해서는 = ~ $ str2 만). index가 올바른 도구이지만 어떤 이유로 정규식을 사용해야하는 경우 = ~ / \ Q $ str2 \ E /를 수행하십시오.
— ysth

1
@IliaRostovtsev !=하고 ne있기 때문에, 동일하지 않습니다 !=와 ne다르게 정의된다. 얼마나 힘들어요?! 숫자 비교 연산자이므로 !=두 피연산자를 모두 숫자 로 변환합니다 perl -E 'say "equal" if not "a" != "b"'.
— Sinan Ünür

137
  • 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의 부울 연산자에서 가져옵니다. 부울 또는 숫자 연산에 대한 반환 값만 사용해야합니다.이 경우 차이는 실제로 중요하지 않습니다.)


8
이 답변이 더 마음에 듭니다. 간단한 간단한 예제는 일반적으로 단순한 다중 페이지 문서 참조보다 초보자에게 더 유용합니다.
— Zon

@Zon에 대한 그 반환 값을 제외하고 eq, gt, lt등 ... 정확하지 그들은 참 또는 거짓으로 돌아갑니다. 만 cmp특정 숫자 값을 반환합니다.
— Sinan Ünür

Perl 6은 leg대신 cmp일반 비교에 사용되는 것을 제외하고는 동일한 연산자를 사용 합니다.
— 브래드 길버트

17

문자열 비교 연산자의 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.


약간 바뀌지 않습니다. 급격히 바뀌고 있습니다. 단순하지 않은 것에 대한 스마트 매칭은 심각하게 손상되었습니다.
— brian d foy

1
문서는 그 동안 변경되었으므로 링크가 변경되어야합니다. 5.14.2 현재
— 브래드 길버트

10
print "Matched!\n" if ($str1 eq $str2)

Perl은 분리 된 문자열 비교와 숫자 비교 연산자를 사용하여 언어의 느슨한 입력을 도와줍니다. 다른 모든 연산자에 대한 perlop 을 읽어야 합니다.


8

이 질문의 명백한 내용은 다음과 같습니다.

왜 ==두 문자열이 같은지 확인 하는 데 사용할 수없는 이유는 무엇입니까?

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

한마디로 :

  • Perl에는 텍스트 문자열 전용 데이터 유형이 없습니다.
  • ==또는을 사용 !=하여 두 피연산자를 숫자로 비교
  • eq또는을 사용 ne하여 두 피연산자를 텍스트로 비교

스칼라 값을 비교하는 데 사용할 수있는 다른 함수와 연산자가 많이 있지만이 두 형식의 차이를 아는 것이 첫 번째 중요한 단계입니다.


Java에는 동일한 문제가 있지만 다른 이유로 (및 다른 의미로)
— 브렌트 브래드 번

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.