in reply to A vertical (+/- random) split of a file

You can just open each file once: (untested)
my @outfiles; open $outfiles[$_], "> $ARGV[0].$_" or die "nope: $!" for 0..$n-1; ... print {$outfiles[$i]} join("\t",$id,@elmt[@ind[$d..$f]])."\n";