【Perl】 Smart::Match::noneをより自然言語風に使う

投稿日: / 更新日:

Perl 5.10からの新機能であるスマートマッチは、左辺と右辺の値の種類によって、比較の挙動をよしなに変えてくれるという非常に便利な機能ですが、Smart::MatchというCPANモジュールには、このスマートマッチ機能をさらに便利に使うためのヘルパー関数が多数含まれています。

Smart::Matchのヘルパー関数の中で私がよくお世話になるのは、anynoneなど、リストと比較を行うための関数です。例えば、ある変数の値が別のリストの要素に一つも含まれていないかどうかを確認する場合、以下のようなコードをよく書きます。

以上のように、どのような条件判定をしているかがより分かりやすくなります。ただ、ここまで来ると、「もっと自然言語風にしてみたい」という欲求も生まれてきます。上記の例で言えば、$var ~~ none of ...のように記述できれば嬉しいところです。

上記を実現するため、以下のようなモジュールを書いてみます。なお、引数をカッコなしで渡せるようにするため、プロトタイプを指定しています。ちなみにPerlでは、コードが顔文字のように見えることが往々にしてあります。

使用例は以下のとおりです。

ok(not ‘foo’ ~~ none of ‘foo’, ‘bar’, ‘baz’); ok(not ‘bar’ ~~ none of ‘foo’, ‘bar’, ‘baz’); ok(not ‘baz’ ~~ none of ‘foo’, ‘bar’, ‘baz’); ok( ‘boo’ ~~ none of ‘foo’, ‘bar’, ‘baz’);

done_testing; [atomitech@node01 perl]$ perl test.pl ok 1 ok 2 ok 3 ok 4 1..4

期待どおりの動作になりました。コードの量が増えて若干面倒になったきらいはあるものの、より自然言語風に記述できるようになりました。以上、あまり有益なTipsではありませんが、スマートマッチに関する簡単な話題をご紹介しました。

Hinemos導入はアトミテックにお任せください

見積もりを依頼する

最新情報発信中

Xやメルマガでも、Hinemosの保守、
開発、導入、構築やカスタマイズ等の
お役立ち情報を発信しています。
是非ご登録ください。