我试图找到解析这样一行的最佳方法:
Explicit|00|11|Hello World|12 3 134||and|blah|blah|blah
我只想提取第6和第7纵杆之间的东西
我试过类似的东西
if ($line =~ /^(.*\|){6}(\w*)\|/ ) {
print $2;
}
Run Code Online (Sandbox Code Playgroud)
问题是,第一部分似乎与最长的序列匹配,因为.*,或许我应该使用不同的东西.在垂直条之间,有字母数字字符,空格和标点符号.
我应该匹配它们之间的最短距离吗?
您可以.*?改为使用*更少次数来修改.
如果您想要的字段具有非单词字符,则仍可能在错误的位置匹配; 为了防止这种情况你可以明确地说出任何东西 - 但是 - (([^|]*\|){6})或禁用该部分的回溯(((?>.*?\|)){6}).
或者您可以使用拆分:
if ( my $seventh = ( split /\|/, $line, 8 )[6] ) {
print $seventh;
}
Run Code Online (Sandbox Code Playgroud)
(8是可选的,告诉分裂在到达第7个之后不再费心去尝试|)