sironekotoroの日記

Perl で楽をしたい

Perl入学式 オンライン 2021 第3回お疲れ様でした

Perl入学式 オンライン 2021 第3回

受講された方、サポーターの方、お疲れ様でした。 講師の人です。

今回は配列操作の関数、ハッシュ、ハッシュ操作の関数、サブルーチンを学びました。

今回のスライドの内容です。

github.com

講義中に解いた練習問題の回答例です。

github.com

講義スライドや動画を見て、不明点がある場合には Discord で質問してみてください。第 0 回の環境構築、第 1 回、第 2 回、前年度の内容などについてでも大丈夫です。

サポーター陣一同お待ちしております

discord.com

sort について

講義中、配列の並び替えのところで sort を紹介しました。

my @array  = ( 5, 4, 3, 2, 1 );
my @sorted = sort { $a <=> $b } @array;
print "@sorted";    # 1 2 3 4 5

受講生の方から、この時の $a$b には何が入っているのか?との質問がありました。

こういうのは嬉しいですね。助かります。

実際に講義中に校長である xtetsuji さんからのアドバイスを受けて書いたものを、これまでの講義範囲の内容で書き直すとこんな感じです。

my @array  = ( 5, 4, 3, 2, 1 );
my @sorted = sort {
    print '$a:' . "$a\n";
    print '$b:' . "$b\n";
    print '=========' . "\n";
 $a <=> $b
 } @array;

print "@sorted";    # 1 2 3 4 5

実行結果がこれ

$a:5
$b:4
=========
$a:3
$b:2
=========
$a:4
$b:2
=========
$a:4
$b:3
=========
$a:2
$b:1
=========
1 2 3 4 5

配列の先頭から 2 つとってきて、$a と $b に代入していますね。

代入した後は <=> 宇宙船演算子で比較しています。

講義時には解説しませんでしたが、この宇宙船演算子は、左側が小さい時は -1, 同じ値の時は 0 , 右側が小さい時は 1 を返します。

早速、今回学習したサブルーチンを使ってみてみます。

print "1 <=> 2 : " . spaceship( 1, 2 ) . "\n";
print "1 <=> 1 : " . spaceship( 1, 1 ) . "\n";
print "2 <=> 1 : " . spaceship( 2, 1 ) . "\n";

sub spaceship {
    my ( $a, $b ) = @_;
    return $a <=> $b;
}
1 <=> 2 : -1
1 <=> 1 : 0
2 <=> 1 : 1

この宇宙船演算子の結果により、左右の値の大小を比較しています。

つまり、sort 関数は二つの値を取り、比較し、並べ替えることを繰り返すことで、最終的に配列全体を並べ替えています。

ソートアルゴリズムは奥が深く、アルゴリズムの例題としてよく取り上げられます。

自分は情報処理試験で複数のソートアルゴリズムがあることを知った口ですが、興味ある方は Perl (や得意な言語)で実装してみると面白く、かつ難しさがわかるかもしれません。

ja.wikipedia.org

次回

10 月以降を予定していますが、新型コロナウイルスの感染状況によってはオフライン版との並行になるかもしれません。

次回は Perl 初心者の鬼門「リファレンス」と「正規表現」をやる予定です。