问题描述
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 strict
和use 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";
}
- 经过几次偏离主题的修复