Глобальная переменная, подпрограмма переменная Вопрос в Perl - PullRequest
4 голосов
/ 04 июня 2010

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

sub foo(){

my $myvar = "Hello";
} 

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

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

Package Bar;
our $bar;

Спасибо.

Ответы [ 5 ]

13 голосов
/ 04 июня 2010

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

5 голосов
/ 04 июня 2010

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

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

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

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

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

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

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

4 голосов
/ 04 июня 2010

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

#!/usr/bin/perl

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

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

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

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

2 голосов
/ 08 июля 2011

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

#!/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
2 голосов
/ 04 июня 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...