Могу ли я убедиться, что код Perl, написанный на 5.10+, будет работать на 5.8?
Некоторые из новых функций Perl 5.10 и 5.12, такие как "say", определены как функции, которые вы можете явно включить или отключить с помощью прагмы "feature". Но другие дополнения, такие как именованные группы захвата регулярных выражений, являются неявными.
Когда я пишу Perl с использованием интерпретатора 5.10+, но хочу, чтобы он также работал на 5.8, могу ли я заставить Perl жаловаться на использование чего-либо, чего нет в 5.8? Очевидно, что хорошей практикой является тестирование вашего кода на всех основных версиях, на которых вы собираетесь его запускать, но было бы хорошо, если бы Perl автоматически предупреждал меня.
3 ответа
Когда я хочу убедиться, что программа будет работать под определенными версиями 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.
Проще просто скомпилировать, запустить тесты и выяснить.
Я не думаю, что вы можете сделать проверку Perl при запуске кода, но посмотрите Perl:: MinimumVersion и Test:: MinimumVersion. (Последний - просто оболочка Test:: Builder вокруг первого.)
Из прочтения других ответов ваш ответ отрицательный, но, возможно, App::perlbrew поможет вам установить и управлять несколькими версиями perl для тестирования.