Perlでは算術演算子と文字列演算子は分離して実装されています。例えば、+、-、*、/は数学的操作に使用され、.(ドット)は文字列の連結に使用されます。Perlは動的に型を変換します:少なくとも1つのオペランドが数値コンテキストにある場合、文字列は自動的に数値に変換されます(例えば、'42foo'は42になります)。これにより、暗黙の型変換時に予期しない結果を引き起こす可能性があります。
例:
my $a = "3"; my $b = "4 apples"; my $c = $a + $b; # $c = 7 my $d = $a . $b; # $d = '34 apples'
比較演算子も異なります:
==、!=、>、<)eq、ne、gt、lt)Perlにおける演算子==とeqの違いは何ですか?また、文字列値を==で比較するとどうなりますか?
回答と例:
==は数値の比較を行い、文字列を数値に暗黙的に変換しますが、eqは文字列の比較を行います。文字列に==を使用するのは誤りです:
my $x = "foo"; my $y = "foo"; print $x == $y ? "equal" : "not equal"; # 'not equal'と表示され、不正な変換について警告します
エピソード1: ログ処理プロジェクトでは、
eqの代わりに==を使って文字列を比較し、必要なレコードを見逃すことがありました。フィルタリングのロジックが壊れ、実行時エラーがなかったため、バグを長い間見つけられませんでした。
エピソード2: 数値の連結時に、
+の代わりに.を誤って使用したため、予期しない空白やデータの損失が発生し、キャッシュキーの形成が不正確になり、結果としてキャッシュが正しく動作しなくなりました。
エピソード3: 余分な文字を含む文字列、例えば
'100abc'が数値100に自動的に変換され、eコマースプロジェクトの割引計算において逆説的なエラーを引き起こしました。誤った入力データのため、一部の割引が正しく計算されませんでした。