Perl - 从逗号分隔行获取值

时间:2014-06-20 12:50:25

标签: perl

我有一个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;
}

3 个答案:

答案 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