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, gtcmp기존 사용 로케일 (하지만 경우 현재 로케일에 의해 지정된 데이터 정렬 (정렬) 순서를 사용 use locale ':not_characters') 적용됩니다. perllocale을 참조하십시오 . 레거시 이진 인코딩으로 만 유니 코드와 함께 사용하지 마십시오. 표준 Unicode :: CollateUnicode :: 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.