in reply to Subroutine processes only one file in the directory
I see one mistake. Change:
my $filename = @_;
to:
my $filename = $_[0];
Your code always assigns $filename=1, instead of the actual file name. Prove this to yourself by printing $filename inside your sub right after the assignment.
See also: Basic debugging checklist
In Section
Seekers of Perl Wisdom