Почему этот путь не работает для открытия файла Windows в PERL?
Я попытался поиграть со Strawberry Perl, и одна из вещей, которая поставила меня в тупик, - это чтение файлов.
Я пытался сделать:
open(FH, "D:\test\numbers.txt");
Но он не может найти файл (несмотря на наличие файла и никаких проблем с разрешениями).
Эквивалентный код (100% скрипта, отличного от имени файла, был идентичен) отлично работал в Linux.
2 ответа
В соответствии с Perl FAQ 5 вы должны использовать прямую косую черту в именах файлов 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:
Кроме того, вы могли бы еще больше улучшить свой код, используя лексический (вместо глобального именованного) файловый дескриптор, форму открытия с тремя аргументами и, самое главное, проверку на ошибки ВСЕХ ваших операций ввода-вывода, особенно 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: $!";
Никогда не используйте интерполированные строки, если вам не нужна интерполяция! Вы пытаетесь открыть имя файла с символом табуляции и символом новой строки в \t и \n!
Используйте одинарные кавычки, когда вы не хотите (или не хотите) интерполяции.
Одна из самых больших проблем, с которыми сталкиваются начинающие программисты на Perl, заключается в том, что они автоматически используют "" для всего, не задумываясь. Вы должны понимать разницу между "" и "", и вы должны ВСЕГДА думать, прежде чем печатать, чтобы выбрать правильный. Это сложная привычка, но жизненно важно, если вы собираетесь писать хороший Perl.