Apart from a few typos, the only problem I see is that you're putting an array ref into @output instead of the array elements (i.e., lose the square brackets).
Here's my version, and it seems to work fine:
#!/usr/bin/perl -w
use strict;
use warnings;
use Data::Dumper;
#kaks üheveerulist faili, prindib need veerud mis ühes on aga teises p
+ole
#ehk siis suurem fail miinus väiksem
my $num_args = $#ARGV + 1;
if ($num_args != 3) {
print "\nUsage: ./lahutaja suurem väiksem vahe(output)\n";
exit;
}
my $f=$ARGV[0];
my $qa=$ARGV[1];
my $out=$ARGV[2];
open FA, "< $f"or die "Can't open $f: $!";
open QA, "< $qa" or die "Can't open $qa: $!";
open OUT,"> $out" or die "Can't open $out: $!";
my @bl = <QA>;
my @a = <FA>;
my %h;
@h{@bl} = @bl;
my @output=grep {!exists $h{$_}} @a;
print "\@bl: [ @bl ]\n";
print "\@a: [ @a ]\n";
print "\@output:[ @output ]\n";
print OUT @output;
close FA;
close QA;
close OUT;