Как сделать так, чтобы каждый экземпляр сценария 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
Другие вопросы по тегам