如何在 perlbrew 中显示所有可用的 perl?

How to display all available perls in perlbrew?

我可以通过 perlbrew available

列出所有可用的 perls
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   

但是这个列表只包含 latest 个可用的 perls。例如,我没有从这个列表中看到当前安装的 perl from perlbrew

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

我试过 perlbrew available --verbose 但这不是 full 列表:

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>

是否有显示所有可用 perls 的选项?

根据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.

所以你可以使用:

$ perlbrew available --all

perlbrew available --all 可用于列出所有可用版本。

但这实际上没有用。这将包括以下附加版本:

  • 开发版本
    也许您想使用最新的开发版本测试您的代码。
    很难在 --all 中发现它;您最好访问 this 并单击版本前的“v”箭头。
  • 候选发布
    也许您想使用最新的候选发布来测试您的代码。
    很难在 --all 中发现它;您最好访问 this 并单击版本前的“v”箭头。
  • 较早的次要版本
    没有理由列出这些,因为次要版本从 0 单调增加。因此,如果您知道次要版本 .4 存在(来自 perlbrew available),那么您就知道 .3、.2、.1 和 .0 也存在。

也就是说,OP 在评论中建议他们实际上想要一个 已安装 版本的列表。

perlbrew 没有提供获取它的方法。该版本通常用作安装名称的一部分,因此您 perlbrew list 可用于近似。

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

但是如您所见,它并不总是有效。我目前正在使用一个叫 latest 的东西,它没有给我一个版本。

要获取实际列表,您可以使用以下方法:

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} });
}

输出:

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

以上程序不处理不支持 $^V 的 Perl 版本,但使用 $] < ... ? $] : eval('$^V').

很容易处理

上述程序也可以修改为按线程支持、arch 等分组