この記事はPerl Advent Calendar 2022の21日目の分です。 Perlでは、関数内で定義した関数も外部から見えてしまいます。 use feature 'say'; sub foo { sub bar { say 'bar'; } bar(); } # foo関数の外でもbar関数を呼び出せる。 bar(); 特定のスコープでのみ参照できる関数を定義したいときは、関数定義をsubではなくmy sub(またはstate sub)から始めます。この機能はレキシカルサブルーチン(lexical subroutines)と呼ばれます。 use feature 'say'; sub foo { my sub bar { say 'bar'; } bar(); } # 未定義の関数呼び出しによる例外が発生する。 bar(); ちょっとした処理をまとめるのに便利なレキシカルサブルーチン