@classmates = (@classmates, &M1(@n));
Just a quick check reveals:
> perl -lwe'use Benchmark "cmpthese";@a=0..8;cmpthese(-8, {push => sub
+{push@x,@a[0..2]}, comb => sub{@y=(@y,@a[0..2])}})'
Benchmark: running comb, push , each for at least 8 CPU seconds ...
comb: 28 wallclock secs (28.33 usr + 0.00 sys = 28.33 CPU) @ 44.7
+9/s (n=1269)
push: 8 wallclock secs ( 8.13 usr + 0.25 sys = 8.38 CPU) @ 4172
+8.04/s (n=349681)
Rate comb push
comb 44.8/s -- -100%
push 41728/s 93056% --
I know your arrays aren't growing linearly like this, so the difference wouldn't be so extreme.
 
p