문제

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

저는 Perl을 배우고 있는데, 여기 StackOverflow에서 이 기본적인 질문을 찾아봤는데 좋은 답을 찾지 못해서 물어볼까 생각했습니다.

도움이 되었습니까?

해결책

보다 Perldoc Perlop. 사용 lt, gt, eq, ne, 그리고 cmp 문자열 비교에 적합 :

이진 eq 왼쪽 인수가 오른쪽 인수와 동일하면 true를 반환합니다.

이진 ne 왼쪽 인수가 문자열이 오른쪽 인수와 같지 않으면 참으로 반환합니다.

이진 cmp 왼쪽 인수가 정당한 인수보다, 동일 또는 크지 여부에 따라 -1, 0 또는 1을 반환합니다.

이진 ~~ 인수 사이에 SmartMatch를 수행합니다. ...

lt, le, ge, gt 그리고 cmp 레거시가 로케일을 사용하는 경우 현재 로케일에 지정된 Collation (정렬) 순서를 사용하십시오 (그러나 use locale ':not_characters') 적용됩니다. 보다 Perllocale. 레거시 바이너리 인코딩과 만 유니 코드와 혼합하지 마십시오. 표준 유니 코드 :: Collate 그리고 유니 코드 :: 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, 그리고 문자열 인 값 '1' 그리고 숫자 값 1. 이것들은 Perl의 부울 연산자로부터 항상 얻을 수있는 것과 동일한 값입니다. 부울 또는 숫자 작업에 대한 반환 값 만 실제로 사용해야하며,이 경우 차이는 중요하지 않습니다. )

Sinan ünür 문자열 비교 연산자의 포괄적 인 목록에 추가하여 Perl 5.10은 스마트 매치 연산자를 추가합니다.

Smart Match 연산자는 유형을 기준으로 두 항목을 비교합니다. 5.10 동작에 대한 아래 차트를 참조하십시오 (이 동작은 5.10.1에서 약간 변하고 있다고 생각합니다) :

perldoc perlsyn "스마트 매칭 상세":

스마트 매치의 행동은 논쟁의 유형에 따라 다릅니다. 그것은 항상 정류적입니다 $a ~~ $b 동일하게 동작합니다 $b ~~ $a . 동작은 다음 표에 의해 결정됩니다. 순서대로 적용되는 첫 번째 행은 일치 동작을 결정합니다.

  $a      $b        Type of Match Implied    Matching Code
  ======  =====     =====================    =============
  (overloading trumps everything)

  Code[+] Code[+]   referential equality     $a == $b   
  Any     Code[+]   scalar sub truth         $b−>($a)   

  Hash    Hash      hash keys identical      [sort keys %$a]~~[sort keys %$b]
  Hash    Array     hash slice existence     grep {exists $a−>{$_}} @$b
  Hash    Regex     hash key grep            grep /$b/, keys %$a
  Hash    Any       hash entry existence     exists $a−>{$b}

  Array   Array     arrays are identical[*]
  Array   Regex     array grep               grep /$b/, @$a
  Array   Num       array contains number    grep $_ == $b, @$a 
  Array   Any       array contains string    grep $_ eq $b, @$a 

  Any     undef     undefined                !defined $a
  Any     Regex     pattern match            $a =~ /$b/ 
  Code()  Code()    results are equal        $a−>() eq $b−>()
  Any     Code()    simple closure truth     $b−>() # ignoring $a
  Num     numish[!] numeric equality         $a == $b   
  Any     Str       string equality          $a eq $b   
  Any     Num       numeric equality         $a == $b   

  Any     Any       string equality          $a eq $b   

+ − this must be a code reference whose prototype (if present) is not ""
(subs with a "" prototype are dealt with by the 'Code()' entry lower down) 
* − that is, each element matches the element of same index in the other
array. If a circular reference is found, we fall back to referential 
equality.   
! − either a real number, or a string that looks like a number

"일치 코드"는 물론 실제 일치 코드를 나타내지 않습니다. GREP와 달리 스마트 매치 작업자는 가능할 때마다 단락됩니다.

오버로드를 통한 사용자 정의 일치 ~~ 운영자. 이것은 일반적인 스마트 매치 시맨틱을 능가합니다. 보다 overload.

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

Perl에는 언어의 느슨한 입력을 돕기 위해 별도의 문자열 비교 및 ​​숫자 비교 연산자가 있습니다.당신은 읽어야합니다 퍼롭 모든 다른 연산자에 대해.

이 질문의 명백한 하위 텍스트는 다음과 같습니다.

왜 그냥 사용할 수 없어요 == 두 줄이 같은지 확인하려면?

Perl에는 텍스트 대 숫자에 대한 별개의 데이터 유형이 없습니다. 둘 다 유형으로 표시됩니다 "스칼라". 다른 방법으로 끈 ~이다 번호 당신이 그들을 사용하는 경우.

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, 두 개의 피연산자를 텍스트로 비교합니다

스칼라 값을 비교하는 데 사용할 수있는 다른 많은 기능과 연산자가 있지만이 두 형태의 차이점을 아는 것이 중요한 첫 단계입니다.

그리고 두 줄의 차이점을 추출하려면 사용할 수 있습니다. 문자열 :: diff.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top