全局变量,子程序变量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个功能范围:
{ 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();
不过,我不推荐这种编程方式。
我对这个问题的downvoting有点不满意。评论足以指出这种做法可能会产生后果。然而关于Perl的一个关键语句是“有多种方法可以做到这一点”(TIMTOWTDI)。相互残杀并说只有一个真正的方法可以破坏Perl社区。这个回复的作者是真诚的,也许并没有压低这个职位,但是人们可以把好的职位改为投票。 Downvoting最适合偏离主题的答案或故意煽动性,而这篇文章既不是。 – 2010-06-04 23:11:49
你能解释我为什么你在上面压低我的答案吗?是否因为我对“这种编程方式”的评论? – MarcoS 2010-06-28 09:29:41
我在这里看到的主要问题是(没有人选择提及,只是觉得下调答案或添加没有正当理由的神秘派对就足够了)是它使用隐式全局变量。这是皱眉(任何全局名称都可以使用,无论它是否声明=>没有编译时检测变量拼写错误,没有变量的范围=>微妙的错误),这是为什么使用严格/警告是这样的原因之一一个好主意。 – 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
这闻起来像一个X/Y的问题。如果你询问你的实际问题(X)而不是你认为你能解决的问题(Y),你会得到更好的答案。 – 2010-06-04 13:37:38
包裹拼写'包裹'而不是'包裹'。现在,perl把它看作是'Bar-> Package();'(调用'Bar'包的方法'Package') – 2010-06-04 14:24:23