whileループ

if文などの条件式においては、未定義値(undef)、空文字、数字の0や文字の「0」なども全て偽と判別されますが、「defined」関数を使えば未定義(undef)だけを判別することが出来ます。

defined関数 - その他の関数 - Perl関数のリファレンス

ということなので

my $folder = 'folder';
my $dh;
my $file;
opendir($dh,$folder);
while($file = readdir($dh)){

}
closedir($dh);

ではなくて

my $folder = 'folder';
my $dh;
my $file;
opendir($dh,$folder);
while(defined($file = readdir($dh))){

}
closedir($dh);

のほうがよさそう。