我有一个关于子程序的变量的问题,这些变量不能被另一个子程序访问。
第一个子例程:
sub esr_info {
my $esr ;
my @vpls = () ;
my @sap = ();
my @spoke = () ;
&conf_esr($esr , 1);
}第二部分:
sub conf_esr {
my $e = @_[0] ;
some code (@vpls, @sap, @spoke);
}第一个调用第二个,我需要第一个变量是本地变量,而不是整个代码的全局变量(为了线程目的)。第二个变量使用第一个变量的所有变量。我知道这些错误:
全局符号"$esr“需要显式的包名(您忘记声明”我的$esr“了吗?)在w.pl 63号线。 全局符号"@vpls“需要显式的包名(您忘记声明"my @vpls”了吗?)在w.pl 74号线。
我的问题是:子例程可以访问另一个程序的vars而不声明这些vars是全局的吗?
非常感谢你阅读了这篇文章。
发布于 2019-09-09 09:26:30
通过引入范围{ ... },可以将变量包含(限制变量的可见性)到两个子类,例如:
{
my $esr ;
my @vpls = () ;
my @sap = ();
my @spoke = () ;
sub esr_info {
conf_esr($esr , 1);
}
sub conf_esr {
my $e = @_[0] ;
#some code (@vpls, @sap, @spoke);
}
}但是请注意,这些变量在子类退出后保留值(它们变成状态变量)。这也被称为结束。
但其他方法可能更合适(闭包可能会使代码更难阅读,从而也更难维护),这取决于您的情况。例如,替代办法可以是:
conf_esr,或者更好$self散列中。发布于 2019-09-09 16:22:34
我的问题是:子例程可以访问另一个程序的vars而不声明这些vars是全局的吗?
不是的。您应该尝试传递变量,这是更好的形式,但您也可以使用全局变量。
my $i=1;
mysub(); # This will not change the global $i
print "i=$i\n"; # This should print '1'
exit;
##########
sub mysub
{my $i=2; # This is a variable local to mysub() only.
return;
}输入上面的代码并使用Perl运行它。注意,子程序mysub()中的mysub()与程序本身中的全局$i完全不同,因为mysub()中的$i是一个不同的内存地址。
现在,让我们将$i改为全局的。mysub()将更改全局$i,因为它没有声明一个本地$i。
my $i=1;
mysub(); # This will not change the global $i
print "i=$i\n"; # This should print '2'
exit;
##########
sub mysub
{$i=2; # This is changing the value in the global $i memory area.
return;
}https://stackoverflow.com/questions/57851053
复制相似问题