gpt4 book ai didi

perl - 为什么我的 Perl 子例程看不到调用它的 foreach 循环中变量的值?

转载 作者:行者123 更新时间:2023-12-04 16:21:46 25 4
gpt4 key购买 nike

我希望这是我做错的直截了当的事情。我在网上看到一些关于“可变自杀”的内容,看起来不错,但它是针对旧版本的,我使用的是 5.10.1。

无论如何 - 我声明的变量 - $RootDirectory - 突然失去了它的值(value),我不知道为什么。

这是一个重现问题的脚本。当我在 Debug模式 (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
}

编辑
感谢所有的评论!我想现在我将使用看起来效果很好的“我们的”关键字 - 谢谢内森。还要感谢关于使用警告的工具 - 我想我已经卖掉了那个!

继续让我困惑的是,为什么当我执行 Debug模式 (perl -d) 并逐步执行代码,执行“p $RootDirectory”时,我在第 21 行和第 26 行得到了预期的输出,但在第 30 行却没有。第 30 行的情况不同吗?

另外,我很欣赏关于将 $RootDirectory 作为函数参数传递的最佳实践的评论。我想避免这种情况,因为后面有很多函数 - 即 RunSchema 调用调用 SQLExecFolder 的 CreateTables。所有这些都必须传递相同的参数。在这种情况下它仍然有意义吗,或者有没有更好的方法来构造它?

最佳答案

内森说的是对的。除此之外,你为什么不传递值?无论如何,这是更好的做法:

foreach $RootDirectory (@RootDirectories) { 
# $RootDirectory = 'c:\\P4\\EDW\\PRODEDW\\EDWDM\\main\\db\\';
# print ' In foreach ' . $RootDirectory. "\n";
RunSchema ($RootDirectory);
}

sub SQLExecFolder {
my $RootDirectory = shift;
print ' In SQLExecFolder ' . $RootDirectory. "\n";
}

关于perl - 为什么我的 Perl 子例程看不到调用它的 foreach 循环中变量的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2450055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com