Perlでアサーションを実現する方法
Perlでアサーション(assertion)を実現する方法を紹介します。
1.アサーション(assertion)とは
アサーション(assertion)は「表明」という意味で、プログラミングの場合、プログラムの仕様をソースコードに明記することを指します。
具体的には、プログラムの実行時に発生し得ないケースを偽とするboolean式を実行し、式の結果が偽になるようであればエラーや例外等を発生させるための仕組みです。
Javaであれば、次の2通りのシンタックスが用意されています。
assert Expression1;
assert Expression1: Expression2;
下記の場合、xがnullの場合にAssertionErrorが発生します。
assert x != null;
下記の場合、xの値が負の場合にAssertionErrorが発生し、詳細メッセージ「"x = " + x」を出力します。
assert x >= 0: "x = " + x;
2.Perlでのアサーション
Perlでアサーションを実現するには、CPANモジュールCarp::Assertを利用します。
シンタックスはJavaと似たような感じで使えるassert()が用意されています。
assert()
下記の場合、$xが100以下なら、Carp::confess()が呼ばれてプログラムが停止します。
use Carp::Assert;
my $x = 10;
assert( $x > 100 );
実際の動作では次のようになります。
C:\>test.pl
Assertion failed!
at C:/strawberry/perl/site/lib/Carp/Assert.pm line 282.
Carp::Assert::assert("") called at C:\test.pl line 4
メッセージを含めることも可能です。
use Carp::Assert;
my $x = 10;
assert( $x > 100, "x = " . $x );
この場合、次のように出力されます。
C:\>test.pl
Assertion (x = 10) failed!
at C:/strawberry/perl/site/lib/Carp/Assert.pm line 282.
Carp::Assert::assert("", "x = 10") called at C:\test.pl line 4
なお、次の例は×です。
assert( $error = 1 if $x > 100 );
理由は、アサーションを本番で使わない場合、この行が動作せず、$errorに「1」が設定されなくなるためです。
3.その他のアサーション
Carp::Assertではassert()の他に下記の3種類が用意されています。
affirm()
affirm()は記述したブロック全体の真偽を評価します。つまりassert()よりも複雑なアサーションを記述することができます。
affirm {
my $customer = Customer->new($customerid);
my @cards = $customer->credit_cards;
grep { $_->is_active } @cards;
} "Our customer has an active credit card";
should()
shouldnt()
should()は2つの値が同じであることをチェックします。
should( $this, $shouldbe );
shouldnt()は2つの値が同じでないことをチェックします。
shouldnt( $this, $shouldntbe );
should()のサンプルは次のようになります。
my $x = 102;
my $y = 100;
should( $x, $y );
この場合、次のエラーが出力されます。
C:\>test.pl
Assertion ('102' should be '100'!) failed!
at C:/strawberry/perl/site/lib/Carp/Assert.pm line 382.
Carp::Assert::should(102, 100) called at C:\test.pl line 5
shouldnt()のサンプルは次のようになります。
my $x = 100;
my $y = 100;
should( $x, $y );
この場合、次のエラーが出力されます。
C:\>test.pl
Assertion ('100' shouldn't be that!) failed!
at C:/strawberry/perl/site/lib/Carp/Assert.pm line 390.
Carp::Assert::shouldnt(100, 100) called at C:\test.pl line 5
4.アサーションのオン・オフ
アサーションを利用するには
use Carp::Assert;
アサーションをオフにするには
no Carp::Assert;
と記述します。
- Perlでansibleライブラリを作成する方法
- perlのCPANモジュールからRPMを作成する方法
- Perlで「Subroutine permission redefined at~」を抑止する方法
- XML::Simpleのインストールでエラーになる場合の対処
- YAML::Tinyで「YAML::Tiny found bad indenting in line~」というエラーになる場合の対処
- Perlの正規表現を使って文字列をまとめて取得する方法
- Perlのハッシュでキーの有無を調べる方法
- perlで配列の途中の要素を削除する方法
- YAML::Tinyでコロンを利用する方法
- Perlで改行コードがCRのファイルを読み込む方法
- Perlで「Possible precedence issue with control flow operator」という警告の対処
- PerlのLWPで「Can't verify SSL peers without knowing which Certificate Authorities to trust」というエラーになったときの対処
- Perl+Windowsでファイルを再帰的にリネームする方法
- Perlプログラムの中でファイルの一部を書き換える方法
- Perlの「Bareword "%s" not allowed while "strict subs" in use~」というエラーについて