处理多个记录中的多个捕获组

时间:2010-07-01 17:02:42

标签: perl

数据格式:

attribname: data

数据示例:

cheese: good
pizza: good
bagel: good
fire: bad

代码:

my $subFilter='(.+?): (.+)';
my @attrib = ($dataSet=~/$subFilter/g);
for (@attrib)
{
   print "$_\n";
}

代码吐出:

cheese
good
pizza
good
[etc...]

我想知道一个简单的Perly方法是做什么的?我正在从日志中解析数据,为简单起见,上面的数据是垃圾。我是Perl的新手,我怀疑我可以通过fanangling索引来做到这一点,但我想知道是否有一个简短的方法来实现它?有没有办法让捕获组放入两个不同的变量而不是串行追加到列表中以及所有匹配?

编辑:我想要将属性和它的关联值放在一起,这样我就能做我需要做的事情。例如,如果在我的for循环中,我可以访问属性名称和属性值。

修改

我试过

my %attribs;
while (my $line = <$data>)
{
     my ($attrib, $value) = ($line=~m/$subFilter/);
     print $attribs{$attrib}," : ", $value,"\n";
}

并且没有运气:(我没有得到任何输出。我的数据是一个变量而不是一个文件,因为它是从文件中的一组父数据中解析出来的。如果是我的变量工作,以便my (@attrib, @value) = ($line=~/$subFilter/g);使用多个匹配适当地填充列表。

解决方案:

my @line = ($7 =~/(.+?)\n/g);
for (@line)
{
  my ($attrib, $value) = ($_=~m/$subFilter/);
  if ($attrib ne "")
  {
     print $attrib," : ", $value,"\n";
  }
}

2 个答案:

答案 0 :(得分:2)

我对你真正想要存储的内容并不是很清楚,但是这里你可以将数据存储在哈希表中,其中'1'表示正常,'0'表示'不良':

use strict;
use warnings;

use Data::Dumper;

my %foods;
while (my $line = <DATA>)
{
    chomp $line;
    my ($food, $good) = ($line =~ m/^(.+?): (.+)$/);
    $foods{$food} = ($good eq 'good' ? 1 : 0);
}

print Dumper(\%foods);

__DATA__
cheese: good
pizza: good
bagel: good
fire: bad

打印:

$VAR1 = { 
          'bagel' => 1,
          'cheese' => 1,
          'fire' => 0,
          'pizza' => 1
        };

答案 1 :(得分:0)

一种明智的方法是使用split函数:

my %attrib;

open my $data, '<', 'fileName' or die "Unable to open file: $!";

while ( my $line = <$data> ) {

    my ( $attrib, $value ) = split /:\s*/, $line, 2;
    $attrib{$attrib} = $value;
}

close $data;

foreach my $attrib ( keys %attrib ) {

    print "$attrib: $attrib{$attrib}\n";
}

如果您使用单行,以下内容将实现相同的目标:

$ perl -F/:\s*/ -ane '$attrib{$F[0]} = $F[1]; } END { print $_,"\t",$attrib{$_},"\n" foreach keys %attrib;" fileName