views:

186

answers:

4

Are there any services similar to codepad that will allow you to test Perl constructs on old versions of perl?

Ideally, a system where you could enter an expression and it will tell you the oldest version of perl that it will work with.

Of course it's possible to use CPANTS for this, but that seems like an abuse of the service (if only for making the BackPan bigger). And it could take several days/weeks to get decent test coverage on old versions.

+2  A: 

I know perlcritic is capable of finding a few cases, but in general you will have to look it up in google or in perldelta files. In particular, you may want to look at the deltas for 5.6 5.8 and 5.10 and maybe even the upcoming 5.12

Leon Timmermans
+3  A: 

If you're looking for when a module was introduced to core Perl, you can use Module::CoreList.

If you'd like to help develop a system like codepad for Perl, search for "PITA testing".

Specifically, if you want a utility to download and install a number of Perl binaries to test your code, you can look at the programs in PITA-Setup-Perl/bin.

sachmet
I find `corelist` very useful, but unfortunately it does not state which *version* of a module shipped with each perl distribution. e.g. recently I was making use of some newish features in Hash::Util as described in the perldoc.perl.org documentation, only to discover later that the interface I wanted to use didn't appear until after the version (0.05) that shipped with the Perl version I use in production (5.8.5). :(
Ether
Module::CoreList has the version info.
brian d foy
+18  A: 

You might find Perl::MinimumVersion helpful. Use the provided perlver utility to scan your code.

daotoad
+1 Excellent recommendation.
Sinan Ünür
+1 from me too.
Leon Timmermans
+1 this is rather awesome!
rjh
Just note that Perl::MinimumVersion is very limited. It might help you find the minimum version if the source code already gives hints, but it's not very good at figuring it out without the hints. It's also very poor for detecting the perl version based on regex features.
brian d foy
+7  A: 

I think that if I was concerned, I'd build salient versions of Perl on my machine and test them. Actually, that's more or less what I do anyway. My Solaris 10 machine has:

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

So, that's 5.5.3, 5.6.1, 5.8.7, 5.8.8, 5.10.0 and 5.10.1 installed; I have the source for other versions too:

-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 asked:

Do you have a script which will run a particular module, script or unit test against all versions in sequence and collate the results? Such a utility might be really handy as a chrooted/sandboxed CGI.

No, but I haven't needed it. It's basically trivially, though:

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

Basically, for each of the Perl directories in /usr/perl/, run the perl from the bin directory on the given set of arguments. Watch the output...

The difficulty is in deciding what constitutes pass/fail. Obviously, the core of the loop could be:

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

That's faintly similar to the TAP output. To make it formally equivalent (using bash or Korn shell):

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

Here's an example of running it:

$ 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
$

That shows a limitation in shell scripts and their globbing facilities (I'd like to limit the 'star' to a series of digits). The Perl that fails does so because the bin directory doesn't contain a copy of Perl; I needed to save space at some point! It would not be hard to convert the shell script into a Perl script, of course.

Jonathan Leffler
That's an impressive list! Do you have a script which will run a particular module, script or unit test against all versions in sequence and collate the results? Such a utility might be really handy as a chrooted/sandboxed CGI.
Ether
Also see my post in The Effective Perler: http://www.effectiveperlprogramming.com/blog/92
brian d foy
@brian d foy: Interesting article. I employ a loosely equivalent system for the Perl, Python, GCC, Tcl/Tk, Git, OpenSSL, and (somewhat more extensively still) for the Informix products I work on as well as with. The Informix stuff is confusing because I have to deal with 32-bit vs 64-bit environments too.
Jonathan Leffler
@Ether: There is a script that does what you ask. I think it's part of Devel::PPPort!
tsee