首先,5.32 和 7.0 是 Perl 的两个不同版本。后者会在前者的基础上,但会有所不同,目前还没有发布。
您没有更改您的PATH,因此/usr/bin/perl 仍然是您使用perl 时找到的perl。
您可以提供您安装的perl ($HOME/localperl/bin/perl) 的路径,或者您可以调整您的PATH 以便在/usr/bin 之前找到$HOME/localperl/bin。
我使用perlbrew 安装了额外的 Perl 副本。它可以帮助您安装 Perl,并且只需键入 perl 即可轻松更改使用的 Perl。
$ perlbrew use 5.30t
$ perl -v | grep 'This is'
This is perl 5, version 30, subversion 2 (v5.30.2) built for x86_64-linux-thread-multi
$ perlbrew use 5.28t
$ perl -v | grep 'This is'
This is perl 5, version 28, subversion 2 (v5.28.2) built for x86_64-linux-thread-multi
我的设置:
$ \ls -Fl "${PERLBREW_ROOT:-$HOME/perl5/perlbrew}"/perls # Output rearranged.
total 0
drwx------ 1 ikegami ikegami 4096 Mar 15 20:32 system/
drwxr-xr-x 1 ikegami ikegami 4096 May 22 14:12 5.10.1t/
lrwxrwxrwx 1 ikegami ikegami 7 May 23 13:41 5.10t -> 5.10.1t/
drwxr-xr-x 1 ikegami ikegami 4096 May 22 14:51 5.12.5t/
lrwxrwxrwx 1 ikegami ikegami 7 May 23 13:42 5.12t -> 5.12.5t/
drwxr-xr-x 1 ikegami ikegami 4096 May 22 16:39 5.14.4t/
lrwxrwxrwx 1 ikegami ikegami 7 May 23 13:42 5.14t -> 5.14.4t/
drwxr-xr-x 1 ikegami ikegami 4096 May 23 12:58 5.16.3t/
lrwxrwxrwx 1 ikegami ikegami 7 May 23 13:42 5.16t -> 5.16.3t/
drwxr-xr-x 1 ikegami ikegami 4096 May 23 16:45 5.18.4t/
lrwxrwxrwx 1 ikegami ikegami 7 May 23 13:42 5.18t -> 5.18.4t/
drwxr-xr-x 1 ikegami ikegami 4096 May 24 13:44 5.20.3t/
lrwxrwxrwx 1 ikegami ikegami 7 May 23 13:42 5.20t -> 5.20.3t/
drwxr-xr-x 1 ikegami ikegami 4096 May 24 16:41 5.22.4t/
lrwxrwxrwx 1 ikegami ikegami 7 May 23 13:42 5.22t -> 5.22.4t/
drwxr-xr-x 1 ikegami ikegami 4096 May 24 21:41 5.24.4t/
lrwxrwxrwx 1 ikegami ikegami 7 May 23 13:43 5.24t -> 5.24.4t/
drwxr-xr-x 1 ikegami ikegami 4096 May 25 11:11 5.26.3t/
lrwxrwxrwx 1 ikegami ikegami 7 May 23 13:43 5.26t -> 5.26.3t/
drwxr-xr-x 1 ikegami ikegami 4096 May 26 11:20 5.28.2t/
lrwxrwxrwx 1 ikegami ikegami 7 May 23 13:43 5.28t -> 5.28.2t/
drwxr-xr-x 1 ikegami ikegami 4096 May 23 13:44 5.30.2t/
lrwxrwxrwx 1 ikegami ikegami 7 Mar 15 17:26 5.30t -> 5.30.2t/
lrwxrwxrwx 1 ikegami ikegami 7 Mar 15 17:26 latest -> 5.30.2t/
lrwxrwxrwx 1 ikegami ikegami 7 Apr 19 22:56 acpcw -> 5.30.2t/
lrwxrwxrwx 1 ikegami ikegami 7 Apr 2 18:32 gloomhaven -> 5.30.2t/
...
- “t”代表“线程”。
- 我为每个项目创建符号链接,并在 shebang 行中使用此符号链接。这样,我可以轻松切换项目使用的
perl(通过更改符号链接)。 perlbrew alias 可用于创建这些符号链接。
- 我为 5.##t 创建了指向该版本的最新构建的符号链接,因此我可以通过
perlbrew use 5.20t(例如)获取该构建的最新维护版本。 perlbrew alias 可用于创建这些符号链接。
- 我创建了一个名为
system 的符号链接,这样我就可以使用perlbrew use system 来使用系统Perl。 perlbrew off 和 perlbrew switch-off 现在可以代替这个,但我还是更喜欢符号链接。
我使用以下工具安装新版本的 Perl:
#!/usr/bin/env perl
use strict;
use warnings;
use File::Basename qw( basename );
use Getopt::Long qw( );
# -----
sub help {
my $script_file = basename($0);
print(<<"__EOI__");
Creates a perlbrew install of the specified version of Perl.
Optionally, it will also install modules from CPAN afterwards.
Usage:
$script_file --help
$script_file [OPTIONS] BUILD [MODULES]
Builds:
5.x.y
5.x.yd Build with debug symbols (-g)
5.x.yt Build with thread support
5.x.ydt Build with debug symbols (-g) and thread support
options:
-n Skip tests
__EOI__
exit(0);
}
sub usage_error {
my $script_file = basename($0);
print(STDERR $_[0]) if @_;
print(STDERR "Use $script_file --help to display usage\n");
exit(1);
}
sub parse_args {
my $getopt = Getopt::Long::Parser->new(
config => [qw(
posix_default
)],
);
my %opts = (
threaded => undef,
debug => undef,
no_tests => 0,
);
$getopt->getoptions(
'help|h|?' => \&help,
'n!' => \$opts{no_tests},
)
or usage_error();
@ARGV >= 1
or usage_error("Insufficient arguments\n");
my $build = shift(@ARGV);
my $version = $build;
$opts{threaded} = $version =~ s/t\z//;
$opts{debug } = $version =~ s/d\z//;
$version =~ /^5\.[1-9][0-9]*\.(?:0|[1-9][0-9]*)\z/
or usage_error("Invalid version format\n");
return ($build, $version, \%opts, @ARGV);
}
# -----
sub systemx {
my ($cmd, @args) = @_;
system { $cmd } $cmd, @args;
die("Can't run \"$cmd\": $!\n") if $? == -1;
die("\"$cmd\" killed by signal ".($? & 0x7F)."\n") if $? & 0x7F;
die("\"$cmd\" exited with error ".($? >> 8)."\n") if $? >> 8;
}
sub perlbrew_install {
my ($build, $version, $opts) = @_;
my $perlbrew_root = $ENV{PERLBREW_ROOT} || "$ENV{HOME}/perl5/perlbrew";
unlink("$perlbrew_root/build.log");
my @args;
push @args, "-v";
push @args, "-n" if $opts->{no_tests};
push @args, $version;
push @args, "--as=$build";
push @args, "-DPERL_SUB_DEPTH_WARN=1000";
push @args, "-Doptimize=-g" if $opts->{debug};
push @args, "-Dusethreads" if $opts->{threaded};
systemx("perlbrew", "install", @args);
}
sub module_install {
my ($build, @modules) = @_;
return if !@modules;
systemx('sh', '-c', 'perlbrew use "${@:1:1}" && cpan -- "${@:2}"', 'dummy', $build, @modules);
}
sub main {
my ($build, $version, $opts, @modules) = @_;
perlbrew_install($build, $version, $opts);
module_install($build, @modules);
}
main(parse_args());