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

时间:2016-11-07 10:32:14

标签: perl

试图了解范围解析运算符。

$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";
}

该计划的输出是:

Inside a = 10
Global a = 10
Out a = 5
  1. 我希望'$ :: a'的值为'5'而不是10.我认为这是范围解析运算符的作用。获取范围值。在这种情况下,没有给出范围,因此具有全球价值。如果有任何调整,请纠正我。

  2. 我应该写什么来获得条形子程序中'a'的全局值?

2 个答案:

答案 0 :(得分:8)

好吧,首先关闭 - 不要使用$a - 单字母变量名称通常是讨厌的,当sort使用它时会变为双倍。

其次local不符合你的想法。它甚至在手册页中说:

  

你真的可能想要使用我的,因为本地并不是大多数人认为的“本地”。有关详细信息,请参阅perlsub中的my()私有变量。

     

本地修改列出的变量是封闭块,文件或eval的本地变量。如果列出了多个值,则列表必须放在括号中。有关详细信息,请参阅perlsub中local()的临时值,包括绑定数组和散列的问题。

所以你可能想要使用my,但是......实际上,你可能只是希望这样做,并且不要t根本不使用全局变量。

#!/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中。

Inside foo: 10
Global foo = 5
Inside a = 5
Global a = 5
Out number = 5

第三 - 不要在潜艇上使用原型。他们没有做你认为他们做的事。

答案 1 :(得分:7)

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

如果您确实有package声明,则除非通过::限定,否则其范围内使用的包变量将包含在该包中。

local为包变量或散列或数组元素提供临时值,并保留在保留最内层范围时要恢复的先前值。 无法从本地范围内访问该已保存的值。

全局/包变量的反义词是词法变量。你几乎总是想要使用词法变量(用my声明),而不是包变量。即使您使用包变量,也几乎不想使用local更改其值。因此,使用local的一个好例子将是非常罕见的。