Perlで2つの文字列を比較するにはどうすればよいですか?
私はPerlを学習しています。この基本的な質問でStackOverflowを調べたところ、適切な答えが見つからなかったので、質問したいと思いました。
Perlで2つの文字列を比較するにはどうすればよいですか?
私はPerlを学習しています。この基本的な質問でStackOverflowを調べたところ、適切な答えが見つからなかったので、質問したいと思いました。
回答:
perldoc perlopを参照してください。使用lt
、gt
、eq
、ne
、およびcmp
文字列の比較のための適切な:
Binary
eq
は、左側の引数が文字列的に右側の引数と等しい場合にtrueを返します。
ne
左側の引数が文字列単位で右側の引数と等しくない場合、Binary はtrueを返します。Binary
cmp
は、左の引数が文字列ごとに右の引数よりも小さいか、等しいか、大きいかによって、-1、0、または1を返します。Binary
~~
は引数の間でスマートマッチを行います。...
lt
、le
、ge
、gt
およびcmp
レガシーuse localeが(ではない場合は、現在のロケールで指定された照合(ソート)順を使用するuse locale ':not_characters'
)効果です。perllocaleを参照してください。これらをUnicodeと混在させないでください。レガシーバイナリエンコーディングのみを使用してください。標準のUnicode :: CollateおよびUnicode :: Collate :: Localeモジュールは、照合の問題に対してはるかに強力なソリューションを提供します。
index
は、文字列が別の文字列の部分文字列であるかどうかを確認するために使用します。
!=
とはne
ので、同じではありません!=
し、ne
異なるように定義されています。どれくらい難しいですか。数値比較演算子であるため、!=
両方のオペランドを数値に変換しますperl -E 'say "equal" if not "a" != "b"'
。
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のブール演算子から取得します。実際にはブール演算または数値演算の戻り値のみを使用する必要があります。この場合、違いは重要ではありません。)
eq
、gt
、lt
等...正しくない彼らは、trueまたはfalseを返します。cmp
特定の数値のみを返します。
leg
代わりにcmp
一般的な比較に使用される代わりに使用することを除いて、同じ演算子を使用します。
文字列比較演算子のSinanÜnür包括的なリストに加えて、Perl 5.10はスマート一致演算子を追加します。
スマートマッチオペレーターは、タイプに基づいて2つのアイテムを比較します。5.10の動作については、下のグラフを参照してください(この動作は5.10.1でわずかに変更されていると思います)。
perldoc perlsyn
「詳細なスマートマッチング」:スマートマッチの動作は、引数の種類によって異なります。これは常に可換であり、つまり
$a ~~ $b
と同じように動作し$b ~~ $a
ます。動作は、次の表によって決定されます。適用される最初の行は、どちらの順序でも、一致動作を決定します。
$ a $ b一致のタイプ暗黙の一致コード ====== ===== ===================== ============= (オーバーロードはすべてを切り捨てます) コード[+]コード[+]参照等価$ a == $ b 任意のコード[+]スカラーサブ真理$ b −>($ a) ハッシュハッシュハッシュキーは同一[ソートキー%$ a] ~~ [ソートキー%$ b] ハッシュアレイハッシュスライスの存在grep {exists $ a −> {$ _}} @ $ b Hash Regexハッシュキーgrep grep / $ b /、キー%$ a ハッシュ存在するハッシュエントリ$ a −> {$ b} 配列配列配列は同一です[*] 配列正規表現配列grep grep / $ b /、@ $ a 配列Num配列には数値grepが含まれています$ _ == $ b、@ $ a 配列任意の配列に文字列grep $ _ eq $ b、@ $ aが含まれています undef undefined!defined $ a すべての正規表現パターンが$ a =〜/ $ b /に一致します Code()Code()の結果は等しい$ a −>()eq $ b −>() 任意のCode()単純な閉鎖の真理$ b −>()#$ aを無視 num numish [!]数値的等式$ a == $ b 任意のStr文字列の等価$ a eq $ b 任意の数値の等式$ a == $ b 任意の文字列等価$ a eq $ b + −これは、プロトタイプ(存在する場合)が ""でないコード参照である必要があります ( ""プロトタイプのサブメンバーは、下にある 'Code()'エントリによって処理されます) *-つまり、各要素は他の同じインデックスの要素と一致します アレイ。循環参照が見つかった場合、参照にフォールバックします 平等。 !−実数、または数値のように見える文字列もちろん、「一致コード」は実際の一致コードを表すものではありません。意図された意味を説明するためだけにあります。grepとは異なり、スマートマッチオペレーターは可能な限り短絡します。
オーバーロードによるカスタムマッチング
~~
演算子をオーバーロードすることで、オブジェクトのマッチング方法を変更できます。これは、通常のスマートマッチのセマンティクスよりも優先されます。を参照してくださいoverload
。
この質問の明らかなサブテキストは次のとおりです。
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
要するに:
==
またはを使用して!=
、2つのオペランドを数値として比較するeq
またはを使用してne
、2つのオペランドをテキストとして比較するスカラー値を比較するために使用できる他の多くの関数と演算子がありますが、これら2つの形式の違いを知ることは重要な最初のステップです。
また、2つの文字列の違いを抽出したい場合は、String :: Diffを使用できます。