Как я могу проверить, когда функция была добавлена ​​в Perl? - PullRequest
26 голосов
/ 23 марта 2010

Существуют ли сервисы, подобные codepad , которые позволят вам тестировать конструкции Perl на старых версиях perl?

В идеале, система, в которой вы можете ввести выражение, и оно сообщит вам самую старую версию perl, с которой будет работать.

Конечно, для этого можно использовать CPANTS, но это похоже на злоупотребление службой (хотя бы для увеличения BackPan). И это может занять несколько дней / недель, чтобы получить достойное тестовое покрытие на старых версиях.

Ответы [ 4 ]

23 голосов
/ 23 марта 2010

Вам может пригодиться Perl :: MinimumVersion . Используйте прилагаемую утилиту perlver для сканирования вашего кода.

9 голосов
/ 23 марта 2010

Я думаю, что если бы меня это беспокоило, я бы собрал на своей машине существенные версии Perl и протестировал бы их. На самом деле, это более или менее то, что я делаю в любом случае. Моя машина Solaris 10 имеет:

lrwxrwxrwx   1 jleffler rd            26 Mar  6  2008 v5.10.0 -> v5.10.0-32bit-multiplicity
drwxr-xr-x   3 jleffler rd           512 Jan 10  2008 v5.10.0-32bit
drwxr-xr-x   6 jleffler rd           512 Mar  7  2008 v5.10.0-32bit-multiplicity
drwxr-xr-x   3 jleffler rd           512 Jan 10  2008 v5.10.0-64bit
lrwxrwxrwx   1 jleffler rd            13 Jan 29 21:07 v5.10.1 -> v5.10.1-64bit
drwxr-xr-x   6 jleffler rd           512 Jan 29 21:43 v5.10.1-64bit
drwxr-xr-x   5 jleffler rd           512 May  6  2003 v5.5.3
lrwxrwxrwx   1 jleffler RAND          11 Mar 21  2007 v5.6.1 -> v5.6.1-full
drwxr-xr-x   5 jleffler rd           512 May  6  2003 v5.6.1-full
drwxr-xr-x   5 jleffler rd           512 Feb  5  2008 v5.8.7-multi
lrwxrwxrwx   1 jleffler rd            19 Mar 24  2007 v5.8.8 -> v5.8.8-32bit-sun-cc
drwxr-xr-x   6 jleffler rd           512 Mar 25  2007 v5.8.8-32bit-sun-cc
drwxr-xr-x   5 jleffler rd           512 Feb 13  2006 v5.8.8-64bit-thread-multi
drwxr-xr-x   3 jleffler rd           512 Mar 20  2008 v5.8.8-gcc-3.4.6

Итак, установлено 5.5.3, 5.6.1, 5.8.7, 5.8.8, 5.10.0 и 5.10.1; У меня есть источник для других версий:

-rw-r--r--   1 jleffler rd       2171936 Apr 12  2001 perl-5.004_04.tar.bz2
-rw-r--r--   1 jleffler rd       3023320 Aug 31  1999 perl-5.005_03.tar.bz2
-rw-r--r--   1 jleffler rd       12426022 Dec 18  2007 perl-5.10.0.tar.bz2
-rw-r--r--   1 jleffler rd       11608061 Jan 29 12:32 perl-5.10.1.tar.bz2
-rw-r--r--   1 jleffler rd       4430438 Mar 29  2000 perl-5.6.0.tar.bz2
-rw-r--r--   1 jleffler rd       4864306 Apr  8  2001 perl-5.6.1.tar.bz2
-rw-r--r--   1 jleffler rd       5142605 Aug 16  2005 perl-5.6.2.tar.bz2
-rw-r--r--   1 jleffler rd       8618487 Jul 18  2002 perl-5.8.0.tar.bz2
-rw-------   1 jleffler rd       9410641 Sep 29  2003 perl-5.8.1.tar.bz2
-rw-r--r--   1 jleffler rd       9424944 Nov  5  2003 perl-5.8.2.tar.bz2
-rw-r--r--   1 jleffler rd       9509716 Jan 14  2004 perl-5.8.3.tar.bz2
-rw-r--r--   1 jleffler rd       9598489 Apr 21  2004 perl-5.8.4.tar.bz2
-rw-r--r--   1 jleffler rd       9464689 Jul 19  2004 perl-5.8.5.tar.bz2
-rw-r--r--   1 jleffler rd       9693085 Nov 27  2004 perl-5.8.6.tar.bz2
-rw-r--r--   1 jleffler rd       9839086 Jun 15  2005 perl-5.8.7.tar.bz2
-rw-r--r--   1 jleffler rd       10123359 Feb 13  2006 perl-5.8.8.tar.bz2
-rw-r--r--   1 jleffler rd       11121414 Dec 14  2008 perl-5.8.9.tar.bz2

@ Эфир спросил:

Есть ли у вас сценарий, который будет запускать определенный модуль, сценарий или модульный тест для всех версий в последовательности и сопоставлять результаты? Такая утилита может быть очень полезна как CGI с изолированным / изолированным хранилищем.

Нет, но мне это не нужно. Это в основном тривиально, хотя:

for perl in /usr/perl/v5.*.?
do
    echo $(basename $perl)
    $perl/bin/perl "$@"
done

Обычно для каждого из каталогов Perl в / usr / perl / запускайте perl из каталога bin с заданным набором аргументов. Смотреть вывод ...

Сложность заключается в том, чтобы решить, что составляет "пройти / не пройти". Очевидно, ядро ​​цикла может быть:

    if $perl/bin/perl "$@" >/dev/null 2>&1
    then echo ok $perl
    else echo not ok $perl
    fi

Это слегка похоже на вывод TAP . Чтобы сделать его формально эквивалентным (используя оболочку bash или Korn):

test=0
max=$(ls -d /usr/perl/v5.*.? | wc -l | sed 's/ //g')
echo 1..$max
for perl in /usr/perl/v5.*.?
do
    ((test = test + 1))
    if $perl/bin/perl "$@" >/dev/null 2>&1
    then echo     ok $test - $perl
    else echo not ok $test - $perl
    fi
done

Вот пример запуска:

$ ksh test.perl -e 'exit 0'
1..6
ok 1 - /usr/perl/v5.10.0
ok 2 - /usr/perl/v5.10.1
ok 3 - /usr/perl/v5.5.3
ok 4 - /usr/perl/v5.6.1
ok 5 - /usr/perl/v5.8.8
not ok 6 - /usr/perl/v5.8.8-gcc-3.4.6
$

Это показывает ограничение в сценариях оболочки и их глобальных возможностях (я хотел бы ограничить «звезду» серией цифр). Perl, который терпит неудачу, делает это, потому что каталог bin не содержит копию Perl; Мне нужно было сэкономить место в какой-то момент! Конечно, нетрудно преобразовать сценарий оболочки в сценарий Perl.

5 голосов
/ 23 марта 2010

Если вы ищете, когда модуль был введен в ядро ​​Perl, вы можете использовать Module :: CoreList .

Если вы хотите помочь в разработке такой системы, как codepad для Perl, найдите «PITA testing».

В частности, если вы хотите, чтобы утилита загружала и устанавливала несколько двоичных файлов Perl для проверки вашего кода, вы можете посмотреть программы в PITA-Setup-Perl / bin .

4 голосов
/ 23 марта 2010

Я знаю, что perlcritic способен найти несколько случаев, но в целом вам придется искать его в google или в файлах perldelta. В частности, вы можете посмотреть на дельты для 5.6 5.8 и 5.10 и, возможно, даже предстоящих 5.12

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...