BEGIN块和变量声明

sid*_*com 1 syntax perl

BEGIN块中设置变量是有效的perl ,但是在BEGIN块外面声明变量吗?

#!/usr/bin/env perl
use strict;
use warnings;
use 5.10.0;

my $var;

BEGIN{ $var = 10 }

say $var;
Run Code Online (Sandbox Code Playgroud)

cjm*_*cjm 7

是的,它是有效的.实际上,您必须以这种方式执行,或者$var在BEGIN块中是本地的,并且在程序的其余部分中不可用.引用perlsub:

A my具有编译时和运行时效果.在编译时,编译器会注意到它....实际的初始化会延迟到运行时间,因此它会在适当的时间执行,例如每次循环执行.

编译时效果是您可以访问BEGIN块中的变量的原因.请注意,在评估BEGIN块之后my将进行任何初始化(因此将覆盖BEGIN可能设置的任何值.)


AKH*_*and 6

是的,但您可能需要小心这种模式,因为非常相似的东西的工作方式可能与您预期的不同:

my $var = 5;
BEGIN { $var = 10 }

say $var; # 5
Run Code Online (Sandbox Code Playgroud)

  • 对于每个想知道的人:这是因为 `BEGIN` 块在 `$var = 5` 之前运行,因此,`$var = 5` 将值从 10 更改为 5,即使它们在代码中以相反的顺序出现。 (2认同)