#!/usr/bin/perl
use feature "switch";
use strict;
use warnings;
while (<DATA>) {
given ($_) {
when ("abc" or "def") {
# ...
next;
}
when (/\w{3}/) {
print $_;
next;
}
}
__DATA__
abc
def
ghi
lmn
opq
rst
uvz
我有这个输出:
abc
def
ghi
lmn
opq
rst
uvz
但我想要这个:
ghi
lmn
opq
rst
uvz
我不知道我要缺少什么,请帮忙。
首先,不要使用given
/ when
。它所基于的smartmatch功能是一个失败,应该避免。正确的写法是:
use strict;
use warnings;
use feature 'say';
while (<DATA>) {
chomp;
next if $_ eq 'abc' or $_ eq 'def';
say $_;
}
但是回到given
/ when
。when ("abc" or "def")
出于某种原因,该条件被解析为when ("abc")
(通过在下运行脚本进行验证perl -MO=Deparse
)。如果要与一组值进行智能匹配,请使用数组:when (["abc", "def"])
。
该条件仍将不匹配,因为$_
它是带有尾随换行符的字符串。您chomp
首先需要它。
当然,next
内部的when
块是完全没有必要的。与C的switch
/不同,case
不存在隐式下降。要明确地继续匹配,可以使用以下continue
命令。因此,您的代码可以重写为:
while (<DATA>) {
chomp;
given ($_) {
when (["abc", "def"]) {
# do nothing
}
when (/\w{3}/) {
print "$_\n";
}
}
}
但让我们假设它是写的
while (<DATA>) {
chomp;
given ($_) {
when (["abc", "def"]) {
# do nothing
}
when (/\w{3}/) {
print $_;
}
}
print "\n";
}
因此,我们将不得不跳过print "\n"
。在这种情况下,我们可以使用循环标签:
LINE:
while (<DATA>) {
chomp;
given ($_) {
when (["abc", "def"]) {
next LINE;
}
when (/\w{3}/) {
print $_;
}
}
print "\n";
}
任何环控制命令等next
,redo
,last
,continue
可以采取一个标签来指代一些外环。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句