How to display all available perls in perlbrew?

622 Views Asked by At

I can list all available perls via perlbrew available

kes@kes-X751SA ~ $ pb available

   perl-5.32.0   
   perl-5.30.3   
   perl-5.28.3   
   perl-5.26.3   
   perl-5.24.4   
   perl-5.22.4   
   perl-5.20.3   
   perl-5.18.4   
   perl-5.16.3   
   perl-5.14.4   
   perl-5.12.5   
   perl-5.10.1   
    perl-5.8.9   
    perl-5.6.2   
  perl5.005_03   
  perl5.004_05   
  cperl-5.29.2   
  cperl-5.30.0   
  cperl-5.30.0-RC1   

But this list only contain latest available perls. For example I did not see from this list currently installed perl from perlbrew

kes@kes-X751SA ~ $ which perl
/home/kes/perl5/perlbrew/perls/perl-5.24.1/bin/perl

I have tried perlbrew available --verbose but this is not the full list:

kes@kes-X751SA ~ $ pb available --verbose

   perl-5.32.0  available from  <https://www.cpan.org/src/5.0/perl-5.32.0.tar.gz>
   perl-5.30.3  available from  <https://www.cpan.org/src/5.0/perl-5.30.3.tar.gz>
   perl-5.28.3  available from  <https://www.cpan.org/src/5.0/perl-5.28.3.tar.gz>
   perl-5.26.3  available from  <https://www.cpan.org/src/5.0/perl-5.26.3.tar.bz2>
   perl-5.24.4  available from  <https://www.cpan.org/src/5.0/perl-5.24.4.tar.gz>
   perl-5.22.4  available from  <https://www.cpan.org/src/5.0/perl-5.22.4.tar.bz2>
   perl-5.20.3  available from  <https://www.cpan.org/src/5.0/perl-5.20.3.tar.bz2>
   perl-5.18.4  available from  <https://www.cpan.org/src/5.0/perl-5.18.4.tar.bz2>
   perl-5.16.3  available from  <https://www.cpan.org/src/5.0/perl-5.16.3.tar.bz2>
   perl-5.14.4  available from  <https://www.cpan.org/src/5.0/perl-5.14.4.tar.bz2>
   perl-5.12.5  available from  <https://www.cpan.org/src/5.0/perl-5.12.5.tar.bz2>
   perl-5.10.1  available from  <https://www.cpan.org/src/5.0/perl-5.10.1.tar.bz2>
    perl-5.8.9  available from  <https://www.cpan.org/src/5.0/perl-5.8.9.tar.bz2>
    perl-5.6.2  available from  <https://www.cpan.org/src/5.0/perl-5.6.2.tar.gz>
  perl5.005_03  available from  <https://www.cpan.org/src/5.0/perl5.005_03.tar.gz>
  perl5.004_05  available from  <https://www.cpan.org/src/5.0/perl5.004_05.tar.gz>
  cperl-5.29.2  available from  <https://github.com/perl11/cperl/archive/cperl-5.29.2.tar.gz>
  cperl-5.30.0-RC1  available from  <https://github.com/perl11/cperl/archive/cperl-5.30.0-RC1.tar.gz>
  cperl-5.30.0  available from  <https://github.com/perl11/cperl/archive/cperl-5.30.0.tar.gz>

Is there an option which displays all available perls?

2

There are 2 best solutions below

0
On BEST ANSWER

According to the documentation:

Usage: perlbrew available [--all]

List the recently available versions of perl on CPAN.

The list is retrieved from the web page http://www.cpan.org/src/README.html, and is not the list of all perl versions ever released in the past.

To get a list of all perls ever released, use the --all option.

so you can use:

$ perlbrew available --all
0
On

perlbrew available --all can be used to list all available releases.

But this isn't actually useful. This will include the following additional versions:

  • Development release
    Maybe you want to test your code using the latest dev release.
    It'll be hard to spot in --all; you'd be better off visiting this and clicking the "v" arrow before the version.
  • Release candidates
    Maybe you want to test your code using the latest release candidate.
    It'll be hard to spot in --all; you'd be better off visiting this and clicking the "v" arrow before the version.
  • Earlier minor versions
    There's no reason to lists these because minor versions monotonously increase from 0. So if you know minor version .4 exists (from perlbrew available), then you know .3, .2, .1 and .0 also exist.

That said, the OP suggested in the comments that they actually want a list of installed versions.

perlbrew doesn't provide a means to get that. The version is usually used as part of the name of the install, so you perlbrew list could be used to approximate that.

  5.32.0t
  5.32t
* latest
  5.30.2t
  5.30t
  acpcw
  gloomhaven
  5.28.2t
  5.28t
  ...

But as you can see, it doesn't always work. I'm currently using something call latest, which doesn't get me a version.

To get the actual list, you can use the following:

use 5.014;
use warnings;

use IPC::System::Simple qw( capturex );
use Sort::Key::Natural  qw( natsort rnatsort );

my $root_dir_qfn = $ENV{PERLBREW_ROOT} // "$ENV{HOME}/perl5/perlbrew";   # "
my $perls_dir_qfn = "$root_dir_qfn/perls";

opendir(my $dh, $perls_dir_qfn)
   or die("Can't open dir \"$perls_dir_qfn\": $!\n");

my %versions;
while (defined( my $name = readdir($dh) )) {
   next if $name =~ /^\./;

   my $perl_dir_qfn = "$perls_dir_qfn/$name";
   eval {
      my $version = capturex("$perl_dir_qfn/bin/perl", "-e", 'print $^V');
      die "Program exited with error ".( $? >> 8 )."\n" if $?;
      push @{ $versions{$version} }, $name;
      return 1;  # No exception.
   }
      or warn("Can't get version for \"$name\": $@");
}

for my $version (rnatsort keys(%versions)) {
   say "$version: " . join(" ", natsort @{ $versions{$version} });
}

Output:

v5.32.0: 5.32.0t 5.32t latest
v5.30.2: 5.30.2t 5.30t acpcw gloomhaven
v5.28.2: 5.28.2t 5.28t
v5.26.3: 5.26.3t 5.26t
v5.26.1: system
v5.24.4: 5.24.4t 5.24t
v5.22.4: 5.22.4t 5.22t
v5.20.3: 5.20.3t 5.20t
v5.18.4: 5.18.4t 5.18t
v5.16.3: 5.16.3t 5.16t
v5.14.4: 5.14.4t 5.14t
v5.12.5: 5.12.5t 5.12t
v5.10.1: 5.10.1t 5.10t

The above program doesn't handle versions of Perl that don't support $^V, but that's easy to handle by using $] < ... ? $] : eval('$^V').

The above program could also be modified to group by thread support, arch, etc.