0

即使我已经从 cpan 和 cpanm 安装了 DateTime.pm,怎么可能找不到呢?但仍然得到它在@INC 中找不到的错误?它不是重复的,因为我不询问谁来下载 modul - 正如我所说的,我尝试从 2 个来源安装它并且我做到了,但仍然是错误Can't locate DateTime.pm in @INC。我不知道我做错了什么。

代码很简单:

#!/usr/bin/perl
use DateTime;
my $t = localtime;
my $now = DateTime->new(
year => $t->year,
month => $t->mon,
day => $t->mday,
);
print $now

和错误:

Can't locate DateTime.pm in @INC (you may need to install the DateTime module) (@INC contains:
    /etc/perl
    /usr/local/lib/x86_64-linux-gnu/perl/5.28.1
    /usr/local/share/perl/5.28.1
    /usr/lib/x86_64-linux-gnu/perl5/5.28
    /usr/share/perl5
    /usr/lib/x86_64-linux-gnu/perl/5.28
    /usr/share/perl/5.28
    /usr/local/lib/site_perl
    /usr/lib/x86_64-linux-gnu/perl-base
) at ./a line 2.

似乎我找不到 DateTime.pm 但我确实在这里:

/home/shepherd/.cpan/build/DateTime-1.51-0/blib/lib/DateTime.pm
/home/shepherd/.cpan/build/DateTime-1.51-0/lib/DateTime.pm
/home/shepherd/.cpan/build/DateTime-TimeZone-2.37-0/t/lib/T/RequireDateTime.pm
/home/shepherd/.cpanm/work/1572257193.20577/DateTime-1.51/lib/DateTime.pm
/home/shepherd/.cpanm/work/1572257193.20577/DateTime-TimeZone-2.37/t/lib/T/RequireDateTime.pm
/home/shepherd/.cpanm/work/1572257544.21848/DateTime-1.51/lib/DateTime.pm
/home/shepherd/.cpanm/work/1572257544.21848/DateTime-TimeZone-2.37/t/lib/T/RequireDateTime.pm

这到底是怎么回事?


一些可能有用的信息:

$ which cpan
/usr/bin/cpan

$ head -n 1 `which cpan`
usr/bin/perl

$ which cpanm
/usr/bin/cpanm

$ head -n 1 `which cpanm`
usr/bin/perl

$ /usr/bin/perl -V:'inst.*lib'
installarchlib='/usr/lib/x86_64-linux-gnu/perl/5.28';
installprivlib='/usr/share/perl/5.28'
installsitelib='/usr/local/share/perl/5.28.1'
installvendorlib='/usr/share/perl5'

@INC (when 'use DateTime;')
/etc/perl
/usr/local/lib/x86_64-linux-gnu/perl/5.28.1
/usr/local/share/perl/5.28.1
/usr/lib/x86_64-linux-gnu/perl5/5.28
/usr/share/perl5
/usr/lib/x86_64-linux-gnu/perl/5.28
/usr/share/perl/5.28
/usr/local/lib/site_perl
/usr/lib/x86_64-linux-gnu/perl-base

该命令set | grep ^PERL没有任何回应,我已经尝试过set | grep -i perl,但只是在一些 if 语句中被提及,例如:if type perl &> /dev/null; then。第二个命令echo 'o conf' | cpan是这样的:Loading internal logger. Log::Log4perl recommended for better logging There seems to be running another CPAN process (pid 2023). Contacting... Other job not responding. Shall I overwrite the lockfile '/home/shepherd/.cpan/.lock'? (Y/n) [y] Ok, bye

4

2 回答 2

2

您可以看到DateTime(下/home/shepherd/.cpan)的目录是安装模块时使用cpan的工作目录。cpanm一旦安装了模块,您就不会期望从那里实际加载模块 - 因为模块的其他副本应该安装在更永久的地方。

但是它们安装在哪里?这就是问题所在。默认情况下,它们应该安装在您的默认@INC路径上的某个位置,但它们显然不存在 - 否则您将不会收到该错误消息。

因此,我怀疑安装模块时出现错误,或者它们以某种方式安装在系统上的非标准位置。如果不确切了解您运行了哪些命令来安装模块以及产生了哪些输出,就不可能提供更多有用的帮助。

于 2019-10-28T12:37:26.070 回答
1

我想我也遇到了同样的问题。很多次。当您sudo apt-get install libsomething-perl的 DateTime.pm 文件或它所在的目录之一时,您的普通用户可能无法读取。(取决于umaskg+s我认为的设置)

要检查这一点,请查看它是否可以作为 root (sudo) 使用,以及通过运行它的位置:

sudo perl -le'use DateTime; print $INC{"DateTime.pm"}'

然后运行:

sudo ls -ld $(sudo perl -E'use DateTime;@p=split"/",$INC{"DateTime.pm"};say join"/",@p and pop@p while@p>1')

你可能会看到这样的东西:

drwxr-xr-x  root root   4096 Aug 30  2016 /usr
drwxr-xr-x  root root  12288 Oct  9 10:22 /usr/lib
drwxr-xr-x  root root  69632 Oct 23 06:35 /usr/lib/x86_64-linux-gnu
drwxr-xr-x  root root   4096 Aug 30  2016 /usr/lib/x86_64-linux-gnu/perl5
drwxr-xr-x  root root   4096 Oct  9 10:22 /usr/lib/x86_64-linux- gnu/perl5/5.22
-rw-r--r--  root root 123586 Dec 18  2015 /usr/lib/x86_64-linux-gnu/perl5/5.22/DateTime.pm

如果您当前的用户没有读取 DateTime.pm 文件或其所在目录所需的权限,请尝试使用其中一个sudo chown $(whoami) /usr/lib/x86_64-linux-gnu/perl5/5.22/sudo chmod a+rx /usr/lib/x86_64-linux-gnu/perl5/5.22/DateTime.pm类似的方法来更改它。(我这里的示例中的目录当然应该更改为您从ls上面的命令中获得的目录)

于 2019-10-29T11:07:41.697 回答