Perl 当调用两次时给出两个不同输出的子例程

Perl 当调用两次时给出两个不同输出的子例程,perl,Perl,我已经执行了下面一段简单的嵌套子例程,它的输出让我抓狂 #/usr/bin/perl 严格使用; 使用警告; 亚外层{ 我的$a=“123”; 次内部{ 打印“$a\n”; } 内(); $a=“456”; } 外部(); 外部(); 此的输出是 变量“$a”不会在E:\Perl\source\public\sss.pl第9行保持共享。 123 456 但这怎么可能呢 当$a值为123时,我调用internal子例程,但是当第二次调用outer时,为什么我会得到456。perldoc dia

我已经执行了下面一段简单的嵌套子例程,它的输出让我抓狂

#/usr/bin/perl
严格使用;
使用警告;
亚外层{
我的$a=“123”;
次内部{
打印“$a\n”;
}
内();
$a=“456”;
}
外部();
外部();
此的输出是

变量“$a”不会在E:\Perl\source\public\sss.pl第9行保持共享。
123
456
但这怎么可能呢


$a
值为
123
时,我调用
internal
子例程,但是当第二次调用outer时,为什么我会得到
456

perldoc diagnostics
对警告
变量“$a”不会保持共享给出了非常简单的描述

use strict;
use warnings;
use diagnostics;

sub outer {
   my $a = "123";
   sub inner {
      print "$a\n";
   }
   inner();
   $a = "456";
}

outer();
outer();
输出

变量“$a”将不会在-e第9行(#1)中共享


在另一个子程序中声明一个子例程是没有意义的。它的工作方式就好像它是在顶级声明的一样,不能作为一个闭包正常工作

如果启用词法子程序(并禁用相应的“实验”警告),并将
internal
声明为
my sub-internal
,则代码将按预期工作

#!/usr/bin/perl 

use strict;
use warnings 'all';
use feature 'lexical_subs';
no warnings 'experimental::lexical_subs';

sub outer {

   my $a = "123";

   my sub inner {
      print "$a\n";
   }

   inner();

   $a = "456";
}

outer();
outer();
输出
当我从my将$a声明更改为我们的时,我得到的输出为123。注意:不要调用变量
$a
$b
。Perl在中使用了这些名称。我还建议在sub中声明sub很少是一个好主意。这听起来很神秘,但请记住,“my”的含义分为两部分:词法范围含义在编译时解决;初始化分配发生在运行时。考虑这两个部分,以及每次执行语句时会发生什么。呃,因为第一个调用将
$a
设置为456?这里的谜题是什么?
123
456
#!/usr/bin/perl 

use strict;
use warnings 'all';
use feature 'lexical_subs';
no warnings 'experimental::lexical_subs';

sub outer {

   my $a = "123";

   my sub inner {
      print "$a\n";
   }

   inner();

   $a = "456";
}

outer();
outer();
123
123