在子程序外调用子程序中定义的变量
Calling variable defined in a subroutine outside a subroutine
我有一个子例程,它接受 $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 "$y\n";
也就是说,返回一个值在这里更有意义。
sub rout {
my ($x) = @_;
if ($x == 1) {
return 3;
} else {
return 5;
}
}
my $x = 1;
my $y = rout($x);
print "$y\n";
我有一个子例程,它接受 $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 "$y\n";
也就是说,返回一个值在这里更有意义。
sub rout {
my ($x) = @_;
if ($x == 1) {
return 3;
} else {
return 5;
}
}
my $x = 1;
my $y = rout($x);
print "$y\n";