diver, у меня два предложения: по стилю и по коду. Поверь, оба важны.
Несколько замечаний по стилю.
1. Не начинай имена переменных и ф-ий со строчных букв - так обозначают константы. Собственно, стиль полностью соответствует принятому в других языках, как-то C, C++, Java и т.д. Будет меньше путать.
2. Вместо & перед именем ф-ии лучше определяй прототипы (так же, как и в С - раньше первого вызова в тексте).
3.
foreach my $szName(@DirList){
3.1. Делай отступы и не сцепляй имена переменных со скобками - будет меньше путаницы и неожиданного поведения программы.
3.2. Фигурные скобки, обозначающие блоки, лучше переносить на новую строку. Хотя оба стиля имеют право на существование, скобка на отдельной строке визуально отделает оператор и тело блока - легче читается.
3.3. Оператор foreach в Perl - синоним для for. Традиционно применяется for.
4. Старайся применять для строк одиночные кавычки, за исключением случаев, когда нужна интерполяция строки (в том числе, когда нужно вставлять \n \t и т.п.). Это спасет от нежелательных интерполяций и ускорит код.
По коду.
Судя по всему, ты работаешь в виндовой консоли. Надо знать, что там иная кодировка, чем в самой винде. Именуется OEM (реальная кодовая страница зависит от локали системы).
Perl может автоматически перекодировать текст при вводе-выводе, но опции можно определить только при открытии файла. Дескриптор STDOUT, в который неявно выводит print, можно переоткрыть.
Попробуй переоткрыть STDOUT с указанием кодировки:
use PerlIO::encoding;
open(STDOUT, ">:encoding(cp866)", "-");