是否存在此子例程(使用不是根目录的有效路径调用)不返回父目录的情况?
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)
并继承了它的一些怪癖。尽管它有它的名字,但它并不总是像您期望的那样返回目录名称。为了安全起见,如果您想要路径的目录名称,请使用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
+----------------+-----------+---------------+
如果提供了简单目录和文件路径的绝对路径(没有尾部斜杠),则路径类似于第一个测试,这意味着始终返回父目录。