即使条件 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 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";
}
- 经过几次偏离主题的修复
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";
}
- 经过几次偏离主题的修复