次のコードは、実際には@ arr0と@ arr1が等しくなく、並べ替え後でも等しくないがなぜ "eq"が出力されるのですか?最初は、並べ替え機能の戻り値について考えましたが、配列を返しました。理由は何ですか?perlスマートマッチを使用してソートされた配列を比較します
my @arr0 = (1,2);
my @arr1 = ("a","b");
if ((sort @arr0) ~~ (sort @arr1)) {
print "eq\n";
};
次のコードは、実際には@ arr0と@ arr1が等しくなく、並べ替え後でも等しくないがなぜ "eq"が出力されるのですか?最初は、並べ替え機能の戻り値について考えましたが、配列を返しました。理由は何ですか?perlスマートマッチを使用してソートされた配列を比較します
my @arr0 = (1,2);
my @arr1 = ("a","b");
if ((sort @arr0) ~~ (sort @arr1)) {
print "eq\n";
};
[注:この回答のドキュメントへのリンクはすべてバージョン5.12.1のドキュメントにあります。これにより、元のポスターに役立ちます - それは他の人にはあまり役に立たないかもしれません。]
配列とリストが同じでないことを認識することが重要です。これは、動作が異なる場合の1つです。
それは言って開始しdocumentation for sort()
を読むことも重要です:リストコンテキストで
が、これは、リストをソートし、ソートされたリスト値を返します。スカラーコンテキストでは、sort()の振る舞いは未定義です。
そこには2つの重要なことがあります。まず、リストコンテキストでは、sort()
は配列ではなくリストを返します。第2に、スカラーコンテキストでは、その振る舞いは未定義です。
次に、smartmatch documentationを見てみましょう。これは、私がここで再現しない、大きなオペランドのテーブルです。しかし、リストにはまったく言及していないことに注意してください。したがって、スマートマッチはスカラーコンテキストでsort()
を呼び出して、結果(テーブルの最後の数行の1つ)で文字列または数値の比較 を実行しています。
しかし、スカラーコンテキストでのsort()
の動作は未定義です。誰がスマートマッチの価値を比較しているのかを知っている人。しかし、私は、ランダムな値が返ってきたとしても、両方のリストに同じランダムな値を返していることは間違いありません。それは彼らが平等であると思われることを意味します。
コメントで述べたように、ソート結果を配列に保存して配列をスマートマッチに渡すと機能します。これは、配列にはsmartmatchテーブルで定義された特別な動作があるからです。
sort()
を呼び出さないでくださいリストアップデート:コメントで述べてThisSuitIsNotBlackとして、それは5.10で導入されて以来、スマートマッチはかなり不安定になっています。その動作はPerlリリースのほとんどすべてで調整されており、最終的な形式は完全には合意されていません。そのため、私はそれをまったく使用しないことを強くお勧めします。
私は3番目の箇条書きを追加します:スマートマッチを使用しないでください。これは実験的なものであり、将来的には間違いなく変化します。 – ThisSuitIsBlackNot
@ThisSuitIsBlackNot:はい、私は言及するつもりでした。念押し有難う。私はそれを私の答えに加えました。 –
Re "*その挙動はPerlのリリース以来ずっとずっと微調整されています*"、そうではありません。 2つの変更点があります:5.10.1(機能変更)と5.18(実験的とマークされています)。 – ikegami
どのPerlバージョンをお使いですか?スマートマッチ演算子が数回変更されました。ユースケースの配列と配列が影響を受けているかどうかはわかりませんが、わかりやすく説明してください。 – simbabque
Perlのバージョンはv5.12.1です、ありがとうございます。 – orange
現在の5.24.1の動作では、配列の各ペアで文字列を等しくする必要があります。しかし、リストはありますが配列はありません。それは違いを生むかもしれない。多分、彼らはスカラーコンテキストに強制されるでしょう。私は今、コンピュータを持っていません。配列を直接配置してください。 – simbabque