【问题标题】:How to use regexp using controlled looping in perl如何在 perl 中使用受控循环来使用正则表达式
【发布时间】:2012-12-09 23:36:17
【问题描述】:

我正在尝试使用 perl 中的正则表达式将从“1. Virtualization”开始的值 grep 到“2.Virtualization”。 1.Virutalization 和 2.Virtualization 之间有很多数据在一个数组中。

我的数组内容示例如下所示。
"1. 虚拟化容量管理 因性能不佳而导致的事件数量 0 999 10 5 4 容量计划的生产成本 10K 100K 80K 30K 10K 计划外购买容量的数量 0 999 15 10 5 2.虚拟化财务管理 事件数量由于性能不佳 0 999 10 5 4 产能计划的生产成本 10K 100K 80K 30K 10K"

如何编写一个受控循环来 grep 1 和 2 之间的值。在 1 和 2 之间,它甚至应该 grep 数据“容量计划 10K 100K 80K 30K 10K 的生产成本”并放在一个阵列位置。

我尝试编写一些代码,但无法理解如何编写受控循环。谁能帮我解决这个问题。

foreach (@array) { 
    if ($_ =~ /\d+\.\s+Virtualization.*/) { #greps values starting in 1. Virtualizaton
         push (@node_level1, "$_");         #stores in the node_level1
    } elsif ($_ =~ /(\%\s+.*)/) {  #greps values beginning with % Number of Nodes 
       # print "$_\n";
    }
}

提前致谢。

【问题讨论】:

  • 输入数据不清楚,'%Number of nodes'在哪里?
  • 该数据是一长行,还是单独的行。你的问题没有说清楚。我认为这是一个格式化的东西(不是在文字行之前缩进四个空格)但看起来你已经把它放在你的例子中的一行中。

标签: regex perl


【解决方案1】:

perl 中有一个自动魔术运算符可以做与 perreal 的答案相同的事情,flip-flop operator

foreach (@array) { 
    if (/1.\s+Virtualization/../2.\s+Virtualization/) {
       push (@node_level1, $_);
    }
}

【讨论】:

  • 如果它不包含匹配/[12].\s+Virt.../ 的元素,这将是一个最优雅的解决方案。当进入或退出条件匹配时触发器为真,因此两个边界元素都包含在输出中,这与 perreals 的答案不同。
【解决方案2】:

使用状态持有者:

my $state = 0;

foreach (@array) { 
    if ($_ =~ /1.\s+Virtualization/) {
         $state = 1;
    } elsif (($state == 1) and ($_ =~ /2.\s+Virtualization/)) {
       $state = 0;
    } elsif ($state == 1) {
       push (@node_level1, $_);         #stores in the node_level1
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    相关资源
    最近更新 更多