英語のPerl Advent Calendar 2017を見てみる
この記事はPerl Advent Calendar 2017 16日目の記事です。
日本でもエンジニア界隈ではしっかりお馴染みとなったAdvent Calendarですが、実は英語の Perl Advent Calendarが最も古いAdvent Calendarのようです。
https://workq.qiita.com/products/adventcalendar/
ということで最古で最長のPerl Advent Calendar 2017を流し読みしてざっくりまとめてみました。
今は記事を書いている15日の記事分までしかありませんが、年内に25日までの記事を追記する予定です。
もっと過去の記事を見たい場合urlの2017を適当なものに変更すると表示できます。
そしてgithubでも公開されています。
http://www.perladvent.org/
Day1 Emoji - Printing Unicode with Perl
http://www.perladvent.org/2017/2017-12-01.html
見ても分からない文字コードじゃなくてASCII文字でも絵文字表現できます。
$ perl -e 'use open qw/:encoding(UTF-8) :std/; print "\N{FATHER CHRISTMAS}";' 🎅 $ perl -e 'use open qw/:encoding(UTF-8) :std/; print "\N{SNOWMAN}";' ☃
http://www.fileformat.info/info/unicode/char/search.htm?q=snow
Day2 Around the world with Emoji - Emoji::NationalFlag
http://www.perladvent.org/2017/2017-12-02.html
CPANモジュール Emoji::NationalFlagの紹介です。
作者は@punytanさんです
$ perl -e 'use open qw/:encoding(UTF-8) :std/;use Emoji::NationalFlag qw/code2flag/;print code2flag('jp'). " ". code2flag('us'). " ". code2flag('gb');' 🇯🇵 🇺🇸 🇬🇧
Day3 Context Matters - Enforcing coding standards via Perl::Critic
http://www.perladvent.org/2017/2017-12-03.html
CPANモジュール Perl::Criticの紹介です。
コーディング規約に沿った実装ができているかを確認することができます。
Day4 Here(doc) it is Merry Christmas - Modern Heredocs
http://www.perladvent.org/2017/2017-12-04.html
perl 5.26からヒアドキュメントにもインデントを付けられるようになったという紹介です。
地味に便利!
perl -e ' { my $sql = <<~SQL; 松島や ああ松島や 松島や 松尾芭蕉 SQL print $sql; } ' 松島や ああ松島や 松島や 松尾芭蕉
Day5 Santa Baby(cart) - The Babycart Operator
http://www.perladvent.org/2017/2017-12-05.html
テキストにリファレンスとかの変数を展開する話
Perl触ってすぐのころはどれが展開できるのか迷った記憶があります。
@{[ ]}
をbaby cartと呼ぶんですね。初知り。
http://search.cpan.org/dist/perlsecret/lib/perlsecret.pod#Baby_cart
Day6 North Pole Safety Precautions - Import::Into
http://www.perladvent.org/2017/2017-12-06.html
CPANモジュール Import::Intoの紹介
Import::Intoを使うと様々なチェックが行われるようになります。
Day7 Choices, choices, so many choices! - Term::Choose
http://www.perladvent.org/2017/2017-12-07.html
CPANモジュール Term::Chooseの紹介
文字で説明するより記事のgif画像が一番分かると思います。
スクリプト実行時にy/nで選択するようなコードは書いたことあるけど、項目からインタラクティブに選択できるとは...
Day8 Constantly Merry - Const::Fast
http://www.perladvent.org/2017/2017-12-08.html
CPANモジュール Const::Fastの紹介
constを使って定義をすると変数に代入したり、変数にないものにアクセスしようとするとエラーになります。
Scalar, Array, Hashに対応しています。
perl標準のconstantプラグマを使うより変数として扱えるので便利そうです。
$ perl -e 'use Const::Fast; const my $HOGE => "hoge"; $HOGE = "fuga";' Modification of a read-only value attempted at -e line 1. $ perl -e 'use Const::Fast; const my $HOGE => +{ hoge => 1, huga => 1 }; $HOGE->{foo};' Attempt to access disallowed key 'foo' in a restricted hash at -e line 1.
Day9 Matching the NaughtyNice Formula - Recursive Regular Expressions with Named Groups
http://www.perladvent.org/2017/2017-12-09.html
みんな大好き正規表現の紹介です。
BNF記法っぽく再帰的に正規表現を書けます。
日本語ドキュメントだとこちらが分かりやすかったです。
http://perldoc.jp/docs/perl/5.14.1/perlre.pod
Day10 Evaluating the NaughtyNice Formula - Eval::Closure
http://www.perladvent.org/2017/2017-12-10.html
CPANモジュールEval::Closureの紹介です。
Day9の続きの話になります。
Eval::Closureは文字列をクロージャーに入れて安全に処理してくれるらしいです。
use Eval::Closure; my $str = '$hoge/$fuga+$poge'; my ($hoge, $fuga, $poge) = (10, 5, 1); my $code = eval_closure( source => "sub { $str }", environment => { '$hoge' => \$hoge, '$fuga' => \$fuga, '$poge' => \$poge, }, ); print $code->(); # 3
Day11 Tiny Path Handling - Path::Tiny
http://www.perladvent.org/2017/2017-12-11.html
CPANモジュールPath::Tinyの紹介です。
ディレクトリやファイルを操作できます。
Day12 A Christmas Memory - Devel::MAT
http://www.perladvent.org/2017/2017-12-12.html
CPANモジュールDevel::MATの紹介です。
Devel::MATはメモリ解析のツールでMemory Analysis Toolの頭文字でMATらしいです。
Devel::MATを入れるとpmatコマンドが使えるようになります。
Day13 It's All There in the Numbers! - Unicode::UCD
http://www.perladvent.org/2017/2017-12-13.html
CPANモジュールUnicode::UCDの紹介です。
ユニコード名や文字コードからUnicode Character Databaseを元に調べることができます。
$ perl -e 'use Unicode::UCD qw/charinfo/;use Data::Dumper;print Dumper charinfo(12450);' $VAR1 = { 'block' => 'Katakana', 'script' => 'Katakana', 'decimal' => '', 'bidi' => 'L', 'name' => 'KATAKANA LETTER A', 'upper' => '', 'unicode10' => '', 'digit' => '', 'code' => '30A2', 'decomposition' => '', 'combining' => 0, 'lower' => '', 'title' => '', 'comment' => '', 'category' => 'Lo', 'mirrored' => 'N', 'numeric' => '' }; $ perl -e 'use Unicode::UCD qw/namedseq/;print namedseq("KATAKANA LETTER A");' 12450 $ perl -e 'use open qw/:encoding(UTF-8) :std/; print "\N{KATAKANA LETTER A}";' ア
Day14 Prereqing around the Christmas Tree - Perl::PrereqScanner
http://www.perladvent.org/2017/2017-12-15.html
CPANモジュールPerl::PrereqScannerの紹介です。
依存したモジュールを抽出できます。
@moznionさん作の高速化されたPerl::PrereqScanner::Liteもあります。
http://moznion.hatenadiary.com/entry/2014/03/21/231805
Day15 Mojolicious on the Command Line - ojo
http://www.perladvent.org/2017/2017-12-15.html
CPANモジュールojoの紹介です。
Mojoをワンライナーで書くことができます。
メソッドも全部1文字なので記憶力が試されそう。
$ perl -e 'use ojo;print g("http://www.perladvent.org/hoge.html")->text;' # スクレイピング <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>404 - Not Found</title> </head> <body> <h1>404 - Not Found</h1> </body> </html> $ perl -e 'use ojo;print r({ hoge=> [1,2,3] });' # dump { "hoge" => [ 1, 2, 3 ] } $ perl -e 'use ojo;print j([{ a => 1 },{ b => 2 }]);' # json encode [{"a":1},{"b":2}]
まとめ
知らないモジュールばっかりで勉強になりました。
あと英語が全然分からないので頑張ろうと思います。
今年は寄稿者が同じ方だけですが18年目も無事完走しそうですごいです。
最後に2016/12/25の記事にいいことが書いてあったので抜粋と意訳
with thanks
Year after year the Perl Advent Calendar is our gift to you the Perl Community. The Perl Advent Calendar hopes to teach you all a little something more about Perl in a fun and playful way. Sometimes we focus more on the teaching, making things clearer and easier for every Perl programmer to understand. And sometimes we focus just on the fun...
http://www.perladvent.org/2016/2016-12-25.html
Perl Advent Calendarは毎年あなたへの贈り物です。
楽しく遊び心をもって教えられていることを願っています。
全てのPerlプログラマが理解できるように、より明確に、より簡単になることを目指します。
そして、時には楽しむことだけに集中します。
明日17日はPerlの軽量ORM Anikiの作者でもある@karupaneruraさんです。