如何在子例程中访问全局变量

时间:2016-05-19 06:28:57

标签: perl

假设,我的全局变量和局部变量具有相同的名称,如何在子例程中访问全局变量值?

#! /usr/bin/perl

$name = "Krishna";

sub printName{
 my $name = "Sankalp";

 print ("Local name : ", $name, "\n");
 # How to print global variable here
}

&printName;
print("Global name : ", $name, "\n");

2 个答案:

答案 0 :(得分:5)

如果 global 变量实际上是包变量,则可以通过包命名空间访问它。默认包为main

print "Local name : $main::name\n";

由于您保留在同一名称空间中,因此可以省略main,因此$::name也可以。如果您的外部变量也使用my定义,则两种解决方案都不起作用

您可以使用ouruse names qw($name)定义包变量。

那就是说,你永远不应该这样做。始终使用词法变量,并将它们放在尽可能小的范围内。 use strictuse warnings会对您有所帮助,如果您定义的变量与较小范围内的现有变量同名,则会a Perl::Critic rules that complains

答案 1 :(得分:3)

您需要使用our声明包变量而不是词法变量。在子程序中,您需要完全限定它才能解决它。如果您需要跨包共享变量,您应该使用我们的。

my在词法范围内声明变量。因此,一旦变量超出范围,变量就会消失。这些变量也是私有的,不能被其他包攻击。

#!/usr/bin/perl
use strict;
use warnings;

our $name = "Krishna";

sub printName {
    my $name = "Sankalp";
    print ( "Local \$name: ", $name,"\n" );
    print ( "Global \$name: ", $main::name, "\n" ); # or $::name inside the same package
}

printName;
print( "Global name : ", $name, "\n" );