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

问题描述:

如何将子程序变量值传送到另一个子程序变量中,我可以使用全局变量。全局变量,子程序变量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),你会得到更好的答案。 – 2010-06-04 13:37:38

+2

包裹拼写'包裹'而不是'包裹'。现在,perl把它看作是'Bar-> Package();'(调用'Bar'包的方法'Package') – 2010-06-04 14:24:23

你可以声明变量,其中包括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关于原型的讨论)

你有几种方法。

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

您可以在脚本顶部声明变量以外的函数。这个变量可以在下面的所有函数中使用。这是scope的后果:在一组大括号之外声明的变量通常在随后的大括号内可用。

您可以使用use vars qw/$myvar/;编译指示声明变量。这固有地使你的变量在下面的代码中可用。

只要不使用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最适合偏离主题的答案或故意煽动性,而这篇文章既不是。 – 2010-06-04 23:11:49

+0

你能解释我为什么你在上面压低我的答案吗?是否因为我对“这种编程方式”的评论? – MarcoS 2010-06-28 09:29:41

+2

我在这里看到的主要问题是(没有人选择提及,只是觉得下调答案或添加没有正当理由的神秘派对就足够了)是它使用隐式全局变量。这是皱眉(任何全局名称都可以使用,无论它是否声明=>没有编译时检测变量拼写错误,没有变量的范围=>微妙的错误),这是为什么使用严格/警告是这样的原因之一一个好主意。 – ijw 2010-08-24 13:48:34

如何将子程序变量值传送到另一个子程序变量中,我可以使用全局变量吗?

是的,你可以:

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

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

这甚至与作品 “使用严格的;”和“使用警告”。

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

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

下面的代码可以显示解决你的描述:

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