この記事はPerl Advent Calendar 2020とモバイルファクトリー Advent Calendar 2020 2日目の記事です。
こんにちは。id:kfly8 です。
今年、会社の勉強会の時間を使ってちょこちょこと、perl-users.jpを静的サイト化しました。 せっかくなので、2008年から2010年の記事を読み返したのですが、勉強になりました。 温故知新というと大仰ですが、昔から今にかけての変化も触れながら、 個人的に面白かった記事をいくつか紹介してみたいと思います。
1. 元々の文字列を破壊しないように置換する方法
最も素朴な方法は、別の文字列に退避する方法だと思いますが、2行になって面倒です。
my $old = "dog"; my $new = $old; $new =~ s/dog/cat/;
2008/12/12で紹介されていたのが、List::MoreUtils#apply
を使う方法です。
my $new = apply { s/dog/cat/ } $old;
確かに、ワンステートメントで意図がはっきりして読みやすいです。 さらに、2008/12/12で、代入文をカッコにくくる方法が紹介されています。シンプル。
(my $new = $old) =~ s/dog/cat/;
今だと、perlのバージョンが5.14 以降であれば、replace optionを使って、よりスッキリ書けますね。
my $new = $old =~ s/dog/cat/r;
2. SQLiteでdbをオンメモリにする
SQLiteを利用してテストを書く時、dbのファイルを管理するのが面倒、オンメモリで処理してしまえば、ファイルが意図せず消えなかった時のことを考えなくて便利という話です。
2008/12/10時点では、
DBI->connect('dbi:SQLite:','','');
のように、dbnameを指定しない方法が紹介されていましたが、
今だと、DBI->connect('dbi:SQLite:dbname=:memory:','','')
といった具合に:memory:
を指定して明示的に書けます。
3. Errnoでエラー処理する
「ディレクトリが存在しなければ作成」という処理を素朴に書けば、ディレクトリの有無確認(-d
)して作成する(mkpath
)すると思います。
ただ、この書き方だと、-d
のあとmkpath
を呼び出すまでの束の間に、別の処理がディレクトリを作成してしまう可能性はあります。
if (! -d $dir) { mkdir $dir or die "failed to create dir:$dir:$!"; }
この可能性を考慮するなら、まずディレクトリの作成を試みて、返されたエラー変数($!
)とErrnoの定数と数値比較するという話が、2009/12/05の記事で紹介されています。
unless (mkdir $dir or $! == Errno::EEXIST) { die "failed to create dir:$dir:$!"; }
こういった低レベルな内容だと、10年経っても原理は変わらないですね。
4. DBIx::TransactionManagerとSQL::Maker
2010/12/10にDBIx::TransactionManager、2010/12/13にSQL::Makerの紹介がされています。この2つのモジュールは、今でも使われているORMのAnikiやDBIx::Sunnyの内部で利用されています。
この2つのモジュールに関して、DBIx::Skinnyからパーツを分解して出来ていることが、2010/12/05の記事でわかります。歴史的経緯がわかって面白いです。
5. 記号プログラミングアドベントカレンダー
記号プログラミングのネタだけで、25日走りきっているアドベントカレンダーがありました。「どこへ向かっているの?」というはてぶコメントがありましたが、10年経っても色褪せないコメントだと思いました。
記事は、1日目BrainF*ck、2日目PHP、3日目JavaScript、4日目Ruby、5日目Perl・・・と続きます。
おわりに
紹介できた内容はほんの一部ですが、先人の記事は面白かったです。 過去の記事を読み返してみるのもたまには良いかもしれないと思いました。
明日の記事は Perl Advent Calendarは、hkobaさん、モバイルファクトリーAdvent Calendarは、id:momoyagi さんです!