Perl, похоже, требует внешнего модуля для использования встроенного sysopen

#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).