【问题标题】:Perl v5.32 Installation in CentOS在 CentOS 中安装 Perl v5.32
【发布时间】:2020-06-28 17:49:26
【问题描述】:

我的 Oracle VM VirtualBox 中安装了 Centos 8(64 位)。

当我在云端会议中听到有关 Perl 7 发布的消息时!一个 Perl 和 Raku Conf,渴望在我的 CentOS 中安装它。

我尝试按照CPAN官网中提到的命令安装(作为root)Perl v5.32。

wget https://www.cpan.org/src/5.0/perl-5.32.0.tar.gz
tar -xzf perl-5.32.0.tar.gz
cd perl-5.32.0
./Configure -des -Dprefix=$HOME/localperl
make
make test
make install

之前我的系统中安装了Perl v5.26。

[vinod@localhost ~]$ perl -v

This is perl 5, version 26, subversion 3 (v5.26.3) built for x86_64-linux-thread-multi
(with 51 registered patches, see perl -V for more detail)

Copyright 1987-2018, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

即使按照上述步骤升级Perl版本,我也没有成功。

当我在运行上述命令后检查版本时,它仍然显示Perl v5.26。

我想知道,是我做错了什么,还是运行命令获取升级版 Perl 不是正确的方法。

【问题讨论】:

  • perl -V 显示什么?请注意,您在 $HOME/localperl 中安装了 5.32
  • perl -V 显示:[vinod@localhost ~]$ perl -V Summary of my perl5 (revision 5 version 26 subversion 3) configuration:....... 是的,我可以在 /home/vinod/localperl 中看到 lib,bin,man。
  • 拥有多个 Perls 的一个非常好的方法是 perlbrew
  • @HåkonHægland 当然。按照 zdim 的建议,让我尝试使用perlbrew 安装它,然后在这里通知您。
  • 澄清一下,Perl 7 还没有发布,而且它不是 v5.32。它的语法与 v5.32 相同,但语句不同。

标签: linux perl centos


【解决方案1】:

首先,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());

【讨论】:

  • 谢谢。我同意我在安装时没有提供正确的路径。
  • 我没有说过类似的话。
  • ...不过,既然您提到了,使用允许安装多个本地 perl 的命名方案会很好。
  • 将我的设置添加到我的答案中。
猜你喜欢
  • 2012-07-30
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
相关资源
最近更新 更多