しゃのんあどべんとかれんだー 15 日目 (Perl のサブルーチン定義で引数の個数をチェックできる方法について) 匿名 匿名 この記事は、しゃのんあどべんとかれんだー 15 日目の記事です。 ![Perl5](http://2.bp.blogspot.com/-cdJvIfDDoYE/Vopyt16XWfI/AAAAAAAAAVw/znH13oyk6LA/s200/perl.png) どうも、munepom (`@__munepom__`) です。 今回は、Perl のサブルーチン定義で引数の個数をチェックできる方法についてのおはなしです。 signatures ですね。 # signatures について調べたきっかけ 個人開発では perl 5.22.0 と Mojolicious を利用しているのですが、 Mojolicious のサンプルコードを見ていたら、サブルーチン定義まわりで不思議な書き方が載っていたので、調べてみました。 # perl 5.19.9 以降で使える方法についてのおはなし どうやら、perl 5.19.9 以降では、 `use experimental 'signatures';` のように記述すると、サブルーチン定義時に ``` sub hello ($hoge) { ... } ``` のような書き方ができるようですね。デフォルト引数も定義できます。 わざわざ、 ``` sub hello { my $hoge = shift; ... } ``` のように書かなくて済みますね。 signatures を利用してサブルーチン定義ができると、Java 使いから Perl 使いへジョブチェンしても、さほど違和感なくメソッドを書けると思います。 # signatures を試してみる 今回は、こんなサンプルコードで試してみましょ。 実行結果は、ソース内のコメントを参考にしてみてください。 ``` #!/usr/bin/env perl use strict; use warnings; use feature ':5.10'; use utf8; use B::Deparse; use experimental 'signatures'; ### test hello_with_default(); # Hello World hello("hoge"); # hoge #hello(); # Too few arguments for subroutine at sub_args.pl line xx. #hello("hoge", "fuga"); # Too many arguments for subroutine at sub_args.pl line xx. ### deparse my $d = B::Deparse->new("-p", "-sC"); say $d->coderef2text(\&hello); # hello サブルーチンのダンプを見られます ### sub sub hello ($msg) { say $msg; } sub hello_with_default ($msg = 'Hello World') { say $msg; } ``` 面白かったのは、B::Deparse でダンプしてみると、 ``` { BEGIN {${^WARNING_BITS} = "\x54\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x45\x55\x55\x01"} use strict; use feature 'say', 'signatures', 'state', 'switch'; ((@_ <= 1) or die(sprintf("Too many arguments for subroutine at %s line %d.\n", ((caller))[(1, 2)]))); ((@_ >= 1) or die(sprintf("Too few arguments for subroutine at %s line %d.\n", ((caller))[(1, 2)]))); (my $msg = $_[0]); (); say($msg); } ``` のように、引数チェックがコードとして組み込まれている点でした。 デフォルト引数がある場合は、ご自身で確認してみてください。 実行時にしか確認できないのが難点ですが、引数の個数チェックが自動でなされるだけでも、安心感が増すと思います。 安心できるコードを目指して(?) レッツ Enjoy! (・ω・)ノ Tweet Share Share Share Share