For development, I install my own Perl and leave the system Perl alone. If I want to upgrade the system Perl, I use the system package manager. For my development Perl, I use the cpan tool.
Since I keep those separate, I should never mess up the Perl that the system needs for its maintenance tasks and so on, but I don't have to rely on the system's decisions for development.
It's very easy to install separate Perls. When you run Configure from the source distribution, it will ask you where you want to install everything. Give it any path that you like. I have many Perls installed in /usr/local/perls, for instance, and everything for each installation lives separately. I then make symlinks in /usr/local/bin for them (e.g. perl5.8.9, perl.5.10.0, perl5.10.0-threaded). When I want a particular version, I just use the one I want:
$ perl5.10.0 program.pl
The particular binary ensures that the program picks up the right module search path and so on (it's the same stuff in the Config.pm module for that binary).
Here's a script I use to create the symlinks. It looks in the bin directory, figures out the Perl version, and makes links like cpan5.10.1
and so on. Each program already knows the right perl to call:
#!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!";
}
}
Everything gets install in the right place for that particular Perl.
I've also been thinking that I should put those Perl directories under some sort of source control. If I add a module I don't like, I just back out to an earlier revision. I'm only starting to do that though and haven't played with it much.
I've written more about this sort of thing in the Effective Perler blog:
Best Answer
You need to have something like:
file: Player.pm
your main script, connect4.pl
EDIT
First answered only the above, but based on the fact, than you have problems understand how perl packages should be organized, IMHO you need some more comments, from the perl-beginner point of view (as me). You probably will get much better and much more precise answers from perl-gurus.
If you start learning OO with perl, IMHO, you should start using the "Mo" or "Moo" packages from CPAN. They provides to you some nice "sugar" what greatly helps you start making OO oriented programs in perl and allow you extend your packages later to Moo?'s smarter brother -> Moose.
Must say, it's not mean than you will not need to learn the basic principes of perl OO.
Because most of CPAN modules are written without Mo?se and many programs what you will read, are written in traditional perl-OO, so you sill need learn it, but (from my own experience) it needs somewhat steeper learning curve. You need to understand package structure, what is a "blessing" and so on. Using "Mo" (or Moose) helps you hide many things, and you will learn them later.
Using "Mo" helps you to have faster results withot fully understand - why it is working. ;) /Probably, now many perl-experts will comment this as a wrong method of learning. :)/
The Player example using "Mo" can be written as like the next:
File: Player.pm
file with the main.pl script:
running the main.pl produces:
As you can see, the "Mo" provides you with a FREE "new" method. (and many other things too).
You really need to read: