но это казалось проще, чем объединять
таблицы в Excel.
На самом деле, такие модули, как Spreadsheet :: ParseExcel , делают это действительно легко, в большинстве случаев. Вы по-прежнему должны иметь дело со строками, как будто из адресации CSV или типа «A1», но вам не нужно делать шаг экспорта. И тогда вы можете вывести с помощью Spreadsheet :: WriteExcel !
Я использовал эти модули, чтобы прочитать электронную таблицу из нескольких сотен чеков, отсортировать и упорядочить содержимое, а также написать в новый для доставки бухгалтеру.
В этой части:
foreach $subnet (sort keys %hash) {
$tot = keys(%{$hash{$subnet}});
$days{$dt}{$subnet} = $tot;
print FH "$subnet,$tot\n";
push @{$subnet}, $tot;
}
$ subnet - это строка, но вы используете ее в последнем выражении в качестве ссылки на массив. Поскольку у вас нет strictures , он обрабатывает его как мягкую ссылку на переменную с именем, совпадающим с содержимым $ subnet. Что хорошо, если вы действительно хотите, но это сбивает с толку. Что касается уточнения последней части ...
Обновление Я предполагаю, что это то, что вы ищете, где значение подсети сохраняется, только если оно не появилось раньше, даже из другого дня (?):
use List::Util qw(sum); # List::Util was first released with perl 5.007003 (5.7.3, I think)
my %buckets;
foreach my $day (sort keys %days) {
foreach my $subnet (sort keys %{$days{$day}}) {
next if exists $buckets{$subnet}; # only gives you this value once, regardless of what day it came in
my $total = sum @{$subnet}; # no need to reuse a variable
$buckets{$subnet} = int($total/@{$subnet}; # array in scalar context is number of elements
}
}
use Data::Dumper qw(Dumper);
print Dumper \%buckets;