Windows 为什么我会得到';Can';t定位对象方法“;init";via package";wlgmod::odt“';当我尝试在Cygwin中运行wyd.pl时?
我正在尝试在Windows上运行一个名为using Cygwin的Perl脚本。Cygwin安装在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
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”(可能是
您忘记在/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