3

sort()先日、Perlの関数での「$a」と「$b」の使い方について質問しました。

Perlの「sort()」関数の「$a」と「$b」は正確には何ですか?

フォローアップの質問があります。"$a" と "$b"sort()は、これらの特殊なグローバル変数を利用する Perl 関数でのみ使用されますか?

sort()または、他の関数がそれらを使用しない場合でも、「$a」または「$b」を使用する以外の状況はありますか?

編集:

明確にするために:

sort()要するに、問題は、「$a」と「$b」を?以外で使用できるかということです。

それらが他にどのような状況で使用できるかを知りたいだけです.「$a」または「$b」が他のもので使用されているのを見たことがなく、sort().

4

4 に答える 4

6

"$a" と "$b" を 以外で使用できsort()ますか?

すでに説明したように、$aandについて特別なことは何もありません$b(事前に宣言されていることを除いて)。通常の変数を 1 つの関数以外で使用できるかどうかを尋ねるのは意味がありません。ここでは$a、そうでないものによって使用されていsortます:

 $ perl -E'$a=123; say $a;'
 123

そうは言っても、そうするのはあまり良い考えではありません。レキシカル変数を使用するのが最善であり、 $aor$bをレキシカル変数として宣言するとsort、オーバーライドなしで (または List::Util の関数で)使用できなくなりますour ($a,$b);

$ perl -e'sub foo { my ($a) = @_; "..."; sort { $a cmp $b } @a; "..." }'
Can't use "my $a" in sort comparison at -e line 1.
于 2014-10-01T14:20:58.110 に答える
2

List::Util::reduce などの他の非組み込み関数もそれらを使用します。

しかし、なぜあなたが尋ねているのか説明していただけますか?それよりも大きな答えを求めているような気がします。

于 2014-10-01T14:08:10.797 に答える
1

$a と $b は、並べ替え関数が比較す​​る 2 つの要素に割り当てる名前であり、ユーザー提供のコールバック関数「compare()」に割り当てるパラメーターです。

パラメータとして関数を提供し、その関数に2つ(またはそれ以上)の引数を提供する、設計する任意の関数で「$a」、「$b」ロジックを使用して考えることができます...

私が十分に明確だったことを願っています...

于 2014-10-01T14:07:15.423 に答える
1

簡単な答えは、「いいえ、文脈を除いて特別ではありませんsort」です。しかし、最近、ルーチンの外でそれらを使用する機会がありましたsort。これは、あなたの質問に密接に関係しています。

関数を 1 回の比較に利用するために$a、 and を$b直接使用しました。sortそれらをスコープし、ブロックをlocal使用してスコープを含めました。do

my $cmp = do {
    local $a = $summary->{current_version};
    local $b = $latest_version_on_usb;
    cmp_version();
};

cmp_versionは で使用するように設計されたサブルーチンsortであるため、通常は次のように使用します。

my @sorted_versions = sort cmp_version @old_versions;

cmp_versionによって呼び出されることを知っているためsort、すべての作業を$aおよび$b内部で実行します。

ソート サブルーチンを非ソート コンテキストで再利用したかったという事実 ( orのような実際の演算子であるかのように単一の " $foo cmp_version $bar" 比較の出力が必要だった) が、これを促したものです。それがブロックやサブルーチンでない限り、私が考えることができる唯一の理由です-それらがコンテキスト内特別であるという事実は、そのコンテキストの外でそれらをいじるとあなたを噛むことになる可能性があることを意味します.cmp_version<=>cmp$a$bsortsort

于 2017-02-06T17:50:50.527 に答える