【发布时间】:2015-04-02 04:21:32
【问题描述】:
我有这个代码:
#!/usr/bin/perl
use strict;
use warnings;
my $judge_exes = {
"^A" => "foo",
"^B" => "bar",
"^C" => "baz",
};
sub get_judge {
my ($test_id) = @_;
my $exe = undef;
while (my ($regex, $judge) = each %$judge_exes) {
if ($test_id =~ /$regex/) {
$exe = $judge;
last;
}
}
if ($exe) {
return $exe;
} else {
return "Undefined!";
}
}
print get_judge("A1");
print get_judge("B2");
print get_judge("C3");
(ideone:http://ideone.com/slxebG)
我希望得到foobarbaz 的输出,但我最终得到fooUndefined!baz。但是,当我注释掉 last 语句时,我得到了正确的行为:
#!/usr/bin/perl
use strict;
use warnings;
my $judge_exes = {
"^A" => "foo",
"^B" => "bar",
"^C" => "baz",
};
sub get_judge {
my ($test_id) = @_;
my $exe = undef;
while (my ($regex, $judge) = each %$judge_exes) {
if ($test_id =~ /$regex/) {
$exe = $judge;
# last;
}
}
if ($exe) {
return $exe;
} else {
return "Undefined!";
}
}
print get_judge("A1");
print get_judge("B2");
print get_judge("C3");
(ideone:http://ideone.com/QJpxbK)
为什么会这样? (我在 Perl 5.16.2 上,但问题也出现在 5.10.1 和任何 ideone 使用的版本上。)
- 据我了解,
last只是跳出了while循环,这正是我想要的。 -
$exe似乎不是导致我打错 if 分支的替代错误值。 (我可以早点回来,这样会更好,但我还是不明白这是什么原因。) - 我认为我正确地取消引用了哈希引用。
- 我认为正则表达式匹配不会对循环终止产生任何副作用。
- 正则表达式似乎匹配正确,因为在某些情况下我实际上可以让它们正确匹配,所以我认为这不是插值问题。
- 我没有修改我正在迭代的容器。
我只是犯了一些与 Perl 无关的愚蠢错误吗?
【问题讨论】: