好的一些规则:
- 不,我无法在此系统上安装 Strawberry Perl。我必须使用 Cygwin。
- 这是 Perl 5.8.7。我无法更新它。
- 这不是我的系统。这是客户的系统,我无法随意修改。
现在,我们已经解决了这个问题......
我在此系统上安装了 Spreadsheet::Read
、Spreadsheet::ParseExcel
和 Spreadsheet::XLSX
。这安装了一个名为 xlscat
的小 Perl 脚本。我们之前已经在开发盒和 UAT 盒上完成了此操作。现在这是生产盒。
我收到以下错误:
Parser for XLSX is not installed at /usr/bin/xlscat line 185
我已将其追溯到 Spreadsheet::Read
。相关代码为:
my @parsers = (
[ csv => "Text::CSV_XS" ],
[ csv => "Text::CSV_PP" ], # Version 1.05 and up
[ csv => "Text::CSV" ], # Version 1.00 and up
[ ods => "Spreadsheet::ReadSXC" ],
[ sxc => "Spreadsheet::ReadSXC" ],
[ xls => "Spreadsheet::ParseExcel" ],
[ xlsx => "Spreadsheet::XLSX" ],
[ prl => "Spreadsheet::Perl" ],
# Helper modules
[ ios => "IO::Scalar" ],
);
my %can = map { $_->[0] => 0 } @parsers;
for (@parsers) {
my ($flag, $mod) = @$_;
print STDERR qq(DEBUG: Flag = "$flag" Mod = "$mod"\n);
$can{$flag} and next;
eval "require $mod; \$can{\$flag} = '$mod'";
}
print STDERR Dumper(\%can); #DEBUG:
开头包含字符串 DEBUG:
的行是我的。
@parsers
的转储显示所有内容均已正确加载。第一个调试正确打印出 $flag
和 $mod
的值。
问题似乎来自于eval
语句。从我所看到的,它对模块运行 require
,然后将 $can{$flag}
变量设置为 $mod
如果要求成功。显然,require Spreadsheet::XLSX
失败了。这是我的调试语句的相关输出:
DEBUG: Flag = "csv" Mod = "Text::CSV_XS"
DEBUG: Flag = "csv" Mod = "Text::CSV_PP"
DEBUG: Flag = "csv" Mod = "Text::CSV"
DEBUG: Flag = "ods" Mod = "Spreadsheet::ReadSXC"
DEBUG: Flag = "sxc" Mod = "Spreadsheet::ReadSXC"
DEBUG: Flag = "xls" Mod = "Spreadsheet::ParseExcel"
DEBUG: Flag = "xlsx" Mod = "Spreadsheet::XLSX"
DEBUG: Flag = "prl" Mod = "Spreadsheet::Perl"
DEBUG: Flag = "ios" Mod = "IO::Scalar"
$VAR1 = {
'csv' => 'Text::CSV_XS',
'sxc' => 0,
'xlsx' => 0,
'xls' => 'Spreadsheet::ParseExcel',
'ios' => 'IO::Scalar',
'prl' => 0,
'ods' => 0
};
嗯...也许模块没有安装?
$ perldoc -l Spreadsheet::XLSX
/usr/lib/perl5/site_perl/5.8/Spreadsheet/XLSX.pm
它显示在perldoc
中。让我们编写一个快速测试程序:
#! /usr/bin/env perl
use Spreadsheet::Read;
use Spreadsheet::XLSX;
print "It works\n";
还有...
$ ./test.pl
DEBUG: Flag = "csv" Mod = "Text::CSV_XS"
DEBUG: Flag = "csv" Mod = "Text::CSV_PP"
DEBUG: Flag = "csv" Mod = "Text::CSV"
DEBUG: Flag = "ods" Mod = "Spreadsheet::ReadSXC"
DEBUG: Flag = "sxc" Mod = "Spreadsheet::ReadSXC"
DEBUG: Flag = "xls" Mod = "Spreadsheet::ParseExcel"
DEBUG: Flag = "xlsx" Mod = "Spreadsheet::XLSX"
DEBUG: Flag = "prl" Mod = "Spreadsheet::Perl"
DEBUG: Flag = "ios" Mod = "IO::Scalar"
$VAR1 = {
'csv' => 'Text::CSV_XS',
'sxc' => 0,
'xlsx' => 0,
'xls' => 'Spreadsheet::ParseExcel',
'ios' => 'IO::Scalar',
'prl' => 0,
'ods' => 0
};
It works
我可以通过测试程序中的 use Spreadsheet::XLSX
获取 Spreadsheet::XLSX
,但 require
中的 >Spreadsheet::Read
似乎没有看到它。
为什么?
<小时/>附录
What do you get if you print Dumper( \%INC ) ? – friedo 2 mins ago
实际上我做得更好。我在循环中添加了以下行:
require $mod if ($mod eq "Spreadsheet::XLSX"); #DEBUG
这产生了错误消息:
Can't locate Spreadsheet::XLSX in @INC (@INC contains:
/usr/lib/perl5/5.8/cygwin /usr/lib/perl5/5.8
/usr/lib/perl5/site_perl/5.8/cygwin
/usr/lib/perl5/site_perl/5.8
/usr/lib/perl5/site_perl/5.8/cygwin
/usr/lib/perl5/site_perl/5.8
/usr/lib/perl5/vendor_perl/5.8/cygwin
/usr/lib/perl5/vendor_perl/5.8
/usr/lib/perl5/vendor_perl/5.8/cygwin
/usr/lib/perl5/vendor_perl/5.8 .) at
/usr/lib/perl5/site_perl/5.8/Spreadsheet/Read.pm line 57.
Compilation failed in require at ./test.pl line 3.
BEGIN failed--compilation aborted at ./test.pl line 3.
(注意:我重新格式化了输出,因此它的长度不会超过 1000 个字符,并且更容易查看 @INC
路径)。
该模块位于/usr/lib/perl5/site_perl/5.8/Spreadsheet/XLSX.pm
中。
哦,也看看这个:
$ pwd
/usr/lib/perl5/site_perl/5.8/Spreadsheet
$ ls -la
total 152
drwxr-xr-x+ 4 phalder Domain Users 0 Nov 1 21:51 .
drwxrwxrw-+ 11 twinborne Users 0 Nov 1 22:28 ..
drwxr-xr-x+ 3 phalder Domain Users 0 Nov 1 20:48 ParseExcel
-rwxr-xr-x 1 phalder Domain Users 107773 Apr 6 2011 ParseExcel.pm
-rwxrwxrwx 1 phalder Domain Users 29142 Nov 2 12:53 Read.pm
drwxr-xr-x+ 2 phalder Domain Users 0 Nov 1 21:51 XLSX
-rwxr-xr-x 1 phalder Domain Users 8411 May 16 2010 XLSX.pm
$ ls -la XLSX
total 48
drwxr-xr-x+ 2 phalder Domain Users 0 Nov 1 21:51 .
drwxr-xr-x+ 4 phalder Domain Users 0 Nov 1 21:51 ..
-rwxr-xr-x 1 phalder Domain Users 5487 May 16 2010 Fmt2007.pm
-rwxr-xr-x 1 phalder Domain Users 37046 May 16 2010 Utility2007.pm
权限看起来没问题。
<小时/>另一个附录:
当我重新安装 CPAN 时,我得到了这个:
Result: PASS
/usr/bin/make test -- OK
Running make install
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ERROR: Can't create '/usr/lib/perl5/site_perl/5.8/cygwin/auto/Spreadsheet/Read'
Do not have write permissions on
'/usr/lib/perl5/site_perl/5.8/cygwin/auto/Spreadsheet/Read'
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
at -e line 1
Installing /usr/lib/perl5/site_perl/5.8/Spreadsheet/Read.pm
Installing /usr/share/man/man3/Spreadsheet.Read.3pm
make: *** [pure_site_install] Error 255
/usr/bin/make install -- NOT OK
哎呀!我没有检查/usr/lib/perl5/site_perl/5.8/cygwin
目录树的权限。
对整个 /usr/lib/perl5
目录执行了 chmod -R a+rx *
。我们将看看它是否再次有效。
最佳答案
发现问题
我采取了稍微不同的策略。我修改了 Spreadsheet::Read
以在 eval
之后打印出 $@
。这样,我就可以看到它出现了什么错误。结果如下:
$ ./test.pl
DEBUG: ""DEBUG: "Can't locate Spreadsheet/ReadSXC.pm in @INC
(@INC contains:
/usr/lib/perl5/5.8/cygwin
/usr/lib/perl5/5.8
/usr/lib/perl5/site_perl/5.8/cygwin
/usr/lib/perl5/site_perl/5.8
/usr/lib/perl5/site_perl/5.8/cygwin
/usr/lib/perl5/site_perl/5.8
/usr/lib/perl5/vendor_perl/5.8/cygwin
/usr/lib/perl5/vendor_perl/5.8
/usr/lib/perl5/vendor_perl/5.8/cygwin
/usr/lib/perl5/vendor_perl/5.8 .) at (eval 8) line 1.
"DEBUG: "Can't locate Spreadsheet/ReadSXC.pm in @INC
(@INC contains: /usr/lib/perl5/5.8/cygwin [...]) at (eval 9) line 1.
"DEBUG: ""DEBUG: "Can't locate Compress/Raw/Zlib.pm in @INC
(@INC contains: /usr/lib/perl5/5.8/cygwin [...]) at (eval 15) line 1.
"DEBUG: "Can't locate Spreadsheet/Perl.pm in @INC
(@INC contains: /usr/lib/perl5/5.8/cygwin [...]) at (eval 18) line 1.
你看到了吗?问题不在于 Spreadsheet::XLSX
,而是 Compress::Raw::Zlib
。我将 /usr/lib/perl
的整个权限设置为 777
,然后安装了 Compress::Raw::Zlib
和 电子表格::ReadSXC
.
这一定是这些模块最初安装时出现的问题。我不是进行 cpan 安装的人,而是通过电话帮助该人,因此如果出现这些错误,我没有机会看到它们。 CPAN 往往非常非常嘈杂,我已经学会了在 CPAN 运行时捕获随机错误消息。
问题可能是 /usr/lib/perl5/site_perl/5.8/cygwin
一直没有正确的权限。
程序现在可以运行了。
感谢您的所有帮助。不知何故,它引导我走上了正确的道路。
关于Perl Cygwin 很有趣。模块已加载,但程序未找到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7984136/