我希望这是我做错了的直截了当的事情。我在网上看到了一些关于“变量自杀”的东西,看起来不错,但它是针对旧版本的,我在 5.10.1 上。
无论如何 - 我声明的一个变量 - $RootDirectory - 突然失去了它的价值,我不知道为什么。
这是重现问题的脚本。当我在调试模式下运行脚本(perl -d)时,我可以让它在第 21 行和第 26 行打印出 $RootDirectory。但它在第 30 行消失了。
use strict;
my $RootDirectory;
my @RootDirectories;
@RootDirectories = (
'c:\\P4\\EDW\\PRODEDW\\EDWDM\\main\\db\\'
,'c:\\P4\\EDW\\PRODEDW\\EDWADS\\main\\db\\'
,'c:\\P4\\EDW\\PRODEDW\\FJE\\main\\db\\'
);
foreach $RootDirectory (@RootDirectories) {
# $RootDirectory = 'c:\\P4\\EDW\\PRODEDW\\EDWDM\\main\\db\\';
# print ' In foreach ' . $RootDirectory. "\n";
RunSchema ();
}
exit(0);
sub RunSchema() {
# print ' In RunSchema ' . $RootDirectory. "\n";
CreateTables ();
}
sub CreateTables() {
# print ' In CreateTables ' . $RootDirectory. "\n";
SQLExecFolder ('tbl');
}
sub SQLExecFolder() {
print ' In SQLExecFolder ' . $RootDirectory. "\n"; # Variable $RootDirectory value is gone by now
}
编辑感谢所有评论!我想现在我会使用“我们的”关键字,它看起来效果很好——谢谢内森。还要感谢有关使用警告的工具 - 我想我已经卖掉了那个!
继续让我感到困惑的是,为什么当我执行调试模式 (perl -d) 并单步执行代码时,执行“p $RootDirectory”时,我在第 21 行和第 26 行得到了预期的输出,但在第 30 行却没有。如何第 30 行的情况是否有所不同?
另外,我很欣赏关于将 $RootDirectory 作为函数参数传递的最佳实践的评论。我想避免这种情况,因为在这之后我有很多函数——即 RunSchema 调用调用 SQLExecFolder 的 CreateTables。所有这些都必须传递相同的参数。在这种情况下它仍然有意义,还是有更好的方法来构建它?