my $q_file = "tmp.txt"; my $n = 10; my @ques = get_questions($q_file, $n); print for @ques; sub get_questions { local $/="===\n"; local $.; # Is this necessary? local @ARGV = (shift); # If you want 'open ... or die' behavior local $SIG{__WARN__} = sub { die shift }; my $num = shift; my @questions; while (<>) { push(@questions, $_), next if $. <= $num; my $i = rand($.); $questions[$i] = $_ if $i < $num; } @questions; }