#perl #strict
#perl #строгий
Вопрос:
$ perl -e 'use strict subs; print sysopen(my $temp, "./myfile.txt", O_RDONLY);'
Bareword "O_RDONLY" not allowed while "strict subs" in use at -e line 1
Если вы запустите это в командной строке, вы получите эту ошибку. Я понимаю, почему это ошибка, и решение таково use Fnctl
, но это то, что должно быть установлено на коробке. У людей достаточно жалоб на Perl, и я пытаюсь дать им инструмент, который (скрыто) демонстрирует полезность Perl и то, насколько мало хлопот это (могло бы) доставить. Это не помогает.
Я пытаюсь написать утилиту Perl, которую люди могли бы использовать просто как один файл, без необходимости устанавливать внешние библиотеки. Почему для встроенного модуля требуется внешний модуль? Я понимаю, что O_RDONLY
это может отличаться в разных операционных системах, но так же может STDIN
быть, STDERR
, и STDOUT
, но с ними можно работать use strict subs
.
Комментарии:
1. Если вы хотите продемонстрировать простоту, зачем
sysopen
вообще использовать? в 99% случаевopen
вы будете делать то, что хотите, с меньшими затратами.2. Если вы не хотите, чтобы люди что-то устанавливали, отправляйте их вместе со своим кодом! См. metacpan.org/pod/App::FatPacker .
3. У меня возникли проблемы с использованием старомодных дескрипторов файлов Perl в хэше (имя файла ключа, дескриптор значения). Когда я извлек дескриптор, он не сработал. Кроме того, поскольку это «хвостовая» команда, которую я пишу, я бы предпочел читать дополнения к файлу большими «глотками», чем по строчке за раз.
4. @WaltHoward, дескрипторы файлов можно без проблем хранить в хэше.
print $hash{key} "string"
не будет работать, ноprint { $hash{key} } "string"
будет.
Ответ №1:
Почему для встроенного требуется внешний модуль?
Fcntl не является внешним модулем. Это стандартный модуль, поставляемый с Perl. Если он не загружается, значит, Perl установлен неправильно. Но если вы хотите, вы можете использовать числовые значения, проверить его значение и использовать это вместо него: perl -MFcntl -E 'say O_RDONLY'
Комментарии:
1. Вы правы!!! Это был удаленный компьютер, на котором установка была прервана.
Ответ №2:
Вы можете проверить состояние модулей с corelist
помощью, который поставляется с perl
:
$ corelist Fcntl
Data for 2020-06-20
Fcntl was first released with perl 5
$ corelist Module::CoreList
Data for 2020-06-20
Module::CoreList was first released with perl v5.8.9
Module::Build
это пример модуля, который был в ядре, устарел, а затем удален:
$ corelist Module::Build
Data for 2022-03-13
Module::Build was first released with perl v5.9.4, deprecated (will be CPAN-only) in v5.19.0 and removed from v5.21.0
Дескрипторы STDOUT
, STDERR
, и STDIN
являются специальными переменными Perl, и они знают, какими они должны быть, когда ваш perl компилируется. Perl не жалуется ни на одну из переменных, которые он предоставляет вам бесплатно (perlvar).