並べ替え〜sort, substr, lengthも使ってみる

◎お題
要素が数値だけのものと文字列だけのものと2つ配列を用意し、数値だけのものは文字列順と数値順、桁数順でそれぞれ昇順と降順に並べ替え、文字列だけのものは文字列順と文字数順でそれぞれ昇順と降順に並べ替えて出力する。

#! /usr/bin/perl

use strict;
use warnings;

#数値ソート
my @array=(101,12,21,33,457,13456,1,99,);
print "default:@array\n";

my @array1=sort{$a <=> $b}@array;
my @array2=sort{$b <=> $a}@array;
my @array3=sort{$a cmp $b}@array;
my @array4=sort{$b cmp $a}@array;
my @array5=sort{length($a) <=> length($b)}@array;
my @array6=sort{length($b) <=> length($a)}@array;

print "numeric_up:@array1\nnumeric_down:@array2\nword_up:@array3\nword_down:@array4\nlength_up:@array5\nlentgh_down:@array6\n";
print "\n";

my @array7=sort{substr($a,0,1) <=> substr($b,0,1)}@array;
print "@array7\n\n";


#文字列ソート
my @arrayA=('hello','age','world','word','cup','cap','come','welcome',);
print "default:@arrayA\n";

my @arrayD=sort{$a cmp $b}@arrayA;
my @arrayE=sort{$b cmp $a}@arrayA;
my @arrayF=sort{length($a) <=> length($b)}@arrayA;
my @arrayG=sort{length($b) <=> length($a)}@arrayA;

print "word_up:@arrayD\nword_down:@arrayE\nlength_up:@arrayF\nlentgh_down:@arrayG\n\n";


#各文字列の1文字目(0が1文字目にあたるため)から2文字目を比較して昇順に並べ替え
my @arrayH=sort{substr($a,0,1) cmp substr($b,0,1)}@arrayA;
print "@arrayH\n";

#各文字列の2文字目(0が1文字目にあたるため)から4文字目を比較して昇順に並べ替え
my @arrayI=sort{substr($a,1,3) cmp substr($b,1,3)}@arrayA;
print "@arrayI\n";

◎ポイント
■数による並べ替え公式は「$a <=> $b」で、文字による並べ替え公式は「$a cmp $b」。文字か数かは、「<=>」か「cmp」かの違い。

■降順にしたければ、公式の$aと$bを逆にすれば良い。

■$aと$bに関数を付けることも可能
例),
・length($a)<=>length($b)
→桁数や文字数で昇順になるよう並べ替える(数での比較だから、並べ替え対象が文字列でも「<=>」を使用)
・substr($a,第一引数,第二引数) cmp substr($b,第一引数,第二引数)
→第一引数から第二引数分だけを比較対象として昇順に並べ替える。但し、第一引数は、0が一文字目にあたる。