Требуется написать эффективную (быструю, с внятным, по возможности кратким кодом) функцию, которая принимает ссылку на таблицу (массив массивов) и возвращает массив с максимальной шириной каждого столбца. Количество элементов в строках таблицы может быть различным. Можно использовать фунцию max (из модуля List::Util, а если этого модуля нет, то и написать ее не сложно).
Эта задача, как мне кажется, имеет достаточно общий интерес (возвращаемый массив можно использовать, например, для красивой печати таблиц с сильно различной шириной колонок). А код, который ниже, в примере, мне не нравится (с внятностью точно проблемы, со скоростью, наверное, тоже).
| Код | use List::Util('max');
@a = (['N','Описание', 'Количество', 'Примечание'], ['1', 'Яблоко', '5'], ['2', 'Апельсин', '', 'Грузить бочками'], ['3', 'Киви', '10']);
@max = max_width(\@a); print "@max\n";
sub max_width { my $aref = shift; my @max; foreach $i (0..max(map {$#{$_}} @$aref)) { $max[$i] = max(map {defined && length} map {$_->[$i]} @$aref); } return @max; } |
|