假设,我的全局变量和局部变量具有相同的名称,如何在子例程中访问全局变量值?
#! /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");
答案 0 :(得分:5)
如果 global 变量实际上是包变量,则可以通过包命名空间访问它。默认包为main
。
print "Local name : $main::name\n";
由于您保留在同一名称空间中,因此可以省略main
,因此$::name
也可以。如果您的外部变量也使用my
定义,则两种解决方案都不起作用。
您可以使用our
或use names qw($name)
定义包变量。
那就是说,你永远不应该这样做。始终使用词法变量,并将它们放在尽可能小的范围内。 use strict
和use 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" );