Может ли кто-нибудь объяснить этот фрагмент кода Perl?

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

Код:

$fh = \*STAT_FILE;
open ($fh,">>".$stat_file) or die "Can't open $stat_file: $!\n";
my $print_flag = ( -z $stat_file );

Я не совсем понимаю первую строку, а также последнюю строку кода выше. В частности, \*STAT_FILE и -z соответственно.

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

Может ли кто-нибудь объяснить мне этот код Perl построчно на псевдо? Кроме того, если описанный выше метод не является предпочтительным, то что?

заранее спасибо


person CheeseConQueso    schedule 17.03.2011    source источник
comment
Если вы нигде не используете $print_flag, удалите эту строку.   -  person runrig    schedule 18.03.2011


Ответы (2)


До Perl 5.6 дескрипторы файлов могли быть только глобусами (простыми словами) или ссылками на глобы (что и есть \*STAT_FILE). Кроме того, лучше использовать open с тремя аргументами (см. документацию. Также см. перлопентут). Итак, теперь вы можете сделать:

open(my $fh, ">>", $stat_file) or die "Failed to open $stat_file: $!";

и забудьте о \*STAT_FILE.

-z является одной из функций проверки файлов (и принимает имя файла или дескриптор файла в качестве аргумента) и проверяет, имеет ли файл нулевой размер.

$! является одной из специальных переменных и содержит самое последнее системное сообщение об ошибке (в этом случае почему вы можете не открывается файл, возможно, проблемы с правами доступа, или каталог в пути к файлу не существует и т. д.).

Вы должны научиться использовать perldoc, все это есть в perldoc:

perldoc perlfunc (в частности, perldoc -f open и perldoc -f -X)

перлдок перлвар

person runrig    schedule 17.03.2011
comment
open(fh, ››$stat_file) или die Не удалось открыть $stat_file: $!; отлично работает и с текущим (но я думаю, что мой комментарий сталкивается с многосторонним принципом perl) - person scrappedcola; 17.03.2011
comment
@runrig: Вы должны научиться использовать perldoc, все это находится в perldoc: это полезно только в том случае, если вы уже знали (не всегда столь очевидные) имена имен страниц документации perl :) Хорошо, что вы сообщили ему об этих важных , хотя. :) - person Robert P; 17.03.2011
comment
@runrig - спасибо за информацию и чистку кода. @robert P - вы сделали именно то, почему этот вопрос оказался здесь. Я не был уверен, что искать в документах. - person CheeseConQueso; 17.03.2011
comment
@runrig - в чем смысл последней строчки? зачем назначать этот тест $print_flag? - person CheeseConQueso; 17.03.2011
comment
@CheeseConQueso: я не знаю, почему переменная называется $print_flag, возможно, в каком-то контексте исходной программы это имело смысл. Но если вам нужно обратиться к этому статусу более одного раза, назначение его переменной более эффективно, чем выполнение нескольких статистических данных. Если вам не нужен этот тест, не используйте его. - person runrig; 17.03.2011
comment
@runrig - спасибо.... какая у этого цель? просто проверить, существует ли файл перед записью/добавлением к нему? - person CheeseConQueso; 17.03.2011
comment
@CheeseConQueso && @RobertP: Я понимаю, что некоторые вещи трудно найти (особенно когда нужно искать -z под -X). Основное правило для изучения документации: начните с «perldoc perl» и продвигайтесь вниз по списку, содержащемуся в нем. - person runrig; 17.03.2011
comment
@CheeseConQueso: цель состоит в том, чтобы проверить, пуст ли файл. Я не знаю, почему это в вашей программе. Если вы хотите узнать, существует ли файл, вы должны использовать -e ПЕРЕД открытием. - person runrig; 17.03.2011

Первая строка присваивает переменной ссылку (знак обратной косой черты) на typeglob (полная запись в таблице символов) STAT_FILE. Это была весьма идиоматическая конструкция Perl для передачи дескрипторов файлов, как сообщается, просто чтобы назвать это в Ларри Уолле «Programming perl». $! переменная содержит сообщение об ошибке, возвращенное операционной системой.

Итак, весь смысл:

  • строка 1. поместите в переменную $fh дескриптор файла;
  • строка 2. Открыть для добавления файл, сообщающий об ошибке системного сообщения в случае возникновения ошибки;
  • строка 3. Установите флаг переменной предупреждения, если файл имеет нулевую длину
person Daniel    schedule 17.03.2011