perl glob匹配windows vs linux上的文件

Rog*_*art 3 perl cgi glob

我在cgi脚本中有以下代码,它只是将xml文件捆绑到一个zip中以供下载:

my $obj = Archive::Zip->new();
foreach my $xml_file (glob(File::Spec->catfile($in_path,"*.xml")))
{
    $obj->addFile($xml_file);
}
$obj->writeToFileNamed($zipfile_name);
Run Code Online (Sandbox Code Playgroud)

这在单元测试和我在Linux上运行时工作正常,但是当安装在Windows上时,我得到:

Can't call method "desiredCompressionLevel" on an undefined value at /usr/share/perl5/Archive/Zip/Archive.pm line 249.
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,它在Linux和单元测试下都能正常工作,但在Windows上安装时会失败(目录中有xml文件应该被拾取...).

rkh*_*rkh 7

我认为choroba的评论是正确的.因为它只发生在你在windows上安装而不是在windows上测试时,我敢打赌这是一个"C:\ Program Files"空间问题.它列在perl的File :: Glob的文档中:

由于历史原因,CORE :: glob()也会将其参数拆分为空格,将其视为多个模式,而bsd_glob()将它们视为一个模式.

这很容易破坏事情.在这种情况下,文档建议使用bsd_glob()而不是glob.

我可以剪切和粘贴你的代码并使用$ in_path =="."在Windows上运行它,但是当我使用$ in_path ="C:\ Path With Spaces"时它会中断.另外,对于空格,我很确定它也会在linux上失败.