我正在尝试找到解析看起来像这样的行的最佳方法:
Explicit|00|11|Hello World|12 3 134||and|blah|blah|blah
我只想提取第6和第7纵杆之间的东西 我试过像
这样的东西if ($line =~ /^(.*\|){6}(\w*)\|/ ) {
print $2;
}
问题在于,由于.*
,第一部分似乎与最长的序列匹配,也许我应该使用不同的东西。在垂直条之间,有字母数字字符,空格和标点符号。
我应该匹配它们之间的最短距离吗?
答案 0 :(得分:8)
您可以改为使用.*?
来修改*
,使其更喜欢更少次数。
如果您想要的字段包含非单词字符,则仍可能在错误的位置匹配;为了防止这种情况你可以明确地说出任何东西 - 但是 - (([^|]*\|){6}
)或禁用该部分的回溯(((?>.*?\|)){6}
)。
或者你可以使用split:
if ( my $seventh = ( split /\|/, $line, 8 )[6] ) {
print $seventh;
}
(8是可选的,并且告诉分裂在到达第7个之后不再打扰尝试|)
答案 1 :(得分:3)
使用拆分。像my @fields = split /\|/, $str
这样的东西应该有效。然后,您只需索引您感兴趣的字段(也将保留空字段)。 |必须转义,因为它是regexp运算符。