在子程序外调用子程序中定义的变量

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";