Почему этот путь не работает для открытия файла Windows в PERL? - PullRequest
2 голосов
/ 13 февраля 2012

Я пытался поиграть со Strawberry Perl, и одна из вещей, которая меня озадачила, это чтение файлов.

Я пытался сделать:

open(FH, "D:\test\numbers.txt");

Но он не может найтифайл (несмотря на наличие файла и отсутствие проблем с разрешениями).

Эквивалентный код (100% сценария, отличного от имени файла, был идентичным) отлично работал в Linux.

Ответы [ 2 ]

13 голосов
/ 13 февраля 2012

Согласно 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: $!";
1 голос
/ 14 февраля 2012

Никогда не используйте интерполированные строки, если вам не нужна интерполяция!Вы пытаетесь открыть имя файла с символом табуляции и символом новой строки в нем из \ t и \ n!

Используйте одинарные кавычки, когда не хотите (или не хотите) интерполяции.

Одна из самых больших проблем, с которыми сталкиваются начинающие программисты на Perl, заключается в том, что они автоматически используют "" для всего, не задумываясь.Вы должны понимать разницу между «» и «», и вы должны ВСЕГДА думать, прежде чем печатать, чтобы выбрать правильный.Это сложная привычка, но жизненно важно, если вы собираетесь писать хороший Perl.

...