Category Archives: 6-2.並び替え

Perlでrevisionを並び替え


アニメ『夢王国と眠れる100人の王子様』

やっぱり面白い逆ハーレム。今期アニメなんですが一気に見るため今頃視聴始めました。
ドキドキするんですよねえ。王子が、姫に跪くシーンとかで、ぐぐっとくるので、自分がどちらにときめいているのかわからなくなる時があります。お姫様か、王子か。
まあ、もちろん姫様の方なんですが、王子にときめいている姫にときめいている、ってことだろうと思います。

さて、ときめきの並び替えです。Perlのsortを使うとき、並び替えの条件を関数で指定できますね。

takk@deb9:~/tmp$ cat -n t.pl
     1  sub asc {
     2   if($a < $b){
     3    -1
     4   }elsif($a > $b){
     5    1
     6   }else{
     7    0
     8   }
     9  }
    10
    11  @arr = (1,5,3,2,9,4);
    12  my @result = sort asc @arr;
    13  print "@result\n";
    14
takk@deb9:~/tmp$

上は小さい数字から大きい数字へ、つまり昇順に並び替えするスクリプトです。
実行すると、

takk@deb9:~/tmp$ perl t.pl
1 2 3 4 5 9
takk@deb9:~/tmp$

では、rcsのレビジョンのような数字を、同じスクリプトで並び替えするとどうなるでしょうか。

takk@deb9:~/tmp$ cat -n t.pl
     1  sub asc {
     2   if($a < $b){
     3    -1
     4   }elsif($a > $b){
     5    1
     6   }else{
     7    0
     8   }
     9  }
    10
    11  @arr = (
    12  1.5,
    13  1.1,
    14  1.21,
    15  1.11,
    16  1.3,
    17  );
    18  my @result = sort asc @arr;
    19  foreach(@result){
    20   print "$_\n";
    21  }
    22
takk@deb9:~/tmp$

実行します。

takk@deb9:~/tmp$ perl t.pl
1.1
1.11
1.21
1.3
1.5
takk@deb9:~/tmp$

小数点付きの数字とみなされて並び替えされました。もちろんこれがレビジョンではなく数値なら正しい結果です。

では、レビジョン番号として並び替えするにはどうすればよいでしょうか。
まあ、簡単です。レビジョン比較の関数を使うだけ。
レビジョン比較は、「rcsを使う(その11)」でもやりましたね。

     1  sub rev_asc{
     2          my($a1,$a2) = split /\./,$a;
     3          my($b1,$b2) = split /\./,$b;
     4
     5          return -1 if ($a1 < $b1);
     6          return 1 if ($a1 > $b1);
     7
     8          return -1 if ($a2 < $b2);
     9          return 1 if ($a2 > $b2);
    10          0
    11  }
    12  @arr = (
    13  1.5,
    14  1.1,
    15  1.21,
    16  1.11,
    17  1.3,
    18  );
    19  my @result = sort rev_asc @arr;
    20  foreach(@result){
    21   print "$_\n";
    22  }
    23
takk@deb9:~/tmp$

実行してみます。

takk@deb9:~/tmp$ perl t.pl
1.1
1.3
1.5
1.11
1.21
takk@deb9:~/tmp$

比較関数さえ作ることができれば、並び替えは怖くないですね。