即使条件 fails.Can 标签内的语句也会执行 有人解释我在这里做错了什么吗?

The statements inside the label executes even if the condition fails.Can anyone explain what I'm doing here wrong?

my $a =10;
my $b =200;
my $c,$d;
goto UP if ($a > 20);
$d = $c + $b;
print "$d\n";
UP:
$c = $b -$a;
print "$c\n";

即使条件失败,标签内的上述语句也会执行。

您似乎混淆了标签和 goto 的工作方式。事实上,goto 永远不应该用于流量控制。真是一头雾水。

你的代码目前是这样运行的:

如您所见,最后两个语句(在您的 UP 标签之后)总是被执行。 Perl 将检查条件,如果为真,则跳过。如果条件为假,它会立即运行后面的两个语句,然后运行标签和其余语句。

标签不会在 Perl 中生成子例程。他们只是给一条线路起个名字。该行代码依然正常执行。

如果您想做其中之一,则需要一个 if-else 结构。在 Perl 中就是这样完成的。


my $a = 10;
my $b = 200;
my ( $c, $d );
if ($a > 20) {
    $c = $b -$a;
    print "$c\n";
} else {
    $d = $c + $b;
    print "$d\n";
}

因为你似乎坚持goto,你可以让它工作,但你需要告诉它停止执行。

my $a =10;
my $b =200;
my $c,$d;
goto UP if ($a > 20);
$d = $c + $b;
print "$d\n";
exit;  # <------------- this stops execution and ends the program
UP:
$c = $b -$a;
print "$c\n";

当然你的代码不会做太多,因为 $c$d 都是 undef.

你真的应该打开 use strictuse warnings,并解决这两个 pragmata 会告诉你的问题。

另请注意,$a$b 是要在 sort 中使用的保留变量。

您发布的代码等同于以下内容:[1]

A: my $a = 10;
B: my $b = 200;
C: my ($c, $d);
D: goto G if $a > 20;
E: $d = $a + $b;
F: print "$d\n";
G: $c = $b - $a;
H: print "$c\n";

正如这更好地证明的那样,代码执行不会在遇到标签后停止。

要模拟 if-then-else 结构,您需要使用

my $a = 10;
my $b = 200;
$a > 20 and goto ELSE;

my $d = $a + $b;
print "$d\n";
goto END;

ELSE:
my $c = $b - $a;
print "$c\n";

END:

你可能知道这一点,但下面的内容更清楚并且提供了更好的范围:

my $a = 10;
my $b = 200;
if ($a <= 20) {
   my $d = $a + $b;
   print "$d\n";
} else {
   my $c = $b - $a;
   print "$c\n";
}

  1. 经过几次偏离主题的修复