加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl Cygwin好玩.模块已加载,但程序未找到

发布时间:2020-12-15 23:36:29 所属栏目:大数据 来源:网络整理
导读:好的一些规则: 不,我不能在这个系统上安装Strawberry Perl.我必须使用Cygwin. 这是Perl 5.8.7.我无法更新它. 这不是我的系统.这是一个客户的系统,我不能修改它到我心中的内容. 现在,我们已经解决了这个问题…… 我在这个系统上安装了Spreadsheet :: Read,Sp
好的一些规则:

>不,我不能在这个系统上安装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声明.从我所看到的,它运行需要一个模块,然后如果需要成功,将$can {$flag}变量设置为$mod.显然,要求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 worksn";

和…

$./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','ods' => 0
        };
It works

我可以通过在我的测试程序中使用Spreadsheet :: XLSX来获取Spreadsheet :: XLSX,但是Spreadsheet :: Read中的require似乎没有看到它.

为什么?

附录

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和Spreadsheet :: ReadSXC.

这些模块最初安装时一定是个问题.我不是那个做cpan安装的人,而是通过电话帮助这个人,所以如果他们弹出来的话,我没有机会看到这些错误. CPAN往往非常,非常嘈杂,并且我已经学会了在CPAN运行时捕获随机错误消息.

问题可能是/usr/lib/perl5/site_perl/5.8/cygwin一直没有正确的权限.

该计划现在有效.

感谢您所有的帮助.不知怎的,它让我走上了正确的道路.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读