以下是我正在处理的数据:
__DATA__
Node 1:
98 debug : fill 100
102 debug : fill 104
Node 2:
88 debug : fill 120
152 debug : fill 164
我想写一个正则表达式/(或任何合适的东西)从节点1下面的数据中捕获信息,比如'98:100',但只有在识别出节点1并将其存储在数组中后才说@ value1(即@ value1中的值对应于节点1下面的数据。并且类似地从节点2下面的数据捕获和存储信息,比如152:164,在已经在不同的阵列中识别节点2之后说'@ value2'。我用来捕获信息的正则表达式是
“qr/\s+([0-9]{2,3})\s[a-z]+\s(:)\s[a-z]\s([0-9]{3})/
”。但是,如果我使用'if'语句
while (<>){
if ($_=~ /Node 1/){
#capture information using regex
}
}
在正则表达式之前,脚本不会返回任何值,可能是因为它在单词“Node”之后的同一行中搜索或正则表达式。
有关如何在使用正则表达式识别特定节点和捕获信息后跳转到下一行的任何建议。
答案 0 :(得分:5)
你的问题有点令人困惑。您似乎想要使用符号引用,但最好使用哈希。另请参阅“为什么将变量用作变量名称 部分1,2和3为何愚蠢。
#!/usr/bin/perl
use strict;
use warnings;
my %data;
my $current_node;
while ( <DATA> ) {
/^Node ([0-9]+):/ and $current_node = $1 and next;
if ( /^\s+ ([0-9]+) \s debug \s : \s fill \s ([0-9]+)/x ) {
push @{ $data{"value$current_node"} }, "$1 : $2";
}
}
use Data::Dumper;
print Dumper \%data;
__DATA__
Node 1:
98 debug : fill 100
102 debug : fill 104
Node 2:
88 debug : fill 120
152 debug : fill 164
答案 1 :(得分:3)
您也可以将一个节点一次解析为这样的哈希:
local $/ = "\nNode ";
while ( <DATA> ) {
chomp; s/^Node //; # remove 1st Node header
my ($current_node) = /^(\d+):/;
map {
if (/^\s+ ([0-9]+) \s debug \s : \s fill \s ([0-9]+)/xm ) { # borrowed from Sinan
push @{ $data{"value$current_node"} }, "$1 : $2";
}
} split /\n/;
}
在[Node]记录分隔符是常量字符串并且$current_node
可能隐藏在记录本身某处的情况下,它更有用。
答案 2 :(得分:1)
编辑:虽然准确,但这个答案错过了很大一部分问题。
使用next
转到循环的下一次迭代;使用last
离开循环。如果你有标记(嵌套)循环,你可以使用next LABEL;
跳转到命名循环的下一次迭代,等等。
比较C和类似语言中的continue
和break
。