Как сделать так, чтобы каждый экземпляр сценария perl имел свой уникальный идентификатор?
У меня есть Perl-скрипт, который подключается к Plex API. Он входит в систему и выполняет определенные действия (в основном рабочие).
Однако Plex API предлагает (настаивает?), Чтобы каждый экземпляр скрипта отправлял уникальный идентификатор, так что, если я поделюсь этим скриптом с кем-либо еще, они должны использовать разные строки.
Для простоты я не хочу иметь какой-либо конфигурационный файл, который хранит это значение вне сценария. Я также не могу оставить значение жестко запрограммированным, никто, кто его загрузит, не изменит его.
Может ли скрипт perl изменить себя?
Если бы я объявил это так:
my $uuid = 1;
... тогда не мог бы я сразу же проверить, равно ли это значение 1, и переписать это случайно сгенерированным uuid? Затем сценарий завершается, но каким-то образом повторно вызывает себя (поэтому пользователю не нужно запускать его второй раз).
Есть ли безопасный способ сделать это? В качестве альтернативы, есть ли лучший способ достичь цели без использования этого метода?
3 ответа
Сделайте последнюю строку вашего скрипта __DATA__
и добавьте идентификатор к сценарию либо при установке, либо при первом запуске. Чтение из специального <DATA>
дескриптор читает сегмент данных скрипта.
Вы могли бы использовать UUID::Tiny
для генерации случайного UUID:
use UUID::Tiny;
my $uuid = create_UUID(UUID_V4);
Чтобы сохранить UUID между вызовами, вам нужно изменить сам скрипт. Ответы в этой теме могут быть полезны.
Обновить
В комментариях вы говорите, что вам нужен другой уникальный идентификатор "для каждой установки", но вы также говорите, что "оно должно быть одинаковым для любого пользователя", поэтому я больше не уверен, что мой ответ удовлетворит ваши требования
Я предлагаю вам использовать системный UUID, возвращенный dmidecode
, Конечно, вам нужно будет установить его на свой компьютер, и для CPAN для него есть модуль синтаксического анализа, который называется Parse::DMIDecode
Это немного сложнее, если вам нужно поддерживать системы Windows. Вы можете использовать DmiDecode для Windows, который доступен в виде готового двоичного файла, но модуль синтаксического анализа явно проверяет, что нет двоеточий (среди прочего) в пути к demidecode
исполняемый файл, поэтому вызов probe
метод не сработает. Вместо этого вы должны позвонить demidecode
и передать результат в parse
метод
Этот короткий пример отлично работает как на Linux, так и на Windows
use strict;
use warnings 'all';
use feature 'say';
use Parse::DMIDecode;
my $decoder = Parse::DMIDecode->new;
$decoder->parse(qx{dmidecode});
say $decoder->keyword('system-uuid');
выход
35304535-3439-4344-3232-3245FFFFFFFF