[perl] 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은 분리 된 문자열 비교와 숫자 비교 연산자를 사용하여 언어의 느슨한 입력을 도와줍니다. 다른 모든 연산자에 대한 perlop 을 읽어야 합니다.


답변

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

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

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하여 두 피연산자를 텍스트로 비교

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


답변

두 문자열의 차이점을 추출하려면 String :: Diff를 사용할 수 있습니다 .


답변