Я надеюсь, что это что-то прямое, что я делаю неправильно. Я видел в сети кое-что о "переменном самоубийстве", которое выглядело неплохо, но это было для более старой версии, а я использую 5.10.1.
В любом случае - объявленная мною переменная $ RootDirectory - внезапно теряет свое значение, и я не могу понять почему.
Вот сценарий для воспроизведения проблемы. Когда я запускаю сценарий в режиме отладки (perl -d), я могу заставить его распечатать $ RootDirectory в строках 21 и 26. Но он пропал в строке 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 вызывает CreateTables, который вызывает SQLExecFolder. Всем им должен быть передан один и тот же параметр. Имеет ли это смысл в данном случае, или есть какие-нибудь лучшие способы структурировать это?
use strict; use warnings;
укажет на несколько проблем с вашим кодом. - person Ether   schedule 15.03.2010