在 Perl 中,/
总是保留作为目录分隔符(除了旧的 Mac OS系统[6-9] 坚持它是:
)。但是,在其他操作系统中,也可以使用其他符号。例如,在 Windows 机器上,它们都指向同一个目录:
$file = 'C:\this\that\foo.txt';
$file = "C:/this/that/foo.txt";
/
因此,除非您碰巧在旧 Mac 上,否则您应该始终怀疑这是一个目录说明符。而且,您还应该弄清楚该系统上当前的路径分隔符可能是什么,并寻找那个。
我希望File::Spec或File::Path可能有一些函数或方法来显示首选目录分隔符的名称,但没有记录。
翻看各个File::Spec
子模块的代码,发现实际的文件分隔符是硬编码的,功能比我想象的要复杂。没有特殊的隐藏功能。德拉特。
然而,好消息是这File::Spec
是一个标准模块,所以没有理由担心它。它甚至包含在 Perl 5.8.8 中。您不必担心它可能无法安装。
我做了一个简单的测试:
#! /usr/bin/env perl
#
use strict;
use warnings;
use feature qw(say);
use File::Spec;
while ( my $file = <DATA> ) {
chomp $file;
my ( $volume, $directory, $file ) = File::Spec->splitpath( $file );
if ( $directory ) {
say qq('$volume' '$directory' '$file' contains directory stuff);
}
else {
say qq('$volume' '$directory' '$file' is pure file);
}
}
__DATA__
Foo/Bar.txt
/Bar.txt
Bar.txt/
Foo_Bar.txt
结果是:
'' 'Foo/' 'Bar.txt' contains directory stuff
'' '/' 'Bar.txt' contains directory stuff
'' 'Bar.txt/' '' contains directory stuff
'' '' 'Foo_Bar.txt' is pure file
似乎只要出现目录分隔符,该字符串就被视为文件。我想这是有道理的。
这是最终比您意识到的要复杂得多的任务之一(例如确定字符串是有效的电子邮件地址还是数字)。您最好的选择是使用File::Spec->split
并确保没有设置卷或目录。