opendir(DIRHANDLE, $self->param('photos_dir')) or die "couldn't open main directory: $!"; $dir_row_count = 0; $file_count = 0; $row_limit = 5; while (defined($filename = readdir(DIRHANDLE))) { next if $filename =~ /^\.\.?$/ || !(-d $filename); push @$dir_list, { dir => $filename, dir_row => [] }; opendir(SUBDIRHANDLE, "$filename") or die "couldn't open directory $filename: $!"; my @pictures = grep { /\.(?:png|gif|jpg)$/ } readdir SUBDIRHANDLE; closedir(SUBDIRHANDLE); push @{$dir_list->[scalar @$dir_list - 1]{dir_row}}, { file_row => [] }; $file_count = 0; foreach (@pictures) { unless ($file_count % $row_limit) { push @{$dir_list->[scalar @$dir_list - 1]{dir_row}}, { file_row => [] }; } push @{$dir_list->[scalar @$dir_list - 1]{dir_row}[$dir_row_count]{file_row}}, { filename => "$filename/$_", alt => $_ }; $file_count++; } $dir_row_count++; } #### $VAR1 = [ { 'dir' => '50s', 'dir_row' => [ { 'file_row' => [ { 'alt' => 'band_table.jpg', 'filename' => '50s/band_table.jpg' }, { 'alt' => 'cake_t2.jpg', 'filename' => '50s/cake_t2.jpg' }, { 'alt' => 'cake-t.jpg', 'filename' => '50s/cake-t.jpg' }, { 'alt' => 'an_logo.jpg', 'filename' => '50s/an_logo.jpg' }, { 'alt' => 'gabe-bpm.jpg', 'filename' => '50s/gabe-bpm.jpg' }, { 'alt' => 'cake_enter.jpg', 'filename' => '50s/cake_enter.jpg' } ] }, { 'file_row' => [] }, { 'file_row' => [] } ] }, { 'dir' => '60s', 'dir_row' => [ { 'file_row' => [] }, { 'file_row' => [ { 'alt' => 'cake_cdsleeve.jpg', 'filename' => '60s/cake_cdsleeve.jpg' } ] } ] } ];