web-dev-qa-db-ja.com

Perlで2つの文字列を比較するにはどうすればいいですか?

Perlで2つの文字列を比較するにはどうすればいいですか?

私はPerlを学んでいます、私はこの基本的な質問がStackOverflowでここでそれを調べました、そして、良い答えを見つけられなかったので、私は尋ねると思いました。

163
PJT

perldoc perlop を参照してください。文字列の比較には、ltgteqne、およびcmpを使用します。

左側の引数が文字列単位で右側の引数と等しい場合、バイナリのeqはtrueを返します。

左引数が文字列単位で右引数と等しくない場合、バイナリのneはtrueを返します。

バイナリのcmpは、左側の引数が右側の引数よりも文字列的に小さいか、等しいか、大きいかに応じて、-1、0、または1を返します。

バイナリの~~はその引数間のスマートマッチを行います。 ...

ltlegegt、およびcmpは、従来の使用ロケール(use locale ':not_characters'ではなく)が有効な場合、現在のロケールで指定されている照合(ソート)順序を使用します。 perllocale を参照してください。これらをUnicodeと混在させないでください。従来のバイナリエンコーディングのみを使用してください。標準の nicode :: Collat​​e および nicode :: Collat​​e :: Locale モジュールは、照合の問題に対してはるかに強力な解決策を提供します。

167
Sinan Ünür
  • 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のブール演算子から常に得られる値と同じで、実際にはブール値または数値演算にのみ戻り値を使用する必要がありますが、その場合は違いは問題になりません。

130
Brad Gilbert

SinanÜnürの文字列比較演算子の包括的なリストに加えて、Perl 5.10ではスマートマッチ演算子が追加されています。

スマートマッチ演算子は、2つのアイテムをそれらのタイプに基づいて比較します。 5.10の振る舞いについては、下の表を参照してください(5.10.1では、この振る舞いはわずかに変化していると思います)

perldoc perlsyn "スマートマッチングの詳細"

スマートマッチの動作は、その引数がどんな種類のものであるかによって異なります。これは常に交換可能です。つまり、$a ~~ $b$b ~~ $aと同じように動作します。動作は次の表で決定されます。どちらの順序でも、最初に適用される行が一致動作を決定します。

 $ a $ bマッチインプライドマッチングコードのタイプ
 ====== ===== ====================== == ======================================== 
(オーバーロードはすべてに勝ちます)
 
 Code [+]コード[+] b 
任意のコード[+]スカラー部分真理値$ b  - >($ a)
 
ハッシュハッシュキーの同一性[sort keys%$ a] ~~ [sort keys%ハッシュ配列ハッシュスライス存在grep {存在$ a  - > {$ _}} @ $ b 
ハッシュ正規表現ハッシュキーgrep grep/$ b /、キー%$ a [。 []ハッシュハッシュエントリが存在する場合$ a  - > {$ b} 
 
配列配列配列は同一です[*] 
配列正規表現配列grep grep/$ b /、 @ $ a 
配列number配列を含む配列grep $ _ == $ b、@ $ a 
配列任意の配列に文字列grep $ _ eq $ bを含む、@ $ a 
 [任意のundef undefined!が定義されました$ a 
任意のRegex pat一致する$ a =〜/ $ b/
 Code()Code()の結果は等しい$ a  - >()eq $ b  - >()
任意のCode()単純閉包真実$ b  - >()#$ a 
を無視します。Num numish [!]数値の等価性$ a == $ b 
任意のStr文字列の等価性$ a eq $ b 
任意の数値の等価性$ a == $ b 
任意の文字列が等しい$ a eq $ b 
 
 +  - これはプロトタイプ(存在する場合)がであるコード参照でなければなりません。 "" 
ではありません(プロトタイプを持つsubは、下の 'Code()'エントリで処理されます)
 *  - つまり、各要素は他の要素の同じインデックスの要素と一致します。 
アレイ。循環参照が見つかった場合は、参照
等価にフォールバックします。 
! - 実数、または数のように見える文字列

「マッチングコード」は、実際のマッチングコードを表すものではありません。もちろん、意図した意味を説明するためのものです。 grepとは異なり、スマートマッチ演算子は可能な限りいつでも短絡します。

オーバーロードによるカスタムマッチング~~演算子をオーバーロードすることで、オブジェクトの一致方法を変更できます。これは通常のスマートマッチセマンティクスに勝るものです。 overload を参照してください。

17
Chas. Owens
print "Matched!\n" if ($str1 eq $str2)

Perlは、言語での緩やかな型付けを支援するために、文字列比較演算子と数値比較演算子を別々に持っています。あなたは perlop を全ての異なる演算子について読むべきです。

10

この質問の明らかなサブテキストは次のとおりです。

2つの文字列が同じかどうかを確認するのに==を使用できないのはなぜですか?

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はテキスト文字列専用のデータ型を持っていません
  • 2つのオペランドを数値として比較するには、==または!=を使用してください。
  • 2つのオペランドをテキストとして比較するには、eqまたはneを使用します。

スカラー値を比較するために使用できる関数や演算子は他にもたくさんありますが、これら2つの形式の違いを知ることは重要な最初のステップです。

7
nobar

2つの文字列の違いを抽出したい場合は、 String :: Diff を使用できます。

1
Helen Craigman