windows 与 linux 上的 perl glob 匹配文件
perl glob matching files on windows vs linux
我在一个 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);
这在单元测试中运行良好,当我在 Linux 上 运行 它时,但在 windows 上安装时,我得到:
Can't call method "desiredCompressionLevel" on an undefined value at /usr/share/perl5/Archive/Zip/Archive.pm line 249.
在这两种情况下,它在 Linux 和单元测试下都可以正常工作,但在 windows 上安装时会失败(目录中有 xml 个文件应该被拾取...).
我认为choroba 的评论是正确的。由于它仅在您在 windows 上安装时发生,而不是在您在 windows 上测试时发生,我敢打赌这是一个 "C:\Program Files" space 问题。它列在 perl 的文档中 File::Glob:
Due to historical reasons, CORE::glob() will also split its
argument on whitespace, treating it as multiple patterns, whereas
bsd_glob() considers them as one pattern.
这很容易破坏事情。在这种情况下,文档建议使用 bsd_glob() 而不是 glob。
我可以使用 $in_path == "." 剪切并粘贴您的代码 运行 到 windows,但是当我使用 $in_path 时它会中断= "C:\Path With Spaces"。此外,对于 spaces,我很确定它也会在 linux 上失败。
我在一个 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);
这在单元测试中运行良好,当我在 Linux 上 运行 它时,但在 windows 上安装时,我得到:
Can't call method "desiredCompressionLevel" on an undefined value at /usr/share/perl5/Archive/Zip/Archive.pm line 249.
在这两种情况下,它在 Linux 和单元测试下都可以正常工作,但在 windows 上安装时会失败(目录中有 xml 个文件应该被拾取...).
我认为choroba 的评论是正确的。由于它仅在您在 windows 上安装时发生,而不是在您在 windows 上测试时发生,我敢打赌这是一个 "C:\Program Files" space 问题。它列在 perl 的文档中 File::Glob:
Due to historical reasons, CORE::glob() will also split its argument on whitespace, treating it as multiple patterns, whereas bsd_glob() considers them as one pattern.
这很容易破坏事情。在这种情况下,文档建议使用 bsd_glob() 而不是 glob。
我可以使用 $in_path == "." 剪切并粘贴您的代码 运行 到 windows,但是当我使用 $in_path 时它会中断= "C:\Path With Spaces"。此外,对于 spaces,我很确定它也会在 linux 上失败。