2016-05-19 2 views
1

Предположим, что моя глобальная переменная и локальные переменные имеют одинаковое имя, как я могу получить доступ к значению глобальной переменной в подпрограмме?Как получить доступ к глобальной переменной в подпрограмме

#! /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"); 
+1

Не забудьте использовать строгий; используйте предупреждения; ' – squiguy

ответ

5

Если глобальная переменная фактически является переменной пакета, вы можете получить доступ к нему через пространство имен пакета. По умолчанию используется 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, если вы определяете переменную с тем же именем, что и существующая в меньшей области.

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"); 
+0

Вы были на самом деле быстрее :) – simbabque

+0

Да, поистине я был :). Но вы были более точны. –

Смежные вопросы