Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 为什么我会得到';Can';t定位对象方法“;init";via package";wlgmod::odt“';当我尝试在Cygwin中运行wyd.pl时?_Windows_Bash_Perl - Fatal编程技术网

Windows 为什么我会得到';Can';t定位对象方法“;init";via package";wlgmod::odt“';当我尝试在Cygwin中运行wyd.pl时?

Windows 为什么我会得到';Can';t定位对象方法“;init";via package";wlgmod::odt“';当我尝试在Cygwin中运行wyd.pl时?,windows,bash,perl,Windows,Bash,Perl,我正在尝试在Windows上运行一个名为using Cygwin的Perl脚本。Cygwin安装在C:\cygwin64,WyD安装在C:\WyD\WyD.pl。它们分别作为C:\cygwin64和C:\wyd在WindowsPATH环境变量中 使用bash/Mintty运行WyD时,请使用: wyd.pl-b-e-t-s3-o“outputedwordlist”“TARGETFOLDER” …我得到以下错误: 无法通过包“wlgmod::odt”定位对象方法“init”(可能是 您忘记在/cy

我正在尝试在Windows上运行一个名为using Cygwin的Perl脚本。Cygwin安装在
C:\cygwin64
,WyD安装在
C:\WyD\WyD.pl
。它们分别作为
C:\cygwin64
C:\wyd
在Windows
PATH
环境变量中

使用bash/Mintty运行WyD时,请使用:

wyd.pl-b-e-t-s3-o“outputedwordlist”“TARGETFOLDER”

…我得到以下错误:

无法通过包“wlgmod::odt”定位对象方法“init”(可能是 您忘记在/cygdrive/c/WYD/WYD.pl第284行加载“wlgmod::odt”?)

有时,
wlgmod::odt
被替换为
wlgmod::doc
或任何其他文档类型,但运行脚本始终会生成相同的基本错误。这个问题的答案建议安装几个依赖项,结果只是Ubuntu系统答案的复制粘贴,并没有解决这个错误,所以我决定从一开始就重新问这个问题,并提供更多细节。我还安装了Cygwin安装程序中的所有Perl包

在我为使这个脚本正常工作所做的一切努力之后,我个人可以想到两个可能的错误原因。把这些作为指导,而不是其他任何东西

  • 上面的错误引用了
    wyd.pl
    脚本中的第284行,因此该脚本中的某些内容可能是硬编码的,因此无法与Cygwin/Windows一起使用,或者通常存在兼容性错误。我不懂Perl,因此无法确认这一点

  • 我注意到在
    C:\WyD
    安装WyD时包含一个名为
    wlgmod
    的文件夹,该文件夹包含上述错误似乎要查找的所有文件
    doc.pm
    html.pm
    jpeg.pm
    ,等等。如果这些文件存在于该目录中,但bash无法找到它们,可能是因为WyD需要从Cygwin自身内部运行。我最近才考虑过这种可能性,我对Cygwin和WyD的了解太少,无法确切地知道两者是如何工作的。甚至可以从Cygwin文件夹中运行WyD吗?它不是一个软件包,所以不能作为一个软件包安装,因此我不确定这将如何工作

  • 以下是脚本的相关部分:

    # Module hash containing module name and supported file extensions
    # Multiple extensions are seperated using ';'
    my %wlgmods = (
               'wlgmod::strings', '',           # only used with command-line switch
               'wlgmod::plain'  , '.txt',       # used for all MIME text/plain as well
               'wlgmod::html'   , '.html;.htm;.php;.php3;.php4',
               'wlgmod::doc'    , '.doc',
               'wlgmod::pdf'    , '.pdf',
               'wlgmod::mp3'    , '.mp3',
               'wlgmod::ppt'    , '.ppt',
               'wlgmod::jpeg'   , '.jpeg;.jpg;.JPG;.JPEG',
               'wlgmod::odt'    , '.odt;.ods;.odp'
               );
    
    ...
    
    # Initialize possible modules
    foreach(keys %wlgmods) {
        eval("use $_;");
        my $ret = $_->init(); # line 284
    
        # If module failed, add errortext and remove from hash
        if($ret) {
            $retvals .= "$_: $ret\n";
            delete $wlgmods{$_};
            $ret = "";
        }
    }
    

    寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建pastebin的.283行是
    eval(“使用$”,其中故障点处的wlgmod::odt。
    使用
    失败,可能是因为wlgmod::odt不在
    @INC
    中;您可以通过添加
    die$@if$@进行确认紧跟在
    eval
    之后。如果从
    /cygdrive/c/WYD/
    运行脚本,它应该可以工作(因为在大多数perl安装中,
    自动包含在
    @INC
    中)。但是最好添加
    使用FindBin;使用lib“$FindBin::Bin/wlgmod”到脚本的顶部,这样你就可以在任何地方运行它了;使用lib$FindBin::Bin很高兴它起作用了。我在问题中添加了你的pastebin中的相关部分,并投票决定重新打开。我们要求在您的问题正文中添加MCVE,原因有几个:1)未来的访问者在搜索类似问题的答案时,费力地阅读数百行不相关的代码,这将是一种痛苦。2) 如果到pastebin的链接中断,未来的访问者将无法看到触发错误消息的代码,他们的时间将被浪费。3) 如果没有可运行的代码,就很难跟踪错误。
    $FindBin::RealBin
    $FindBin::Bin
    更安全。寻求调试帮助的问题(“此代码为什么不工作?”)必须包括所需的行为,一个特定的问题或错误,以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建pastebin的.283行是
    eval(“使用$”,其中故障点处的wlgmod::odt。
    使用
    失败,可能是因为wlgmod::odt不在
    @INC
    中;您可以通过添加
    die$@if$@进行确认紧跟在
    eval
    之后。如果从
    /cygdrive/c/WYD/
    运行脚本,它应该可以工作(因为在大多数perl安装中,
    自动包含在
    @INC
    中)。但是最好添加
    使用FindBin;使用lib“$FindBin::Bin/wlgmod”到脚本的顶部,这样你就可以在任何地方运行它了;使用lib$FindBin::Bin很高兴它起作用了。我在问题中添加了你的pastebin中的相关部分,并投票决定重新打开。我们要求在您的问题正文中添加MCVE,原因有几个:1)未来的访问者在搜索类似问题的答案时,费力地阅读数百行不相关的代码,这将是一种痛苦。2) 如果到pastebin的链接中断,未来的访问者将无法看到触发错误消息的代码,他们的时间将被浪费。3) 如果没有可运行的代码,就很难跟踪错误。
    $FindBin::RealBin
    $FindBin::Bin