Ответ 1
Вы можете найти Perl::MinimumVersion. Используйте программу perlver для сканирования кода.
Существуют ли какие-либо службы, похожие на codepad, которые позволят вам тестировать конструкции Perl в старых версиях perl?
В идеале, система, в которой вы можете ввести выражение, и сообщит вам самую старую версию perl, с которой она будет работать.
Конечно, для этого можно использовать CPANTS, но это похоже на злоупотребление службой (хотя бы для того, чтобы сделать BackPan больше). И это может занять несколько дней/недель, чтобы получить достойное тестирование на старых версиях.
Вы можете найти Perl::MinimumVersion. Используйте программу perlver для сканирования кода.
Я думаю, что если бы меня это беспокоило, я бы построил на моей машине выдающиеся версии 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
@Ether спросил:
У вас есть script, который будет запускать определенный модуль, script или unit test для всех версий в последовательности и сопоставлять результаты? Такая утилита может быть действительно удобна как CGI с chrooted/sandboxed.
Нет, но я не нуждался в этом. Это в основном тривиально, хотя:
for perl in /usr/perl/v5.*.?
do
echo $(basename $perl)
$perl/bin/perl "[email protected]"
done
В принципе, для каждой из Perl-каталогов в/usr/perl/запустите perl из каталога bin по заданному набору аргументов. Смотрите выход...
Трудность заключается в том, чтобы решить, что представляет собой пропуск/отказ. Очевидно, что ядром цикла может быть:
if $perl/bin/perl "[email protected]" >/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 "[email protected]" >/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; Мне нужно было сэкономить место в какой-то момент! Нетрудно было бы преобразовать оболочку script в Perl script, конечно.
Я знаю, что perlcritic способен находить несколько случаев, но в целом вам придется искать его в google или в perldelta файлах. В частности, вы можете посмотреть дельта для 5.6 5.8 и 5.10 и, возможно, даже предстоящий 5.12
Если вы ищете, когда модуль был введен в ядро Perl, вы можете использовать Module::CoreList.
Если вы хотите помочь создать систему, например codepad для Perl, найдите "PITA testing".
В частности, если вы хотите, чтобы утилита загружала и устанавливала несколько бинарных файлов Perl для проверки вашего кода, вы можете посмотреть программы в PITA-Setup-Perl/bin.