是否存在此子例程(使用非根目录的有效路径调用)不返回父目录的情况?
use Cwd qw( realpath );
use File::Basename qw( dirname );
sub parent_dir {
my $dir = realpath shift;
return dirname $dir;
}
File::Basename
文档提到了这个警告:
dirname
提供此函数是为了与Unix shell兼容命令
dirname(1)
,并继承了它的一些怪癖。尽管它所做的名称NOT总是返回目录名可能会想到。为了安全起见,如果您希望路径的目录名使用fileparse()
。
列举了几个例子,说明了这一点:
+----------------+-----------+---------------+
| Test Path | dirname() | fileparse() |
+----------------+-----------+---------------+
| /foo/bar/baz | /foo/bar | /foo/bar/ | # dirname() works as expected
+----------------+-----------+---------------+
| /foo/bar/baz/ | /foo/bar | /foo/bar/baz/ | # Should have included baz here
+----------------+-----------+---------------+
| foo/ | . | foo/ | # fileparse() wins again
+----------------+-----------+---------------+
如果提供了简单目录和文件路径的绝对路径(没有尾部斜杠),则路径与第一个测试类似,这意味着始终返回父目录。