#perl
#perl
Вопрос:
Извините, но я не могу найти ответ на это.
Если у меня есть следующая строка
my $FH;
open FH,"somefile";
Теперь я хочу проверить, был ли успешно открыт FH, но я хотел бы сделать это в другой строке, не используя синтаксис or .
Я попробовал if ($ FH ), но у меня это не сработало.
Спасибо.
Комментарии:
1. Если
FH
это не опечатка:open $FH
вероятно, это то, что вам нужно. Нет смысла объявлять лексическую переменную, если вы все равно собираетесь использовать глобальную.2. Кстати .. это похоже на один из тех случаев, когда вы задаете неправильный вопрос. Чего вы пытаетесь достичь?
3. @TLP,
or
выдает плохой код, если вы хотите сделать больше, чемdie
.
Ответ №1:
Из 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);
}
Комментарии:
1. @mob: вы правы, спасибо за разъяснение. Я отредактировал свой ответ и процитировал непосредственно из
open
-reference .
Ответ №2:
Вы можете сделать это в одной строке:
open( my $FH, '<', 'somefile' ) or die "Could not open file: $!n";
Это дает вам преимущество в распечатке причины, по которой файл не удалось открыть.
Редактировать: если вы хотите сделать то же самое в двух строках:
use autodie;
open( my $FH, '<', 'somefile' );
Комментарии:
1. Это идиоматический способ сделать это
2. Но Эран специально сказал, что это не то, чего он хочет.
Ответ №3:
Если вы действительно не хотите использовать возвращаемое значение open
, основной модуль Scalar::Util
предоставляет openhandle
функцию, которая сообщит вам, является ли переменная дескриптором файла, который готов к использованию.
use Scalar::Util 'openhandle';
open my $FH, '<', 'some_file.txt';
unless (openhandle $FH) {
# handle error here
}