Perl에서 두 문자열을 어떻게 비교합니까?
-
19-09-2019 - |
문제
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.