我有一个文件,其中包含许多人的数据和他们的分数。我试图采取每个人的平均分数。
Person 1
Scores (\
"0.06, 0.01, 0.07, 0.07, 0.75", \
"0.05, 0.08, 0.01, 0.09, 0.08", \
"0.10, 0.10, 0.11, 0.12, 0.10", \
"0.18, 0.19, 0.20, 0.20, 0.19", \
"0.31, 0.32, 0.32, 0.33, 0.32");
}
Person 2
Scores (\
"0.06, 0.01, 0.07, 0.07, 0.75", \
"0.05, 0.08, 0.01, 0.09, 0.08", \
"0.10, 0.10, 0.11, 0.12, 0.10", \
"0.18, 0.19, 0.20, 0.20, 0.19", \
"0.31, 0.32, 0.32, 0.33, 0.32");
}
预期输出
Person 1 - (avg value)
Person 2 - (avg value)
我尝试了什么:
open($in, “<file.txt>”)
or die;
while(<$in>) {
if (/Person/) {
if (/Scores/../}/) {
$_ =~ s/,//g;
$_ =~ s/\\//g; # removing all unwanted characters to take avg of numbers
$_ =~ s/"//g;
$_ =~ s/values//g;
$_ =~ s/\(//g;
$_ =~ s/\)//g;
$_ =~ s/;//g;
$_ =~ s/}/ /g;
@a1 = split(" ",$_);
}
}
}
在这一点之后,我无法将值存储在数组中以供进一步计算。
3条答案
按热度按时间mwg9r5ms1#
根据提供的数据结构,我们可以使用
}
作为记录分隔符,这简化了任务。然后只需要从每个块中提取信息片段并进行简单的计算。
产出
9ceoxa922#
代码的基本问题是,您每次遍历输入数据的一行,但您的代码假设解析代码所需的所有部分都存在于这一行中。
例如,这两个语句首先检查当前行上的文本
Person
,然后检查同一行上的文本字符串Scores
*。解决这个问题的方法有很多,这里是其中之一。
输出为
wgxvkvu93#
将整个文件读入字符串(
-0777
开关),然后在$_
中可用。在该字符串中,匹配
Person
并捕获以下标签,然后使用前瞻捕获Scores
之后直到下一个Person
(或字符串末尾)的所有标签;这些person-id + string-with-scores对被分配给散列中的键-值对。然后,对于散列中的每个条目,从带有分数的字符串中提取数字(分数)并将其分配给一个数组,然后使用该数组来获得平均值。
或者作为一个程序放到一个文件里,确实比较好
这是作为
program.pl filename
运行的