Perlでアサーションを実現する方法

Perlでアサーションを実現する方法

Posted at December 9,2014 12:33 AM
Tag:[Assertion, 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;

と記述します。

関連記事
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)