Как я разрешаю “печать () на закрытом дескрипторе файла” ошибка в Perl?

Решение 1

Порядок импорта имеет значение import lazy loaded module вверху и router module на последнем месте. Поскольку мы выполняем отложенную загрузку, этот загруженный модуль должен существовать до того, как мы осуществим маршрутизацию.

imports: [
    BrowserModule,       
    HeroModule, // Lazy-loaded module

    AppRoutingModule
  ],

Решение 2

Обычно Angular CLI импортирует module в app-module при его создании. поэтому убедитесь, что модуль lazy-loaded не был импортирован в app-module

13
задан brian d foy 3 June 2009 в 17:35
поделиться

7 ответов

Вы хотите выполнить какое-то действие с MYFILE после того, как вы (или сам интерпретатор из-за ошибки) закрыли его.

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

Измените свой код на следующий, чтобы проверить, была ли ошибка:

open(MYFILE, ">", "/home/abc/xrt/sdf/news/top.html") or die "Couldn't open: $!";

Обновление

ysth указывает, что -w не очень хорошо проверяет, можете ли вы писать в файл, он только «проверяет, установлен ли один из соответствующих флагов в режиме». Более того, brian d foy сказал мне, что использованное мной условие не подходит для обработки ошибки. Поэтому я удалил вводящий в заблуждение код. Вместо этого используйте приведенный выше код.

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

Альтернативным решением сказать или умереть является использование прагмы autodie :

#!/usr/bin/perl

use strict;
use warnings;
use autodie;

open my $fh, "<", "nsdfkjwefnbwef";

print "should never get here (unless you named files weirdly)\n";

Приведенный выше код вызывает следующую ошибку (если файл named nsdfkjwefnbwef существует в текущем каталоге):

Can't open 'nsdfkjwefnbwef' for reading: 'No such file or directory' at example.pl line 7
6
ответ дан 1 December 2019 в 17:21
поделиться

Похоже, что вызов open завершился ошибкой. Вы должны всегда проверять статус при открытии дескриптора файла.

my $file = '/home/abc/xrt/sdf/news/top.html';
open(MYFILE, ">$file") or die "Can't write to file '$file' [$!]\n";
print MYFILE $DATA;
close MYFILE;

Если открытие завершилось неудачно, встроенная переменная $! (также известный как $ OS_ERROR) будет содержать зависящее от ОС сообщение об ошибке, например, «Permission denied»

Также предпочтительно (для неархаичных версий Perl) использовать форму с тремя аргументами open и лексические дескрипторы файлов:

my $file = '/home/abc/xrt/sdf/news/top.html';
open(my $fh, '>', $file) or die "Can't write to file '$file' [$!]\n";
print {$fh} $DATA;
close $fh;
13
ответ дан 1 December 2019 в 17:21
поделиться

Убедитесь, что открытая сработала

if(open(my $FH, ">", "filename") || die("error: $!"))
{
    print $FH "stuff";
    close($FH);
}
3
ответ дан 1 December 2019 в 17:21
поделиться

Где-то в вашем скрипте вы будете делать что-то вроде:

open MYFILE, "> myfile.txt";
# do stuff with myfile
close MYFILE;
print MYFILE "Some more stuff I want to write to myfile";

Последняя строка выдаст ошибку, потому что MYFILE был закрыт.

Обновление

После просмотра вашего кода , похоже, что файл, в который вы пытаетесь записать, вообще не открывается. Как уже упоминалось другими, попробуйте сделать что-нибудь вроде:

open MYFILE, "> myfile.txt" or die "Can't open myfile.txt: $!\n"

Это должно дать вам обратную связь о том, почему вы не можете открыть файл.

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

Это:

open(MYFILE,">/home/abc/xrt/sdf/news/top.html");

В современном Perl это можно было бы записать как:

open(my $file_fh, ">", "/home/abc/xrt/sdf/news/top.html") or die($!);

Таким образом вы получаете переменную $, ограниченную областью видимости, нет никакого "забавного дела", если у вас странные имена файлов (например, начинающиеся с ">") и обработка ошибок (вы можете заменить die на warn или на код обработки ошибок).

Как только вы закроете $ file_fh или просто выйдете из области видимости, вы больше не сможете печатать в него.

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

Если вы используете глобальный символ MYFILE в качестве дескриптора файла, а не локальный лексический файл ($ myfile), вы всегда будете сталкиваться с проблемами, если ваша программа многопоточная, например, если она выполняется через mod_perl. Один процесс может закрывать дескриптор файла, в то время как другой процесс пытается записать в него. Использование $ myfile позволит избежать этой проблемы, поскольку каждый экземпляр будет иметь свою собственную локальную копию, но вы все равно столкнетесь с проблемами, когда один процесс может перезаписать данные, которые записывает другой. Используйте flock (), чтобы заблокировать файл во время записи в него.

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

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