これが私が間違っていることの簡単なことだといいのですが。「可変自殺」についてオンラインで見た目は良さそうですが、それは古いバージョンのもので、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
}
編集すべてのコメントをありがとう!今のところ、うまく機能しているように見える「our」キーワードを使用すると思います。Nathanに感謝します。また、使用警告についてのツールにも感謝します-私はそれで売られていると思います!
混乱し続けているのは、デバッグモード(perl -d)を実行し、コードをステップ実行して「p $ RootDirectory」を実行すると、21行目と26行目で期待どおりの出力が得られたが、30行目では得られなかった理由です。 30行目で状況は異なりますか?
また、関数パラメーターとして$RootDirectoryを渡すことであるベストプラクティスについてのコメントに感謝します。それに続く関数が非常に多いため、これを避けたかったのです。つまり、RunSchemaはSQLExecFolderを呼び出すCreateTablesを呼び出します。それらすべてに同じパラメータを渡す必要があります。この場合でもそれは理にかなっていますか、それともこれを構造化するためのより良い方法はありますか?