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 ブロックを使っているのである。どうなんだろう。