我希望这是直截了当的,我做错了.我在网上看到一些关于“变异自杀”看起来不错的东西,但它是旧版本而且我在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.所有这些都必须传递相同的参数.在这种情况下它仍然有意义,还是有更好的方法来构建它?