Версия Perl: зачем использовать EVAL EXPR? - PullRequest
20 голосов
/ 04 сентября 2010

Я только что заметил это сгенерированный Catalyst.pl. Это явно какой-то аннотированный хак. В чем преимущество настройки строки версии, подобной этой? Я даже не могу понять, что они пытаются сделать.

our $VERSION = '0.01';
$VERSION = eval $VERSION;

Ответы [ 4 ]

25 голосов
/ 04 сентября 2010

Номера версий сложны в Perl. Вот отличный обзор для тех, кто ищет кровные детали. Вас может удивить, как много хитрых способов ошибиться ...

Прямой ответ на ваш вопрос заключается в том, что разные вещи ожидают разных форматов. Для CPAN вы заботитесь о версиях разработки, например, в виде строки. Что касается времени выполнения, вы заботитесь о них как о числе.

Рассмотрим случай $VERSION = "0.01_001". eval преобразует его в число 0.01001 правильно.

12 голосов
/ 04 сентября 2010

С perlmodstyle: нумерация версий

Если вы хотите выпустить «бета» или Альфа-версия модуля, но не хочу, чтобы CPAN.pm указывал его как самый последний используйте '_' после обычной версии номер, за которым следуют как минимум 2 цифры, например. 1.20_01. Если вы сделаете это, то Рекомендуется следующая идиома:

  1. $ VERSION = "1.12_01";
  2. $ XS_VERSION = $ VERSION; # требуется только если у вас есть код XS
  3. $ VERSION = eval $ VERSION;

С этим трюком MakeMaker будет только прочитайте первую строку и, таким образом, прочитайте подчеркнуть, в то время как интерпретатор Perl оценит $ VERSION и конвертирует строка в число. Потом операции, которые рассматривают $ VERSION как номер тогда сможет сделать это не провоцируя предупреждение о $ VERSION не является числом.

6 голосов
/ 04 сентября 2010

eval преобразует строку "0.001_001" в число, следуя правилам для числовых литералов Perl (которые допускают подчеркивание для удобочитаемости). Результатом является число 0.001001.

Без eval строка преобразуется в число, соответствующее правилу преобразования строк, которое останавливается на первом нечисловом символе.

Например: perl -e 'print "0.001_001" + 0'

5 голосов
/ 04 сентября 2010

Возможно, я запоминаю это, но я думаю, что некоторые автоматические парсеры кода любят видеть строку кода:

 our $VERSION = '0.01';

Но вы действительно хотите, чтобы $ VERSION содержал число с плавающей точкой вместо строки.

Вы можете прочитать эту статью , я знаю, что собираюсь.

О, Боже мой, теперь я помню, почему я использую

our $VERSION = 20100903;

номера версий в стиле. Это просто безумие. Я люблю Perl, но это чистое, утонченное, концентрированное безумие. Я не буду пытаться резюмировать статью Дэвида Голдена. Вы просто должны прочитать это и плакать.

...