如何从子引用创建一个词法作用域的子程序

编程语言 2026-07-10

可以按如下方式定义一个词法作用域的子程序:

use feature qw( lexical_subs );

{
   my sub foo {
      ...
   }

   # This code can call `foo`.
}

# This code can't.

有没有办法从引用构建一个词法作用域的子程序?


我以为(目前处于实验阶段的)refaliasing功能可能就是那条路。

use feature qw( lexical_subs refaliasing declared_refs );

my \&foo = sub { ... };

这行不通,我尝试的任何变体也都不行。

解决方案

你可以使用

use feature qw( lexical_subs refaliasing );

my sub foo;
\&foo = sub { ... };

测试:

use strict;
use warnings;
use feature qw( say lexical_subs );
use experimental qw( refaliasing );

sub foo { say "outer"; }

for my $x ( 1 .. 2 ) {
   my sub foo;
   \&foo = sub { say "inner ($x)" };

   foo();
}

foo();

输出:

inner (1)
inner (2)
outer

显然,直接使用 my sub foo { say "inner ($x)" } 就能达到同样的效果,但 sub { ... } 可以被一个更复杂、返回coderef的表达式所替代。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章