質問: perl のソート関数 perl を使い始めて数年になり、雑誌の隅っこに載る程度のフリーソフトなら作るようにもなりましたが、未だにソート関数の内部構造がさっぱり分かりません(^_^; perl の解説本も数冊、ホームページに至っては十数ほども有名と言われているところを回ってみましたが、ほとんどの perl ユーザーがソート関数の使い方を丸覚えにしているようで、的を得ない解説しか載ってません。 そこで質問ですが、$a と $b には、いったい「何が」「どういうタイミングで」入ってきているのでしょうか?(配列の値が比較されるときに呼び出される、ということは分かりますが) 当たり前に考えれば、ソート関数というものは全てをユーザーに任せて関数を書かせるか、でなければフルオートで全てやってくれるソート関数を用意するか、どちらか1方しかないはずです。 なのに、perl のソート関数は途中部分だけユーザーに書かせるという器用なことをやってます。 これはいったいどういう構造になっているのでしょう?
回答: > 当たり前に考えれば、ソート関数というものは全てをユーザーに任せて関数を書かせるか、でなければフルオートで全てやってく > れるソート関数を用意するか、どちらか1方しかないはずです。 そのふたつ以外に、もうひとつ当たり前があります。 ソートは、要素の大小比較をして、逆転していれば要素を入れ替える、という ことをやるわけですが、「要素の大小比較」というのは、ときと場合によって いろいろ変わります。 というわけで、その変わるところ、つまり「やり方」をソート関数に渡すという 方法があります。 これは perl に限ったことでは無いのですが、(もう、古い言い方なんですが) コールバック処理と言います。 ある処理(この場合は大小比較)を呼び出す側で用意して、何らかの処理(ソート) から呼び出す、つまり、呼び戻すように見えることから、この名前がついています。 処理自体を指定する手段がある言語の標準的なソートは、大体こういう形式 になってます。私が知っているところだと c/c++、ruby なんかがそうです。