如何从给定/构造时的内部跳转到下一个迭代?

菲利波·劳里亚(Filippo Lauria)
#!/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/ whenwhen ("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";
}

任何环控制命令等nextredolastcontinue可以采取一个标签来指代一些外环。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Swift 如何跳转到下一个 uitextfield

如何跳转到下一个 TODO 存根?

R for循环跳转到下一个迭代

如何跳转到GIT difftool中的下一个/上一个差异?

Swift-不为空时自动跳转到下一个文本字段

我如何跳转到智能感知的下一个输入

如何在MySQL中跳转到下一个ID

YouCompleteMe vim扩展:如何跳转到下一个错误?

如何跳转到项目树中的下一个搜索结果?

如何滚动GNU信息页面而不会意外跳转到下一个节点?

ExpressJS - 如何跳转到下一个定义了初始 url 的中间件

for ... of 语句:转到可迭代的下一个元素

仅在单击某些内容时转到下一个迭代

Vim - 在插入模式下跳转到下一个/上一个空行

vimdiff:跳转到行内的下一个差异吗?

Textarea和Tab键:获取\ t而不是跳转到下一个元素

ASP.Net自动跳转到下一个TextField

跳转到for循环Cuda中的下一个块

用于跳转到下一个文件夹的 Powershell 命令

Jquery 测验 - 如何转到下一个问题?

用户转到下一个元素时如何验证表格?

转到下一个片段时如何停止显示空白页

解压缩空文件时如何循环函数转到下一个对象?

当前正在播放的曲目结束时,如何自动转到下一个曲目?

TestNG:经过dataProvider的一次迭代后转到下一个测试

如何进行下一个迭代

如何迭代Ruby中的下一个元素?

如何检查for循环中的下一个迭代?

转到基于范围的for循环中的下一个迭代器