0

我有以下文件:

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。请你给我一些线索吗?

4

1 回答 1

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]

您还需要$在 the 之前使用i,如下所示:

$val=$fields[$i];
$int=$fields[$i+1]
于 2013-03-19T12:27:59.617 回答