我有一个perl文件解析器,我正在尝试重写。 这是一个动态解析器,我需要从逗号分隔的行中提取一个值。
我希望得到一个值的行看起来像这样:
ENTRYNAME-8,44544,99955,52,156,15:16:16,15:19:16
(这是每个解析文件中以ENTRYNAME-
开头的唯一一行。-
对每个正在解析的文件进行更改后的所有内容)
我希望第二个逗号后的值。 (上例中的99955
)
我试过以下没有运气:
if (/ ENTRYNAME-\((.*)\,(.*)\,(.*)\)/ )
{
$entry_nr = $3;
print "entry number = $entry_nr";
next;
}
答案 0 :(得分:1)
将其拆分为数组并直接寻址:
my @a = split /,/, $_;
print $a[2];
这里发生的事情是$ _(通常来自for (@allmylines) {
- 循环)中的任何内容都会在每次出现,
时被拆分,将它们全部放入一个数组中@a
)并删除,
。那么你可以解决数组中的字段,从第一个字段的0开始。因此,如果您想要解决第三个字段,请使用$a[2]
检索第三个字段。
答案 1 :(得分:1)
问题是你的第一个捕获字符串.*
是贪婪的,所以它将消耗你所有的字符串。然后它将回溯以找到两个逗号,并从结尾开始匹配。
此外:
\(
。既然你没有这样的话,那些永远不会匹配。 \,
/ ENTRY...
中没有随机空格,除非你的目标字符串中有一个空格一个简单的解决方法是使用更严格的捕获组(包括上面的几点):
if (/ENTRYNAME-\d+,\d+,(\d+)/ )
这将捕获到$1
。
正如mpapec在评论中指出的那样,您可能希望使用Text::CSV
来解析CSV数据。它会更安全。如果您的数据足够简单,那么这个解决方案就可以了。
答案 2 :(得分:1)
尽可能单独解析处理和验证数据。
在这种情况下,如果您使用逗号分隔值,请继续并将这些值分开。然后担心过滤您的数据。是否使用Text::CSV
进行解析是一个单独的问题,尽管可能是一个好主意。
use strict;
use warnings;
while (<DATA>) {
chomp;
my @cols = split ',';
if ($cols[0] =~ /^ENTRYNAME/) {
print $cols[2], "\n";
}
}
__DATA__
ENTRYNAME-8,44544,99955,52,156,15:16:16,15:19:16
输出:
99955