我有以下文件:
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。请你给我一些线索?
答案 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]