Согласно FAQ по Perl 5 , вы должны использовать forward косые черты в именах файлов DOS / Windows (или, в качестве альтернативы, экранирование от обратной косой черты).
Почему я не могу использовать «C: \ temp \ foo» в путях DOS? Почему не работает `C: \ temp \ foo.exe`?
Упс! Вы просто помещаете вкладку и форму подачи в это имя файла! Помните, что в строках с двойными кавычками («like \ this») обратная косая черта является escape-символом. Полный список из них в кавычках и кавычках в Perlop. Неудивительно, что в вашей прежней файловой системе DOS нет файла с именем «c: (tab) emp (formfeed) oo» или «c: (tab) emp (formfeed) oo.exe».
Либо заключите в кавычки ваши строки, либо (желательно) используйте косую черту. Поскольку все версии DOS и Windows, начиная с MS-DOS 2.0 или около того, трактуют / и \ то же самое в пути, вы также можете использовать ту, которая не конфликтует с Perl - или оболочку POSIX, ANSI C и C ++, awk, Tcl, Java или Python, только некоторые из них. Пути POSIX также более переносимы.
Таким образом, вместо этого ваш код должен быть open(FH, "D:/test/numbers.txt");
, чтобы не пытаться открыть файл с именем "D: est \ numbers.txt"
Кроме того, вы можете еще больше улучшить свой код, используя лексический (вместо глобального именованного) файловый дескриптор, форму открытия с тремя аргументами и, самое главное, проверку на ошибки ВСЕХ операций ввода-вывода, особенно вызовов open()
:
open(my $fh, "<", "D:/test/numbers.txt") or die "Could not open file: $!";
Или, что еще лучше, не жестко кодировать имена файлов в вызовах ввода-вывода (следующая практика МОЖЕТ помочь вам быстрее выявить проблему):
my $filename = "D:/test/numbers.txt";
open(my $fh, "<", $filename) or die "Could not open file $filename: $!";