Я не понимаю ваше последнее требование (там не указано никаких потоков), но я предоставлю вам настройку для этой информации и выполню требование, которое может понять Данные разбиты, так что вы можете добраться до них. И хотя я не понимаю, как бы вы использовали строку 'for x threads:', она по крайней мере захвачена, поэтому вы можете работать с ней.
use List::Util qw<sum>;
my $fh = FileHandle->new( PATH_TO_DATAFILE );
my $data
= { trial_times => []
, totals => {}
};
my $precision = 0;
while ( <$fh> ) {
if ( m/^for (\d+) threads:/ ) {
push @{$data->{trial_times}}, {};
}
elsif ( m/^Average time taken for (API\w+) is: (\d+\.(\d+)) nanoseconds./ ) {
push @{$data->{trial_times}[-1]{$1}}, $2;
push @{ $data->{totals}->{$1} }, $2;
$precision = length $3 if length $3 > $precision;
}
}
### $data
foreach my $api ( keys %{ $data->{totals} } ) {
my @list = @{ $data->{totals}{$api} };
my $sum =sum @list;
printf "Sum for %d runs of API $api: %0.${precision}f (Average: %0.${precision}f)\n"
, scalar @list, $sum, $sum / scalar @list
;
}
my @combined = map { @$_ } values %{$data->{totals}};
### @combined
my $sum = sum @combined;
printf "Combined %d runs for %0.${precision}f total (Average: %0.${precision}f)\n"
, scalar @combined, $sum, $sum / scalar @combined
;