読者です 読者をやめる 読者になる 読者になる

local $var += 1の挙動

Test::TypeConstraintsのレビューをしてもらっていたときにid:gfxさんに教えてもらったのですが、

local $Test::Builder::Level += 2;

としていたのですが、これは、「元々の$Test::Builder::Levelに2を足す」、という挙動にはならないです。

そもそも、これは、テストが失敗したときの呼出し元が変にならないようにするためのおなじないで、一つのメソッドしか経由していないので、+1するべきで、+1でうまく動いていないことに疑問を持つべきでした。

以下挙動を確認するためのプログラムです。

use strict;
use warnings;
use Test::More;

our $TEST = 10;

{
    local $TEST += 1;
    is($TEST, 1, "undef + 1 = 1");
}
is($TEST, 10, "restore ok");

{
    local $TEST = $TEST + 1;
    is($TEST, 11, "10 + 1 = 1");
}
is($TEST, 10, "restore ok");

done_testing();

わりとうっかり書いてしまいそうなので、要注意なり。