Проблема с открытием файла в Perl - PullRequest
2 голосов
/ 12 апреля 2010

У меня проблемы с печатью из файла. Есть идеи? Спасибо

open(STDOUT,">/home/int420_101a05/shttpd/htdocs/receipt.html"); 
#Results of a sub-routine
&printReceipt; 
close(STDOUT);

open(INF,"/home/int420_101a05/shttpd/htdocs/receipt.html"); $emailBody = <INF>; 
close(INF); 
print $emailBody;

ERRORS: Filehandle STDOUT reopened as INF only for input at ./test.c line 6. 
print() on closed filehandle STDOUT at ./test.c line 9.

Ответы [ 3 ]

4 голосов
/ 12 апреля 2010
  1. В этом обсуждении рассматривается техническая причина сообщения . Соответствующая информация из ветки такая:

    С открытой (2) страницы:

    При успешном вызове возвращается дескриптор файла самый низкий дескриптор файла, который в данный момент не открыт для процесса.

    Но STDOUT все еще относится к файловая ручка № 1. Это предупреждение может быть полезно. Хотя можно утверждать, что дальнейшее использование STDOUT в качестве выхода filehandle вызовет предупреждение как хорошо ...

    Итак, чтобы подвести итог, вы закрыли STDOUT (дескриптор файла 1), и ваш файл будет открыт как FD # 1. Это из-за open()'s свойств.

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

    Вместо этого откройте файл для записи, используя новый дескриптор файла:

    open(OUTFILE,">/home/int420_101a05/shttpd/htdocs/receipt.html")
       || die "Could not open: $!"; 
    print OUTFILE "data";
    close(OUTFILE);
    
  3. Для печати в дескриптор файла из подпрограммы, просто передайте дескриптор файла в качестве параметра .

    Лучший способ сделать это - создать объект IO::File и передать его вокруг

    my $filehandle = IO::File->new(">$filename") || die "error: $!";
    mySub($filehandle);
    
    sub mySub {
     my $fh = shift;
     print $fh "stuff" || die "could not print $!";    
    }
    

    Вы также можете установить конкретный дескриптор файла в качестве дескриптора файла по умолчанию, чтобы его печать распечатывалась по умолчанию с использованием select, но это НАМНОГО более хрупко и его следует избегать в пользу решения IO :: File. 1037 *

1 голос
/ 12 апреля 2010

Если вы хотите временно изменить стандартный вывод, используйте встроенную команду select . Другой вариант - сначала локализовать глобус типа:

{
    local *STDOUT;
    open STDOUT, '>', 'outfile.txt' or die $!;
    print "Sent to file\n";
}
0 голосов
/ 12 апреля 2010

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

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