チーフエンジニア兼エンジニアリングマネージャのid:taraoです。先日開催されたYAPC::Kyoto 2023にはたくさんの方にご参加いただけまして、ありがとうございました。
トートバッグに書かれたPerlコード
YAPC::Kyoto 2023には、はてなもスポンサーとして参加しており、会場で配布されたトートバッグのデザインも提供していました。そのバッグの片面にPerlのコードが書かれていたことにはお気づきいただけたでしょうか?
コードを書き写すと以下のようになります。
use feature qw(try); try { Something->new; } catch ($your_dream) { tell $your_dream and seek our $future, @ YAPC::Kyoto, 2023; }
今回のカンファレンスのテーマは「try/catch」だったので、それに沿った内容になっています。tell $your_dream
は、登壇者には発表を通して、参加者にはブログなどで語ってほしいという意味を込めています。
Perl Poetry
このコードは実はエラーなく実行できます。
$ perl yapc_kyoto_2023.pl try/catch is experimental at yapc_kyoto_2023.pl line 3. try/catch is experimental at yapc_kyoto_2023.pl line 5. $ echo $? 0
このように、なんとなく自然言語として読める感じになっているのにPerlのコードとして合法(perl -c
でsyntax ok
が返る・エラーなく実行できる)なもののことをPerl Poetryと言います*1。
世の中のPerl Poetryの様子はこちらのスライドを見るとわかると思います。
実用的なコードに使われている例もあります。
コードを読み解く
せっかくなので、今回のコードを合法なPerlコードとして解釈するとどうなるのか見ていきましょう。
3~4行目
try { Something->new;
Something
というパッケージはロードしておらず、->new
の呼び出しはエラーになりますが構文としては合法で、try
の中なので実行時エラーがcatch
されます。
5行目
} catch ($your_dream) {
4行目で発生したエラーを$your_dream
という変数でcatch
しています。$your_dream
には"Can't locate object method \"new\" via package \"Something\" (perhaps you forgot to load \"Something\"?) at yapc_kyoto_2023.pl line 4.\n"
という文字列が入っています。
変数名の部分は構文上$
で始まっている必要があり(@
ではダメで)、my
やlocal
をつけることもできずレキシカル変数に限定されているようです。
6~8行目
難しいですが、use warnings
すると少し雰囲気がわかります。
$ perl yapc_kyoto_2023.pl try/catch is experimental at yapc_kyoto_2023.pl line 3. try/catch is experimental at yapc_kyoto_2023.pl line 5. Name "YAPC::Kyoto" used only once: possible typo at yapc_kyoto_2023.pl line 8. tell() on unopened filehandle at yapc_kyoto_2023.pl line 6. Use of uninitialized value $future in ref-to-glob cast at yapc_kyoto_2023.pl line 6. seek() on unopened filehandle at yapc_kyoto_2023.pl line 6.
まず6行目は明らかにファイルハンドルではないもの(文字列)を渡しています。
tell $your_dream
結果は-1
が返るものの、これは組み込み関数tell
の想定された挙動です。
続く7~8行目は組み込み関数seek
の呼び出しです。seek
は3引数関数です。
and seek our $future,
第1引数のour $future
はファイルハンドルではないためuse warnings
していると警告が出ますが、構文としては合法です。open
だったらこのような書き方をしますよね。
第2引数は一見どういうことなのかわからないかもしれません。
@ YAPC::Kyoto, 2023;
Name "YAPC::Kyoto" used only once
の警告がヒントになってますが、実はこれ@YAPC::Kyoto
という変数(YAPC
パッケージのグローバル変数@Kyoto
)として解釈されます。ここにスペース入れても大丈夫なんですね! 僕も知りませんでした。ちなみにこの部分のコードを考えたのはCTOのid:motemenです。
第3引数は単に2023
という数値ですね。
seek
は失敗しても偽が返るだけで、引数がデタラメでも実行はできます。
これでめでたくこのコードがエラーなく実行できることが確かめられました。
おわりに
これくらいのちょっとしたコードでも、Perl Poetryを読み書きするといろいろ知らなかった点が発見できて面白いですね。みなさんも是非Perl Poetryに挑戦してみてください。
今回のコードはid:nagayama, id:motemen, id:taraoで考えました。
*1:概念が"Perl Poetry"で1編のコードは"Perl Poem"です