全局变量,子程序变量Perl中的问题

时间:2010-06-04 07:48:12

标签: perl global-variables subroutine

如何将子程序变量值转换为另一个子程序变量,我可以使用全局变量。

sub foo(){

my $myvar = "Hello";
} 

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

我尝试使用包和全局变量,但失败了。

Package Bar;
our $bar;

谢谢。

5 个答案:

答案 0 :(得分: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表示关于原型的讨论)

答案 1 :(得分:5)

  

如何将子程序变量值转换为另一个子程序变量,我可以使用全局变量吗?

是的,你可以:

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

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

这甚至与“使用严格”有关;和“使用警告;”。

  

我尝试使用包和全局变量,但失败了。

包变量适用于要在包外导出的变量,而不适用于要在同一包中的两个子程序之间共享的变量。

答案 2 :(得分:4)

请勿使用my

#!/usr/bin/perl

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

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

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

但是,我不推荐这种编程方式。

答案 3 :(得分:2)

你有几种方法。

最简单的是不要用my声明变量。但这需要您避免使用use strict;而不建议结果。

您可以在脚本顶部的函数中声明您的变量 。然后,此变量可用于以下所有功能。这是scope的结果:在一组花括号外面声明的变量通常可以在任何后续花括号中使用。

您可以使用use vars qw/$myvar/; pragma声明您的变量。这固有地使您的变量在以下代码中可用。

答案 4 :(得分:1)

以下代码可能会演示您所描述的解决方案:

#!/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