как проверить, что файл был успешно открыт в две строки - PullRequest
1 голос
/ 05 октября 2011

Извините, но я не могу найти ответ на этот вопрос.

Если у меня есть следующая строка

my $FH;
open FH,"somefile";

Теперь я хочу проверить, был ли FH успешно открыт, но я хотел бы сделать это в другой строке, не используя синтаксис или.

Я пробовал if ($ FH), но у меня это не сработало.

спасибо.

Ответы [ 3 ]

6 голосов
/ 05 октября 2011

Из open -Manual :

Open возвращает ненулевое значение в случае успеха, в противном случае неопределенное значение.Если при открытии использовался канал, возвращаемое значение является pid подпроцесса.

Так что вы можете сделать что-то вроде этого:

my $FH;
my $file_opened = open $FH, '<', 'somefile';

if($file_opened) {
    print "open";
    close($FH);
}

Или без дополнительной переменнойв одну строку:

if(open $FH, '<', 'somefile') {
    print "--open";
    close($FH);
}
2 голосов
/ 05 октября 2011

Вы можете сделать это в одну строку:

open( my $FH, '<', 'somefile' ) or die "Could not open file: $!\n";

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

Изменить: Если вы хотите сделать то же самое в две строки:

use autodie;
open( my $FH, '<', 'somefile' );
1 голос
/ 05 октября 2011

Если вы действительно не хотите использовать возвращаемое значение open, модуль ядра Scalar::Util предоставляет функцию openhandle, которая сообщит вам, является ли переменная файловым дескриптором, который готов к использованию.

use Scalar::Util 'openhandle';

open my $FH, '<', 'some_file.txt';

unless (openhandle $FH) {
    # handle error here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...