Programing

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

crosscheck 2020. 5. 27. 21:39
반응형

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


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

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


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


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


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


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

Perl has seperate string comparison and numeric comparison operators to help with the loose typing in the language. You should read perlop for all the different operators.


The obvious subtext of this question is:

why can't you just use == to check if two strings are the same?

Perl doesn't have distinct data types for text vs. numbers. They are both represented by the type "scalar". Put another way, strings are numbers if you use them as such.

if ( 4 == "4" ) { print "true"; } else { print "false"; }
true

if ( "4" == "4.0" ) { print "true"; } else { print "false"; }
true

print "3"+4
7

Since text and numbers aren't differentiated by the language, we can't simply overload the == operator to do the right thing for both cases. Therefore, Perl provides eq to compare values as text:

if ( "4" eq "4.0" ) { print "true"; } else { print "false"; }
false

if ( "4.0" eq "4.0" ) { print "true"; } else { print "false"; }
true

In short:

  • Perl doesn't have a data-type exclusively for text strings
  • use == or !=, to compare two operands as numbers
  • use eq or ne, to compare two operands as text

There are many other functions and operators that can be used to compare scalar values, but knowing the distinction between these two forms is an important first step.


And if you'd like to extract the differences between the two strings, you can use String::Diff.

참고URL : https://stackoverflow.com/questions/1175390/how-do-i-compare-two-strings-in-perl

반응형