调用子例程外的子例程中定义的变量



我有一个子程序,它取$x的值,并给出$a的值。但是,我不能在子例程之外访问$a的值,因为它告诉我$a是未定义的。我昨天才知道子程序,所以我想我对它们有些遗漏。

sub rout {
if(@_ == 1) {
my $a = 3;
} else {
my $a = 5;
}
}
my $x = 1;
rout($x);
print $a;

首先,不要使用$a$b。它们有点特别,因为它们被sort使用。


其次,@_ == 1检查调用方提供的参数数量。这可能不是你想要检查的。您可能想要检查第一个参数的值:$_[0] == 1


问题是您正在创建一个新的词法范围变量,为其赋值,然后立即离开该范围。您的变量一创建就被销毁!在需要的最外层范围中声明单个变量。

my $y;
sub rout {
my ($x) = @_;
if ($x == 1) {
$y = 3;
} else {
$y = 5;
}
}
my $x = 1;
rout($x);
print "$yn";

也就是说,返回一个值在这里更有意义。

sub rout {
my ($x) = @_;
if ($x == 1) {
return 3;
} else {
return 5;
}
}
my $x = 1;
my $y = rout($x);
print "$yn";

最新更新