社内のコードレビューで、Params::Validateのuseの際に、
use Params::Validate qw//;
と後ろにおまけをつけてもらうようお願いしていました。
たまたま、「そういえばなんで qw//; をつけるんですか?」と質問されたので、口頭では簡単に説明したんですが、メモの意味でこちらにも書いておきます。
と言っても、コードがあった方が早いので、以下の3つのファイルを用意しました。
package YAPC::Asia2011; use strict; use warnings; use Exporter qw/import/; our @EXPORT_OK = qw/ is_hold /; sub is_hold{ print "YAPC::Asia 2011 has already held 2011/10/13 - 15 \n"; } 1;
package YAPC::Asia2012; use strict; use warnings; use Exporter qw/import/; our @EXPORT = qw/ is_hold /; sub is_hold{ print "YAPC::Asia 2012 will hold 2012/09/27 - 29 \n"; } 1;
#!/usr/bin/perl use strict; use warnings; use lib "./lib"; use YAPC::Asia2011 qw/is_hold/; use YAPC::Asia2012; is_hold(); exit;
これで、最後のplを実行してみると、
YAPC::Asia 2012 will hold 2012/09/27 - 29
と出力されるはずです。use の順番を2011と2012で逆にすると、
YAPC::Asia 2011 has already held 2011/10/13 - 15
になるはず。
useしたモジュールが@EXPORTに関数を突っ込んでると、自動的にその関数を使えます。
そんなモジュールはたくさんあるし、必ずしもそれが悪い事ではないのですが、
Params::Validateの場合は 「validateとvalidate_pos」が@EXPORTに入ってるので、
特に前者は思わぬところでバッティングしたらイヤだなぁという思いから、これを抑止したかったため
冒頭のお願いに繋がりました。
サンプルのplでも
use YAPC::Asia2012 qw//;
と書くことで、useが後だとしても
YAPC::Asia 2011 has already held 2011/10/13 - 15
になるはずです。
モジュールを作る際には、@EXPORTと@EXPORT_OKどちらに突っ込むかは考慮して作成する必要があると思いますし、使う側としても、適切なもののみ選んでimportする方が良い派です。
そんなこんなで、YAPC::Asia今年も楽しみですね!