Как Вы проверяете успех открытых (файл) в Perl?

Следующее (не очень выход Perl) код

#!/usr/bin/perl

if (! -e "mydir/")
{
  print "directory doesn't exist.\n";
}
open (my $fh, ">", "mydir/file.txt");
if ($fh)
{
  print "file opened.\n";
  print $fh;
  print $fh "some text\n" or die "failed to write to file.\n";
  close ($fh);
}
else
{
  print "failed to open file.\n";
}

производит вывод, такой как это

directory doesn't exist.
file opened.
failed to write to file.
GLOB(0x...some-hex-digits...)

Почему $fh не эквивалентен лжи после прослушивания? Поскольку mydir/не существует, я ожидал бы попытку открыть файл для сбоя.

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

Я попробовал это Perl 5.10.1 в Windows 7 x64, и с Perl 5.10.0 на Fedora-11 Linux.

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

Спасибо, ограбить.

13
задан Rhubbarb 9 July 2010 в 14:02
поделиться

4 ответа

$ fh не устанавливается на нулевое значение, он устанавливается на GLOB , как показывает ваш код. Это отличается от того, что возвращает open , поэтому идиома

open(...) or die ... ;

или

unless(open(...)) {
    ...
}
19
ответ дан 1 December 2019 в 17:39
поделиться

В дополнение к объяснениям в других ответах:

Ознакомьтесь с модулем autodie , который поставляется с perl 5.10.1 и выше (и доступен отдельно от CPAN ).

8
ответ дан 1 December 2019 в 17:39
поделиться

open возвращает ненулевое значение на успех и значение «ложь» при неудаче. Идиома, которую вы ищете:

if (open my $fh, '>', $file) {
    # open was successful
} else {
    # open failed - handle error
}

Если первый аргумент ( $ fh ) не определен (как в этом случае), open инициализирует его некоторым произвольным значением ( см. Symbol :: genysm метод ) до он пытается открыть файл. Таким образом, $ fh будет всегда "истинным", даже если вызов open завершится неудачно.

14
ответ дан 1 December 2019 в 17:39
поделиться

From perldoc :

Open возвращает ненулевое значение в случае успеха, в противном случае - неопределенное значение.

Часто используется идиома

open my $fh, '<', $filename or die $!;

Конечно, вы можете сделать что-нибудь еще, кроме die .

9
ответ дан 1 December 2019 в 17:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: