views:

245

answers:

3

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

A: 

start with these 2 commands:

which perl
which cpan

if you get different paths to the executables then there is a good chance you have 2 versions or perl installed. If they are the same then chances are you have the perl @INC configured incorrectly. You can add paths to @INC bny including this in the very beginning of your script (after the shebang):

BEGIN {

        push @INC,"/path/to/cpan/modules";

        }  

In any case do this:

find / -name perl
find / -name cpan

see what you get. This will tell you if you have multiple versions or not.

ennuikiller
These commands both return a directory of "/opt/local/bin"
purinkle
please post the output of perl -e "print @INC\n"
ennuikiller
+4  A: 

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.

Schwern
This seems to make sense. If I run my scripts as "perl script.pl" then it runs as expected but just running it as "./script.pl" then I get the error messages. I've tried changing the shebang line to "#!/opt/local/bin/perl" but I still get the same
purinkle
@purinkle => I start my scripts with `#!/usr/bin/env perl` which usually gives you the perl you are looking for.
Eric Strom
@Eric Storm => Thanks! That worked nicely for when I'm running my script from the command line. It seems now that Apache is the last one left complaining.
purinkle
A: 

I went through this process about a month and a half ago when setting up a new MacBook Pro. Getting the MacPorts perl installed, switching to /usr/bin/env perl, and updating my PATH (which, from comments on Schwern's answer, sounds like it's about where you are now) was straightforward and reasonably well-documented.

Figuring out how to get the right perl to show up first in apache's PATH, on the other hand, was hellish and involved way too much googling interspersed with periods of beating my head against the wall for relief.

So, to spare you that, the answer I eventually found was that you need to add a PATH key to /System/Library/LaunchDaemons/org.apache.httpd.plist with the PATH that you want apache to use. Assuming that you're just as unfamiliar with the .plist format as I was at the time, here's my complete current org.apache.httpd.plist, which has been working great for me:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
<plist version="1.0">
<dict>
        <key>Disabled</key>
        <true/>
        <key>Label</key>
        <string>org.apache.httpd</string>
        <key>ProgramArguments</key>
        <array>
                <string>/usr/sbin/httpd</string>
                <string>-D</string>
                <string>FOREGROUND</string>
        </array>
        <key>OnDemand</key>
        <false/>
        <key>SHAuthorizationRight</key>
        <string>system.preferences</string>
        <key>EnvironmentVariables</key>
        <dict>
                <key>PATH</key>
                <string>/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin</string>
        </dict>
</dict>
</plist>

Copy/paste that to your system (or just add the EnvironmentVariables key and its accompanying dict to your existing file), restart apache, and you should be set. (Unless I misremembered and it was something else that actually got it working for me, but I'm pretty sure this was it.)

Dave Sherohman