eval $VERSION

31 мар 2015 17:07


Часто встречал в модулях подобную запись

our $VERSION = '1.200';
$VERSION = eval $VERSION;

Только не было понятно зачем нужен eval. Как оказалось, это задокументированная фича . Такие сборочные утилиты, как ExtUtils::MakeMaker ищут лишь первую строку с $VERSION, чтобы извлечь информацию о версии модуля. Сам же модуль может в последующем использовать числовое представление версии, которое преобразуется из строки с помощью eval.

С одной стороны, если версия это строка 1.200, то явное преобразование не требуется, но если это бета-версия, например, 1.199_01, то попытка использования такой строки в числовом выражении будет выводить предупреждение:

$ perl -we 'our $VERSION="1.199_01"; my $newer_than_1_2 = $VERSION > 1.2;'
 
Argument "1.199_01" isn't numeric in numeric gt (>) at -e line 1

Вызов eval как раз и решает подобную проблему.

↓↓↓↓↓↓↓↓

Теги: perl eval


Комментарии (2)

ivanych

2015-04-01 17:09

$ perl -we 'our $VERSION=1.199_01; my $newer_than_1_2 = $VERSION > 1.2;'
$

Достаточно не писать лишних кавычек.


crux

2015-04-07 16:02

> $ perl -we 'our $VERSION=1.199_01; my $newer_than_1_2 = $VERSION > 1.2;'
> $
>
> Достаточно не писать лишних кавычек.

Проблема в том, что тогда ExtUtils::MakeMaker тоже получит числовое значение 1.19901 и не поймёт, что это бета-версия модуля. CPAN.pm также будет считать, что это последняя версия и будет её ставить по умолчанию вопреки задумке автора модуля.


Оставить комментарий