Perl使用正则表达式拆分以检索数组中的值

时间:2013-03-19 12:21:53

标签: regex arrays perl split

我有以下文件:

id001   word1(100);"word2"(100);"word3"(98);"word4"(98);"word5"(94);word6;
id002   word1(100);word7(100);word8(100);word9(100);word10;word11;

我想分割我文件的每一行来检索数组中的id(= id00x),val(= wordX)和int(= 100)。 我的代码:

my @fields = split /[\t();"]"?/, $line;
$id = $fields[0];
for ( my $i = 1; $i < @fields; $i +=2 )
{
  $val=$fields[$i];
  $int=$fields[$i+1]
}

我只检索不在双引号之间的id和val。请你给我一些线索?

1 个答案:

答案 0 :(得分:2)

这里的问题正则表达式。您可以通过在执行拆分后立即进行循环来验证这一点,如下所示:

  my @fields = split /[\t();"]"?/, $line;
  $id = $fields[0];
  foreach my $field(@fields) {
    print("field is $field\n");
  }

这将向您显示您有几个空字段,这就是您没有得到任何变量的原因。空字段的原因是正则表达式将允许列出的任何一个字符作为字边界,因此当您连续多个字符时,它们将导致多个连续的分割。

我不会尝试一次分割整行,而是通过将线分成更小的部分,然后使用正则表达式来提取部分。这是我的建议:

my @fields = split /[\t;]/, $line;
$id = $fields[0];
for ( my $i = 1; $i < $#fields; $i++ )
  {
    ($val, $int) = $fields[$i] =~ /\"?(\w+)\"?\((\d+)\)/;
    print("val is $val, int is $int\n");
  }

另请注意,获取数组中对象数的方法是$#arrayname,而不是@arrayname。后者也可以在标量环境中工作,但这是一个不好习惯。


下面是原始答案,只是关于语法

这里至少有一个错误:

$val=$fields[i];
$int=$fields[i+1]

您需要在$之前使用i,例如:

$val=$fields[$i];
$int=$fields[$i+1]