Для разработки я устанавливаю свой собственный Perl и оставляю систему Perl в покое. Если я хочу обновить системный Perl, я использую диспетчер системных пакетов. Для разработки Perl я использую инструмент cpan.
Поскольку я держу их отдельно, я никогда не должен испортить Perl, который необходим системе для задач обслуживания и т. Д., Но мне не нужно полагаться на решения системы при разработке.
Очень легко установить отдельные Perls. Когда вы запустите Configure из исходного дистрибутива, он спросит вас, куда вы хотите установить все. Дайте ему любой путь, который вам нравится. Например, у меня установлено много Perls в / usr / local / perls , и все для каждой установки живет отдельно. Затем я создаю для них символические ссылки в / usr / local / bin (например, perl5.8.9, perl.5.10.0, perl5.10.0-thread). Когда я хочу конкретную версию, я просто использую ту, которая мне нужна:
$ perl5.10.0 program.pl
Определенный двоичный файл гарантирует, что программа выберет правильный путь поиска модуля и т. Д. (Это то же самое, что и модуль Config.pm для этого двоичного файла).
Вот скрипт, который я использую для создания символических ссылок. Он просматривает каталог bin, определяет версию Perl и создает ссылки типа cpan5.10.1
и так далее. Каждая программа уже знает правильный Perl для вызова:
#!perl
use 5.010;
use strict;
use warnings;
use File::Basename;
use File::Spec::Functions;
my $perls_directory = catfile(
$ARGV[0] // '/usr/local/perls',
'perl*'
);
die "$perls_directory does not exist!\n"
unless -d dirname $perls_directory;
my $links_directory = $ARGV[1] // catfile( $ENV{HOME}, 'bin' ); #/
die "$links_directory does not exist!\n" unless -d $links_directory;
foreach my $directory ( glob( $perls_directory ) )
{
say "Processing $directory...";
unless( -e catfile( $directory, 'bin' ) )
{
say "\tNo bin/ directory. Skipping!";
next;
}
my @perls = glob( catfile( $directory, qw( bin perl5* ) ) );
my( $perl_version ) = $perls[0] =~ m/(5\.\d+\.\d+)\z/;
say "\tperl version is $perl_version";
foreach my $bin ( glob( catfile( $directory, 'bin', '*' ) ) )
{
say "\tFound $bin";
my $basename = basename( $bin );
my $link_basename = do {
if( $basename =~ m/5\.\d+\.\d+\z/) { $basename }
else { "$basename$perl_version" }
};
my $link = catfile( $links_directory, $link_basename );
next if -e $link;
say "\t\tlinking $bin => $link";
symlink $bin => $link or
warn "\t\tCould not create symlink [$!]: $bin => $link!";
}
}
Все устанавливается в нужном месте для этого конкретного Perl.
Я также думал, что я должен поставить эти Perl-каталоги под какой-то контроль над источниками. Если я добавлю модуль, который мне не нравится, я просто вернусь к более ранней ревизии. Хотя я только начинаю это делать и не особо с этим играю.
Я написал больше об этом в блоге Effective Perler: