首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Per:子程序的变量的可见性

Per:子程序的变量的可见性
EN

Stack Overflow用户
提问于 2019-09-09 09:16:34
回答 2查看 93关注 0票数 0

我有一个关于子程序的变量的问题,这些变量不能被另一个子程序访问。

第一个子例程:

代码语言:javascript
复制
sub esr_info {
    my $esr ;
    my @vpls = () ;
    my @sap = ();
    my @spoke = () ;
    &conf_esr($esr , 1);
}

第二部分:

代码语言:javascript
复制
sub conf_esr {
     my $e = @_[0] ;
     some code (@vpls, @sap, @spoke);
}

第一个调用第二个,我需要第一个变量是本地变量,而不是整个代码的全局变量(为了线程目的)。第二个变量使用第一个变量的所有变量。我知道这些错误:

全局符号"$esr“需要显式的包名(您忘记声明”我的$esr“了吗?)在w.pl 63号线。 全局符号"@vpls“需要显式的包名(您忘记声明"my @vpls”了吗?)在w.pl 74号线。

我的问题是:子例程可以访问另一个程序的vars而不声明这些vars是全局的吗?

非常感谢你阅读了这篇文章。

EN

回答 2

Stack Overflow用户

发布于 2019-09-09 09:26:30

通过引入范围{ ... },可以将变量包含(限制变量的可见性)到两个子类,例如:

代码语言:javascript
复制
{ 
    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散列中。
票数 1
EN

Stack Overflow用户

发布于 2019-09-09 16:22:34

我的问题是:子例程可以访问另一个程序的vars而不声明这些vars是全局的吗?

不是的。您应该尝试传递变量,这是更好的形式,但您也可以使用全局变量。

代码语言:javascript
复制
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。

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57851053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档