Версия версии Perl: зачем использовать EVAL EXPR?
Я просто обратил внимание на это, сгенерированное Catalyst.pl
. Это, очевидно, какой-то неуключенный хак. В чем преимущество создания такой строки версии? Я даже не могу понять, что они пытаются сделать.
our $VERSION = '0.01';
$VERSION = eval $VERSION;
Ответы
Ответ 1
Номера версий сложны в Perl. Здесь отличный обзор для тех, кто ищет детали gory. Это может удивить вас, как много тонких способов найти что-то неправильно...
Прямой ответ на ваш вопрос, однако, заключается в том, что разные вещи ожидают разные форматы. Для CPAN вы заботитесь о версиях разработки, например, в виде строки. Для времени выполнения вы заботитесь о них как о числе.
Рассмотрим случай $VERSION = "0.01_001"
. eval
правильно преобразует его в число 0.01001
.
Ответ 2
От perlmodstyle: нумерация версий
Если вы хотите выпустить "бета" или альфа-версия модуля, но не хотите, чтобы CPAN.pm перечислил его как последнее используйте "_" после обычной версии число, за которым следует как минимум 2 цифры, например. 1.20_01. Если вы сделаете это, рекомендуется следующая идиома:
- $VERSION = "1.12_01";
- $XS_VERSION = $VERSION; # необходимо только, если у вас есть код XS
- $VERSION = eval $VERSION;
С этим трюком MakeMaker будет только прочитайте первую строку и, таким образом, прочитайте подчеркивание, в то время как интерпретатор perl будет оценивать $VERSION и конвертировать строка в число. Позже операции, которые обрабатывают $VERSION как число сможет сделать это не вызывая предупреждения о $VERSION не является числом.
Ответ 3
eval преобразует строку "0.001_001"
в число, следуя правилам для числовых литералов Perl (которые позволяют подчеркивать для удобочитаемости). Результатом является число 0.001001
.
Без eval строка преобразуется в число, следующее за правилом преобразования строк, которое останавливается у первого нечислового символа.
Например: perl -e 'print "0.001_001" + 0'
Ответ 4
Возможно, я ошибаюсь, но я думаю, что некоторые автоматизированные анализаторы кода любят видеть строку кода:
our $VERSION = '0.01';
Но вы действительно хотите, чтобы $VERSION удерживала float вместо строки.
Возможно, вы захотите прочитать в этой статье, я знаю, что собираюсь.
О, дорогой бог, теперь я помню, почему я использую
our $VERSION = 20100903;
номера версий стиля. Это просто безумие. Я люблю Perl, но это чистое, изысканное, сконцентрированное безумие. Я не буду пытаться обобщить статью Дэвида Голда. Вам просто нужно прочитать и заплакать.