【发布时间】:2010-10-22 15:56:05
【问题描述】:
我知道 BEGIN 块是在 Perl 程序的主体之前编译和执行的。如果您不确定,请尝试运行 perl -cw 命令:
#!/ms/dist/perl5/bin/perl5.8
use strict;
use warnings;
BEGIN {
print "Hello from the BEGIN block\n";
}
END {
print "Hello from the END block\n";
}
有人告诉我,早期编译和执行 BEGIN 块可以让程序员确保在执行主程序之前任何需要的资源都可用。
所以我一直在使用 BEGIN 块来确保数据库连接之类的东西已经建立并且可供主程序使用。同样,我使用 END 块来确保在程序终止之前关闭、删除、终止所有资源等。
经过今天早上的讨论,我想知道这是否是看待 BEGIN 和 END 块的错误方式。
在 Perl 中 BEGIN 块的预期作用是什么?
更新 1: 刚刚发现 DBI 连接不起作用的原因。在得到这个小 Perl 程序后:
use strict;
use warnings;
my $x = 12;
BEGIN {
$x = 14;
}
print "$x\n";
执行时会打印 12。
更新 2:感谢 Eric Strom 在下方的评论,此新版本更加清晰:
use strict;
use warnings;
my $x = 12;
my $y;
BEGIN {
$x = 14;
print "x => $x\n";
$y = 16;
print "y => $y\n";
}
print "x => $x\n";
print "y => $y\n";
输出是
x => 14
y => 16
x => 12
y => 16
再次感谢埃里克!
【问题讨论】:
-
如果是这种情况,为什么我不能使用标准 DBI connect() 函数在 BEGIN 块中创建到 DB 的 DBI 连接?如果我删除 BEGIN 块,则建立连接
-
对于您的更新:这是因为
my $x = 12在编译时声明了变量但不执行赋值。然后开始块运行分配 14。然后当程序开始运行时,my行的分配运行给你 12。
标签: perl