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

StackOverflow https://stackoverflow.com/questions/3301082

  •  26-09-2020
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

Тест::МинимумВерсия звучит почти так, как будто это может сработать, но у него есть несколько ограничений.Он просматривает только файл, который вы ему даете (поэтому он не проверяет ничего, что вы загружаете), и я не думаю, что он на самом деле просматривает шаблоны регулярных выражений.Каждый из них сообщает, что минимальная версия — 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 флаг, по крайней мере, пока кто-нибудь не добавит для этого проверку.Однако вы всегда будете гоняться за такими вещами с помощью ИЦП решение.

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

Другие советы

Я не думаю, что вы можете сделать проверку Perl, когда вы запускаете код, но Проверьте perl :: minmerversion и TEST :: Minmicerversion .(Последнее это просто test :: builder обертка вокруг первого.) .

Хорошо от чтения Другие ответы Ваш ответ нет, но, возможно, Приложение :: Перлльбирит может помочь вам установить и управлять несколькими версиями Perl для тестирования.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top