【问题标题】:perl glob matching files on windows vs linuxwindows vs linux上的perl glob匹配文件
【发布时间】:2015-10-31 01:55:45
【问题描述】:

我在一个 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 文件应该被拾取...)。

【问题讨论】:

  • Windows路径有空格吗?
  • @ikegami,你是对的。运行该测试时,我一次更改了两件事。 if 定义没有区别

标签: perl cgi glob


【解决方案1】:

我认为 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 上也会失败。

【讨论】:

    猜你喜欢
    • 2014-06-05
    • 2013-05-14
    • 2018-11-22
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2015-06-14
    • 2014-06-26
    • 1970-01-01
    相关资源
    最近更新 更多