2010-06-04 1 views
4

Как передать значение переменной подпрограммы в другую переменную подпрограммы, Могу ли я использовать глобальную переменную.Глобальная переменная, переменная подпрограммы Вопрос в Perl

sub foo(){ 

my $myvar = "Hello"; 
} 

sub foo1(){ 
my $myvar1 = $myvar; # how can I get the "Hello" from $myvar. 
} 

Я попытался использовать пакет и глобальную переменную, но не смог.

Package Bar; 
our $bar; 

спасибо.

+2

Это пахнет/проблемой X Y. Если вы спросите о своей фактической проблеме (X), а не о том, как вы думаете, что можете ее решить (Y), вы получите лучшие ответы. –

+2

пакет написан 'пакет' не' пакет'. Как и сейчас, perl рассматривает его как 'Bar-> Package();' (вызов метода 'Package' пакета' Bar') –

ответ

13

Вы можете объявить переменную в области, которая включает в себя 2 функции:

{ my $myvar 

    sub foo{ 
    $myvar = "Hello"; 
    } 

    sub foo1{ 
    my $myvar1 = $myvar; 
    } 
} 

Это не очень элегантный, хотя и может быть трудно поддерживать, так как не ясно, в foo1, где значение $myvar был установлен. Вероятно, лучше передать переменную в качестве аргумента.

sub foo { 
    my $myvar = "Hello"; 
    return $myvar; 
} 

sub foo1 { 
    my($myvar)= @_; 
    my $myvar1 = $myvar; 
} 

# calling code 
my $myvar= foo(); 
foo1($myvar); 

Обратите внимание, что все 3 $myvar являются различными переменными, в разных областях.

В качестве примечания, используя прототипы (sub foo()), вероятно, не является хорошей идеей, если вы действительно не знаете, что они делают, что, вероятно, не будет так (см The problem with prototypes для обсуждения прототипов)

2

У вас есть несколько подходов.

Проще всего не объявлять переменную my. Но это требует от вас избегать use strict; и не рекомендуется в качестве результата.

Вы можете объявить свою переменную за пределами функции в верхней части вашего скрипта. Эта переменная будет доступна для всех функций ниже. Это следствие scope: переменные, объявляемые за пределами набора фигурных скобок, обычно доступны внутри любых последующих фигурных скобок.

Вы можете объявить свою переменную, используя прагму use vars qw/$myvar/;. Это по своей сути делает вашу переменную доступной во всем следующем коде.

4

Только не используйте my:

#!/usr/bin/perl 

sub foo() { 
    $myvar = "Hello\n"; 
} 

sub foo1() { 
    $myvar1 = $myvar; 
    print $myvar1; 
} 

print "here we go!\n"; 
foo(); 
foo1(); 

Однако я не рекомендую этот способ программирования.

+2

Я немного недоволен применяемым к этому вопросу downvoting. Комментарий достаточно, чтобы указать, что эта практика может иметь последствия. Однако одно из ключевых высказываний о Perl - «есть несколько способов сделать это» (TIMTOWTDI). Чтобы развращать друг друга и говорить, что есть только один истинный способ сделать это, это наносит ущерб сообществу Perl. Автор этого ответа сделал это добросовестно и, возможно, вместо того, чтобы опробовать этот пост, люди могли бы вместо этого сохранить хорошие должности. Downvoting лучше всего подходит для ответов вне темы или преднамеренно воспалительных, о которых этот пост не был ни тем, ни другим. –

+0

Не могли бы вы объяснить мне, почему вы отклоняете мой ответ выше? Это из-за моего комментария на «этот способ программирования»? – MarcoS

+2

Основная проблема, которую я вижу с этим (о которой никто не упомянул, просто чувствуя, что ниспровержение ответа или добавление критического извлечения без каких-либо оправданий будет достаточным) заключается в том, что он использует неявные глобальные переменные. Это неодобрительно (любое глобальное имя может быть использовано независимо от того, объявлено ли оно => нет времени обнаружения компиляции переменных орфографических ошибок, без определения переменных => более тонких ошибок) и является одной из причин, почему использование строгих/предупреждений является таким хорошая идея. – ijw

5

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

Да, вы можете:

my $myvar; 
sub foo(){ 
    $myvar = "Hello"; 
} 

sub foo1(){ 
    my $myvar1 = $myvar; # how can I get the "Hello" from $myvar. 
} 

Это работает даже с "использовать строгий"; и «использовать предупреждения».

Я попытался использовать пакет и глобальную переменную, но не смог.

Переменные пакета для переменных, которые вы хотите экспортировать вне своего пакета, а не для переменных, которые вы хотите разделить между двумя подпрограммами в одном пакете.

0

Следующий код может продемонстрировать решение, что вы описали:

#!/usr/bin/perl 
use strict; 
my $var = "hello"; 
sub foo { 
    local *var; 
    print "$var world\n"; 
    $var = "hi"; 
} 

sub bar { 
    local *var; 
    print "$var world\n"; 
    $var = "hey"; 
} 

foo(); 
bar(); 
print "$var world\n"; 

Результат должен быть:

hello world 
hi world 
hey world