do ブロックを使って一時的な変数のスコープを狭める修行
最近、一時的に必要な変数のスコープを狭めるために do ブロックを使うことが多い。たとえば、次のようなスクリプトを考える。
my ($x, $y) = (3, 5); my $diff = $x - $y; my $first = $diff ** 2; my $second = abs($x ** 2 - $y ** 2); print "first = $first, second = $second\n";
$x と $y が与えられて、そこから $first, $second を作るのだが、そのとき一時的な変数 $diff を利用する。
このままでも動くんだが、$first と $second を算出するためだけに必要な $diff のスコープが無駄に広すぎるように思う。そこで、$first と $second を算出するブロックを作るとこうなる。
my ($first, $second); { my $diff = $x - $y; $first = $diff ** 2; $second = abs($x ** 2 - $y ** 2); }
こうすると $diff のスコープが狭められていい感じ。
だけど、$first や $second の宣言と代入が分離されているのがちょっと嫌だ。ということで、do ブロックを使って
my ($first, $second) = do { my $diff = $x - $y; ($diff ** 2, abs($x ** 2 - $y ** 2)); };
と書いたりする。すっきりした気がする。
do ブロックを使わないで関数呼び出しにすれば、という話もあるかもしれない。
my ($first, $second) = sub { my $diff = $x - $y; ($diff ** 2, abs($x ** 2 - $y ** 2)); }->();
ここまで来ちゃうと読みにくいように思う。
ということで、最近はわりと do ブロックを使っているのである。どうなんだろう。