Могу ли я убедиться, что код Perl, написанный на 5.10+, будет работать на 5.8? - PullRequest
7 голосов
/ 21 июля 2010

Некоторые из новых функций Perl 5.10 и 5.12, такие как «say», определены как функции, которые вы можете явно включить или запретить с помощью прагмы «feature».Но другие добавления, такие как именованные группы захвата регулярных выражений, являются неявными.

Когда я пишу Perl с использованием интерпретатора 5.10+, но хочу, чтобы он также работал на 5.8, я могу заставить Perl жаловаться на использование чего-либо, что не являетсяв 5,8?Очевидно, что рекомендуется проверять ваш код на всех основных версиях, на которых вы собираетесь его запускать, но было бы неплохо, чтобы Perl автоматически предупреждал меня.

Ответы [ 3 ]

9 голосов
/ 21 июля 2010

Когда я хочу убедиться, что программа будет работать под определенными версиями perl, я тестирую ее под этой версией perl.Особенность моего выпуска приложения тестирует под несколькими Perl-файлами перед его фактической загрузкой.

Для этого требуется наличие надлежащего набора тестов и написание достаточного количества тестов.Также легко поддерживать несколько отдельных установок Perl одновременно, как я показываю в Эффективное программирование на Perl .

Test :: MinimumVersion почти звучит так, как можетработать, но у него есть несколько ограничений.Он только смотрит на файл, который вы ему даете (поэтому он не будет проверять все, что вы загружаете), и я не думаю, что он на самом деле просматривает шаблоны регулярных выражений.Каждый из этих отчетов сообщает, что минимальная версия - 5.004, что не соответствует ни одному из них:

#!perl

use Perl::MinimumVersion;

my $p_flag = <<'SOURCE';
'123' =~ m/[123]/p; # 5.10 feature
SOURCE

my $named_capture = <<'SOURCE';
'123' =~ m/(?<num>[123])/; # 5.10 feature
SOURCE

my $r_line_ending = <<'SOURCE';
'123' =~ m/[123]\R/p; # 5.12 feature
SOURCE

my $say = <<'SOURCE';
say 'Hello';
SOURCE

my $smart_match = <<'SOURCE';
$boolean = '123' ~~ @array;
SOURCE

my $given = <<'SOURCE';
given( $foo ) {
    when( /123/ ) { say 'Hello' }
    };

SOURCE

foreach my $source ( $p_flag, $named_capture, $r_line_ending, $say, $smart_match, $given ) {
    print "----Source---\n$source\n-----";
    my $version = Perl::MinimumVersion->new( \$source  )->minimum_version;
    print "Min version is $version\n";
    }

Часть причины Perl :: MinimumVersion работает потому, что ищет подсказкичто источник уже дает его, например use 5.010 и use feature и так далее.Однако это не единственный способ включить функции.И, как вы заметите, он пропускает такие вещи, как флаг /p, по крайней мере, пока кто-то не добавит проверку на это.Тем не менее, вы всегда будете преследовать такие вещи с помощью решения PPI .

Проще просто скомпилировать его, запустить тесты и выяснить.

4 голосов
/ 21 июля 2010

Я не думаю, что вы можете сделать проверку Perl при запуске кода, но проверить Perl :: MinimumVersion и Test :: MinimumVersion . (Последний является просто оболочкой Test :: Builder вокруг первого.)

1 голос
/ 21 июля 2010

Хорошо, прочитав другие ответы, ваш ответ - нет, но, возможно, App :: perlbrew может помочь вам установить и управлять несколькими версиями perl для тестирования.

...