Подтвердить что ты не робот

Версия версии Perl: зачем использовать EVAL EXPR?

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

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

Ответ 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, но это чистое, изысканное, сконцентрированное безумие. Я не буду пытаться обобщить статью Дэвида Голда. Вам просто нужно прочитать и заплакать.