Perl处理目录分隔符

9

我确实应该知道这个,但我主要使用的是Linux、Mac OS X和Windows,它们都使用正斜杠 (/) 作为目录分隔符 (Windows 可以使用 \/ )。

这意味着当我通常在Perl中编写程序时,我可以简单地使用 / 作为目录分隔符,一切都很好。然而,我知道 File::Spec 应该允许文件分隔符的可移植性 (不管这是什么意思)。

如果我在一个不使用正斜杠作为目录分隔符的系统上,我知道用户希望能够输入默认分隔符的文件,并看到默认分隔符的输出。(例如,Windows 用户将输入并期望输出为 C:\Users\smith\Documents 而不是 C:/Users/smith/Documents),但是Perl在内部做了什么呢?

例如,我有一个名为 $dir 的目录和一个名为 $file 的文件,我想打开这个文件。我是否可以在处理文件时,尽管平台可能使用不同的目录分隔符,仍然使用正斜杠?例如,我可以说 $dir/file,还是必须使用 File::Spec 来连接名称?

事实上,Perl程序是否需要目录名中的正斜杠?我正在编写一个模块,并将文件名传递给调用程序。我应该将文件名作为 /foo/bar/fubar 给出,还是如果系统使用冒号 (如早期的Macintosh OS) ,则使用 :foo:bar:fubar


3
你将会如何处理这些路径?如果是用于读写文件,那么 / 是可以的,Perl 会理解你的意思。如果你正在构建要由主机计算机命令 shell 或该系统上其他程序解析的命令,则需要遵守该平台的规则,而 File::Spec 可以提供帮助。 - Eric Strom
1个回答

7

perlport 提供了关于这个主题的几乎所有信息。尽管如此,无法接受/作为路径分隔符的系统很少见,您可能没有太多收益,可以不必在任何地方都忠实地使用File::Spec。但是请注意区分目录分隔符的内部和外部用途。例如,这将在Windows上运行:

open my $fh, '<', 'C:/some/directory/to/some/file';

但是这可能不行,因为它需要由Windows shell处理:
system("C:/some/program.exe C:/some/program/argument.txt");

感谢提供Perlport的链接。我了解到关于unlink和VMS的一些有趣的东西。我的程序将文件/目录名称返回给调用程序,所以我不太担心外部名称,但我可能会添加这个选项。 - David W.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接