Perl函数用空格规范化路径?

标签 perl filenames pathname

我处于维护模式,我正在使用在 Apple、Linux、Windows 和 Unix 上运行的 Perl 脚本。某些 Apple 和 Linux 以及大多数 Windows 的路径中都有空格。在 Windows 上,长文件名需要引号。在 Apple 和 Linux 上,空格需要一个反斜杠。如果没有空间,则无需执行任何操作。

Perl 的 File::CopyFile::Spec了解系统差异,并将它们抽象为不同的文件系统。查看其他 File 函数,我没有看到用于规范化或规范化路径名的是什么,它根据需要添加引号、斜线、移动引号等。

Perl 版本要求是 v5.10。所以我应该能够毫无困难地期待至少 v5.10。

用空格规范化或规范化路径的 Perl 函数是什么?


这是一个在 Windows 上过于简单的例子:

my $testcat = catfile(catdir("\"C:\\Program Files\"", "My Program"), "test.txt");
print "Test cat: $testcat\n";

结果如下。请注意引号不正确且路径分隔符错误。

Test cat: "C:/Program Files"/My Program/test.txt

这是我在 Windows 系统上的专家(或错误):

Test cat: "C:\Program Files\My Program\test.txt"

类似的问题也有,不过好像都是一次性的。例如How to handle filenames with spaces?说要为 Windows 手动添加引号。我正在寻找执行此操作的 Perl 例程。

最佳答案

我不确定您是如何设法获得您描述的输出的。在 Windows 上我得到:

Test cat: "C:\Program Files"\My Program\test.txt

在 OSX 上,我得到:

Test cat: "C:\Program Files"/My Program/test.txt

您使用的是哪个操作系统和 Perl 版本?您是否可能遗漏了脚本的一些相关部分。


你的 example显示对 Perl 中引用和转义字符串的混淆。将它分解成更小的部分以查看发生了什么并稍后将这些部分放在一起可能会有所帮助:

print "\"C:\\Program Files\""

"C:\Program Files"

这可能是您所期望的。它使用原始插值来构建您要使用的字符串。注意:您可以使用非内插字符串来简化此语句:

print '"C:\Program Files"'

附加目录,您开始使用 File::Spec:

use File::Spec::Functions;
print catdir('"C:\Program Files"', "My Program")

"C:\Program Files"\My Program

这就是事情变得时髦的地方。 catdir expects a list of directories ,但您提供的字符串几乎肯定不是目录作为列表中的第一项。

鉴于您在目录前添加了 C:\ 卷,您很有可能真的想使用 catpath function :

  • catpath()

    Takes volume, directory and file portions and returns an entire path. Under Unix, $volume is ignored, and directory and file are concatenated. A '/' is inserted if need be. On other OSes, $volume is significant.

      $full_path = File::Spec->catpath( $volume, $directory, $file );
    

如果有空格,结果字符串将不能直接在命令行上使用,因为 Perl 做了一些相当 Unixish 的假设。但作为 related question 的答案指出,您可以在构造路径后插入双引号。事实证明,双引号在 OSX 和 Linux 上转义保护空间;您无需转义每个单独的空间。

或者,使用专为完成您尝试做的任何事情而设计的模块。 File::Copy例如,在解决跨平台问题方面做得很好。

关于Perl函数用空格规范化路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36249057/

相关文章:

ruby - 如何检查文件是否存在

java - 带有时间段的 Logback 文件名模式

使任意字符串成为有效文件名的Python函数

jquery - 如何使用 window.location 高亮显示事件菜单项?

perl - 如何在 .proverc 中指定规则?

regex - 如何从一行中提取多个非贪婪正则表达式匹配部分?

perl - Mojolicious 模板的测试覆盖率

regex - 如何在 Perl 正则表达式中捕捉一个点?

linux - Linux下文件名转换的Shell脚本

bash - 为什么这种花括号和双引号的组合在 bash 中不起作用?