首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Perl中获得全局变量值?

如何在Perl中获得全局变量值?
EN

Stack Overflow用户
提问于 2016-11-07 10:32:14
回答 2查看 1.4K关注 0票数 3

试图理解范围解析操作符。

代码语言:javascript
复制
$a = 5;
foo();
print "Out a = $a\n";

sub foo() {
  local $a = 10;
  bar();
}

sub bar() {
  print "Inside a = $a\n";
  print "Global a = $::a\n";
}

该程序的输出是:

代码语言:javascript
复制
Inside a = 10
Global a = 10
Out a = 5
  1. 我原以为'$::a‘的值是'5’,而不是‘10’,我想这就是范围分辨率操作符所做的。获取范围内的值。在这种情况下,没有给出范围,所以全局值。如果有任何调整,请纠正我。
  2. 我应该写些什么来获得'a‘的全局值?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-07 11:18:57

你误解了::。Perl实际上没有全局变量(除去某些特殊的标识符名称);它有包变量。也就是说,每个全局变量都属于一个包。如果您的代码没有package语句,则该包是main,因此$a$main::a相同。在::之前没有任何东西是main的缩写,所以$::a也是$main::a

如果您有一个package声明,那么它的作用域内使用的包变量将包含在该包中,除非使用::限定。

local为包变量或散列或数组元素提供一个临时值,并保存在保留最内部作用域时要还原的前一个值。无法从本地范围内访问保存的值。

全局/包变量的反面是词法变量。您几乎总是希望使用词法变量(使用my声明),而不是使用包变量。即使您确实使用了包变量,您也几乎不希望用local来更改它们的值。因此,一个很好的使用local的案例将是非常罕见的。

票数 8
EN

Stack Overflow用户

发布于 2016-11-07 10:43:28

首先--不要使用$a --单字变量名通常很讨厌,当它被sort使用时,它会加倍。

第二,local不做你认为它做的事情。它甚至在手册页上写到:

您可能真的想使用我的,因为本地不是大多数人认为的“本地”。有关详细信息,请通过perlsub中的my()查看私有变量。 本地将列出的变量修改为封闭块、文件或eval的本地变量。如果列出了多个值,则必须将列表放在括号中。有关详细信息,请参阅perlsub中通过local()的临时值,包括绑定数组和散列的问题。

所以你可能想使用my但是..。实际上,更有可能的是,你可能只是不想这样做,而且根本不使用全局。

代码语言:javascript
复制
#!/usr/bin/env perl

use strict;    
use warnings;

our $number = 5;
foo();
print "Out number = $number\n";

sub foo {
  my $number = 10;
  print "Inside foo: $number\n";
  print "Global foo $::number\n";
  bar();
}

sub bar {
  print "Inside bar = $number\n";
  print "Global $::number\n";
}

如您所见- $number在词汇上的作用域是“在foo中”,而不是持久化到b中。

代码语言:javascript
复制
Inside foo: 10
Global foo = 5
Inside a = 5
Global a = 5
Out number = 5

第三,不要在潜艇上使用原型。他们不做你想做的事。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40463019

复制
相关文章

相似问题

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