1

サブルーチン、つまり数値の配列をソートするために使用されているソート関数に問題があります。ソート関数を単独で使用する場合は、ASCII形式を使用してソートします。これは、本で説明されており、希望する順序ではないためです。私は、文字列<=>に導入されていても、値を比較するために使用することで何が返されるかを認識しており、理解しcmpています(まだ使用していませんが)。

私が具体的に理解していないのは、それがどのようにそれらを数値的に分類するか、つまり実際のプロセスです。何が返されるかは理解できますが、本には-1、0、1が返されると書かれているだけで、最終的に数値がにソートされる方法はわかりません1 8 24 72 144 288

私の例:

sub sort_by_number {
    return $a <=> $b;
}

@myArray = (1,24,8,144,72,288);

foreach(sort sort_by_number(@myArray)) {
    print("$_ ");
}

私が完全に理解している例。それは完全に理にかなっていますが、それは主にコーディングによるものだと思います。

#!/usr/bin/perl

print("Please enter your name: ");
$name = <STDIN>;
chomp($name);
print("Please enter your age: ");
$age = <STDIN>;
chomp($age);

print(greeting($name, $age));

sub greeting {
    $msg = "Hello $_[0], ";
    determine_age($_[1],$msg);
}

sub determine_age {
    $num = ($_[0] <=> 18);
    if ($num == -1) {
        return "$_[1]you are under 18.($_[0])\n";
    } elsif ($num == 0) {
        return "$_[1]you will be a 19 on your next birthday!\n";
    } else {
        return "$_[1]you are over 18!($_[0])\n";
    }
}

誰かが明確にすることができれば大いに感謝します。

4

2 に答える 2

9

2番目の例では、並べ替えは行われません。

「それらを数値的にソートする方法-その実際のプロセス?」に答えるために、 Perlはマージソートアルゴリズムを使用して内部的にソートを実装します(Perl 5.6より前はクイックソートでした)。

アルゴリズム自体はかなり複雑ですが(詳細はWikiを参照)、その下で2つの数値を比較し、一方が他方よりも大きいかどうかを判断し、その判断に応じて何らかのアクションを実行することになります。詳細に興味がある場合、比較が必要なアルゴリズムの部分if first(left) ≤ first(right)はWikiの例の行です。

これがカスタムソートサブルーチンの出番です。これは、ソートアルゴリズムの「どちらの数値が大きいか」という質問に答えます(より具体的には、ある数値が別の数値よりも小さいか等しいか)。

これを実装する方法では、Perlsortは内部で「コンパレータ」関数を呼び出し、2つの引数(エイリアス$a$b)を渡します。そして、最初の関数が2番目の関数よりも小さい、等しい、または大きい場合、関数が負、ゼロ、または正を返すことを期待します。

于 2011-03-14T14:54:42.697 に答える
4

<=>は数値演算子です。を比較すると$a <=> $b、左の引数が右の引数よりも数値的に小さいか、等しいか、大きいかに応じて、-1、0、または1が返されます。

このsort関数はリストの要素をペアで比較するため、2つの引数を取る比較関数(二項演算子)が必要です。Sortすべてのアイテムがリスト内の次のアイテムよりも「大きく」なるまで、ペアを比較し、それらを再オーダリングし続けます。

于 2011-03-14T14:54:59.483 に答える