Не удается записать в файл с Perl в Windows 7 - PullRequest
1 голос
/ 27 ноября 2011

Я установил Strawberry Perl и уже некоторое время пользуюсь им.Но когда я запускаю следующее, файл не создается:

    open TEST, ">happy.txt";
    print TEST "contents";
    close TEST;

Я нигде не могу найти ответ.Интересно, это разрешение?Я запустил командную строку Perl от имени администратора и поиграл с абсолютными путями к файлам.Я пробовал на 2 компьютерах win7.Может кто-нибудь еще создавать файлы с Perl на Windows 7?

Два указателя (в большей степени применимы только к win7) - для пути следует использовать одинарные кавычки из-за обратной косой черты в окнах?
- Кажется, следует использовать полные пути.

Это сработало:

open my $test, '>', 'D:\_docs\documents\perl\happy.txt' or die $!;
print $test "contents\n";
close $test or die $!;

Примечание: используйте путь к вашему файлу.

Ответы [ 3 ]

2 голосов
/ 27 ноября 2011

В вашем коде нет ничего неправильного, что могло бы привести к его отказу. Однако, что не так с ним, так это то, что он не проверяет возвращаемое значение «open» и «close» на успех. Без тестирования вы не знаете, где находится точка сбоя. Если вы проверите на неудачу, вы можете лучше понять, что не так.

Я предоставлю обновленную версию вашего кода, которая проверяет наличие ошибок и выводит сообщение об ошибке при ошибке. Пока я в этом, я буду использовать некоторые «лучшие практики», такие как косвенный лексический дескриптор файла и открытый три аргумента:

open my $test, '>', 'happy.txt' or die $!;
print $test "contents\n";
close $test or die $!;

Выполнение кода таким образом более четко скажет вам, что такое сбой (в отличие от молчаливого сбоя). Специальная переменная '$!' содержит актуальное сообщение об ошибке.

1 голос
/ 16 декабря 2012

Я тоже не мог найти ответа, ни где. После того, как я наконец-то нашел это решение сегодня, после долгих часов исследований в течение двух дней для решения одной и той же основной проблемы на моей собственной 64-битной Windows 7 с 32-битной Perl 5.16.1 build 1601 ActiveState, вот кое-что из нижеперечисленного для меня: почему нормальный опубликованный синтаксис, похоже, не работает, и я пробовал десятки вариантов, но только сегодня нашел тот, который работает - согласно вашей публикации и ответам здесь.

Это ниже выводимое сообщение из моего Perl. Пример 1

(где впервые у меня НЕТ выходного файла нулевого байта, а также файл с текстом внутри того, что я хотел добавить туда).

Это сработало нормально.

Это вывод из моего Perl Пример 2:

print () на закрытой файловой ручке OUTPUT в строке testme3.pl 85. Пример 2: без переменной доллара OUTPUT.

Как и раньше, когда оператору печати не удалось распечатать вывод в файл, и вместо этого снова отобразилось отображение на экране, у меня появилось первое сообщение об ошибке. К моему удивлению, моя инструкция print пыталась печатать, когда дескриптор файла уже закрылся!

До этого у меня не было ни сообщений об ошибках из ОС, ни сообщений о штампах, поскольку я не помещал операторы в свои операторы печати. Ниже приведены два примера кода в том же порядке, чтобы показать, что породило вышеупомянутые сообщения. Кстати - в сценарии было строгое использование; и используйте предупреждения;

Пример 1:

print "\n\nThis worked fine";
my $OUTPUT;
open ($OUTPUT, '>hereOUTPUT.txt' ) or die "Can not create/open file. $!l";
print $OUTPUT "this is created OUTPUT";
close $OUTPUT;

Пример 2. Удаление префикса $ для OUTPUT в строке печати привело к появлению интересного нового сообщения об ошибке выше.

print "\n\nExample 2: with no dollar sign OUTPUT variable.";
my $OUTPUT;
open ($OUTPUT, '>>hereOUTPUT.txt' ) or die "Ex3a) Can not create/open file. $!l";
print OUTPUT "this is non dollar appended OUTPUT";
close $OUTPUT;

И, наконец, вот новый ненулевой выходной файл и что внутри: c: \ a000 \ myperl \ projects \ dir1> dir здесь * Том на диске C не имеет метки. Серийный номер тома: 28B5-6AB9

Каталог c: \ a000 \ myperl \ projects \ dir1

12.12.2012 17:57 22 здесьOUTPUT.txt 2 файл (-ов) 22 байта 0 Dir (s) 636 297 977 856 байт

c: \ a000 \ myperl \ projects \ dir1> введите здесь OUTPUT.txt это создано ВЫХОД C: \ a000 \ myperl \ проекты \ dir1>

0 голосов
/ 01 февраля 2019

Аналогичная аномалия, которую я заметил при запуске perl5.24 (Strawberry) в Window (Server 2012), и open ...; print $filehandle "something"; close ...; не работал:

Следующее не сработало (объявление переменной с my in open ):

    open my $fh, '>', "c:/myfile";

Следующая работа DID (объявление переменной до open ):

    my $fh;
    open $fh, '>', "c:/myfile";

Также странно, что я заметил, что файл не менялся, пока я close $fh. После закрытия дескриптора файла размер файла напрямую изменяется в браузере.

Не знаю, какова причина этого, но надеюсь, этот совет может помочь и сэкономить несколько часов попытки / неудачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...