Функция die выдает синтаксическую ошибку при использовании с функцией use - PullRequest
1 голос
/ 27 июня 2019

Я пытаюсь создать систему резервного копирования в Perl.В конце концов, я хочу поделиться этим с миром.Но я хочу убедиться, что у людей установлены правильные модули, поэтому я хочу иметь некоторую обработку исключений в случае, если у них нет правильных модулей.По иронии судьбы, функция die выдает синтаксическую ошибку, когда я использую ее в следующей ситуации:

use strict; use warnings;

use Tk or die "You don't have the Tk module installed."

Как я могу настроить это, чтобы получить желаемый эффект?

1 Ответ

8 голосов
/ 27 июня 2019

Оператор use является специальным, он не работает как вызов функции.Он выполняется во время компиляции, в отличие от большинства операторов, и анализирует оставшуюся часть оператора с уникальным синтаксисом, а именно: имя модуля должно быть голым, и после него может быть необязательная версия модуля, за которой следует список аргументов.

Просто use Tk; уже сгенерирует исключение, если Tk не найден, вам не нужно выполнять какую-либо собственную проверку.Если вы хотите настроить сообщение об ошибке, вы можете загрузить его в оператор времени выполнения с require и перехватить исключение, но вам действительно следует включить содержимое @INC или исходное сообщение об ошибке, которое содержит это,для отладки, где должен быть найден модуль:

use strict;
use warnings;
BEGIN {
  unless (eval { require Tk; Tk->import; 1 }) {
    die "You don't have the Tk module installed: $@";
  }
}

Зависимости для распределения CPAN указываются в метаданных и сценарием настройки для распространения, это гарантирует, что они устанавливаются, когда пользователь пытается установить ваш дистрибутив склиент CPAN.См. http://blogs.perl.org/users/neilb/2017/05/specifying-dependencies-for-your-cpan-distribution.html. Для кода, распространяемого за пределами CPAN, cpanfile предоставляет формат для указания зависимостей, которые могут быть легко установлены пользователем с помощью cpanm .

...