use List::Util qw(min); foreach my $seq ( 0 .. $#files/3_000 ) { my $zip = Archive::Zip->new(); my $start = $seq * 3_000; my $end = min ( $#files, $start + 2_999 ); foreach my $i ( $start .. $end ) { $zip->addFile( $files[$i], basename $files[$i] ); } $zip->writeToFileNamed("test-$seq.zip"); }