Two versions of Perl in Mac OS X?

purinkle picture purinkle · Aug 13, 2010 · Viewed 19.5k times · Source

I've installed the Template module via CPAN on my MacBook Pro and it seemed to install correctly.

But, when I try to run a script that includes the Template module, I get the following:

Can't locate Template.pm in @INC (@INC contains: /Users/purinkle/Sites/rob/modules /Library/Perl/Updates/5.10.0/darwin-thread-multi-2level /Library/Perl/Updates/5.10.0 /System/Library/Perl/5.10.0/darwin-thread-multi-2level /System/Library/Perl/5.10.0 /Library/Perl/5.10.0/darwin-thread-multi-2level /Library/Perl/5.10.0 /Network/Library/Perl/5.10.0/darwin-thread-multi-2level /Network/Library/Perl/5.10.0 /Network/Library/Perl /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level /System/Library/Perl/Extras/5.10.0 .) at ./index.pl line 12.

BEGIN failed--compilation aborted at ./index.pl line 12.

I then think that something must have gone wrong during installation and try to install again via CPAN but receive the following message:

Template is up to date (2.22).

I've then ran the instmodsh command to try and find where the module is installed. instmodsh lists these directories:

/opt/local/bin

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Manual

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Namespace

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Plugin

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Stash

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Tools

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Tutorial

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/auto/Template/Stash/XS

/opt/local/share/man/man1

/opt/local/share/man/man3

It looks like I have some how got two different versions of Perl installed (5.8.9 and 5.10.0) and this is causing confusion between CPAN and other Perl scripts.

How can I verify this and how can this issue be resolved?

I've ran the commands

which perl
which cpan

and they both return /opt/local/bin

Running

find / -name perl

returns

find: /dev/fd/3: Not a directory

find: /dev/fd/4: Not a directory

/opt/local/bin/perl

/opt/local/etc/bash_completion.d/perl

/opt/local/var/macports/software/bash-completion/1.2_0/opt/local/etc/bash_completion.d/perl

/opt/local/var/macports/software/perl5.8/5.8.9_3/opt/local/bin/perl

/opt/local/var/macports/sources/rsync.macports.org/release/ports/perl

/usr/bin/perl

/usr/local/bin/perl

/usr/share/file/magic/perl

and

find / -name cpan

returns

/opt/local/bin/cpan

/opt/local/var/macports/software/perl5.8/5.8.9_3/opt/local/bin/cpan

/Users/purinkle/.cpan/build/CPAN-1.9402-KtN827/blib/script/cpan

/Users/purinkle/.cpan/build/CPAN-1.9402-KtN827/scripts/cpan

/Users/purinkle/.cpan/build/CPAN-1.9402-zb0AeX/blib/script/cpan

/Users/purinkle/.cpan/build/CPAN-1.9402-zb0AeX/scripts/cpan

/usr/bin/cpan

Running

perl -e 'print join "\n", @INC'

returns

/Users/purinkle/Sites/rob/modules

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level

/opt/local/lib/perl5/site_perl/5.8.9

/opt/local/lib/perl5/site_perl

/opt/local/lib/perl5/vendor_perl/5.8.9/darwin-2level

/opt/local/lib/perl5/vendor_perl/5.8.9

/opt/local/lib/perl5/vendor_perl

/opt/local/lib/perl5/5.8.9/darwin-2level

/opt/local/lib/perl5/5.8.9

Answer

Schwern picture Schwern · Aug 13, 2010

OS X ships with two versions of Perl. 5.10.0 is the default, so /usr/bin/perl and /usr/bin/cpan should all talk to 5.10.0.

The problem is you have three. /opt/local indicates a MacPorts installation which probably installed Perl as a dependency when you weren't looking. That's /opt/local/bin/perl and its probably the default perl in your path. Check with which perl. That also means you're probably using MacPorts' cpan, check with which cpan, and thus installed Template Toolkit into the MacPorts version.

I'm going to guess either you're running a program with #!/usr/bin/perl at the top or you're using the built in mod_perl or you're running it as a user who is not you. All of which will reference OS X's default Perl and not your MacPorts install.

Macports has a 5.10 as well as 5.12, but "perl" in Macports is still 5.8. You can install 5.10 in Macports.

As to how to resolve this... if you're using using mod_perl on that machine, use Macports' Perl. It will be easier to install modules and it will be kept up to date better than the OS version.

To shield yourself from future confusion, you can add aliases into /usr/local/bin or ~/bin to perl, perldoc and cpan to the Perl of your choice. That will prevent something else from installing perl in your path and hijacking.