mamimumemoomoo's blog

モーモー言いながら書きます。

英語の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さんです。