我有以下内容:
my @path = split( "/", getcwd );
my $grandParent = $path[-2];
我想在一行中(就像在其他语言中一样),因为我没有再次使用@path,如下所示:
my $grandParent = split( "/", getcwd )[-2];
这可能吗?如果是这样,怎么样?
编辑:只是为了清楚 - 我在运行脚本的地方,我知道有些东西将是不变的(目录结构,名称等)。话虽这么说,验证很好,但在这种情况下比它的价值更加混乱;感谢那些提交错误检查解决方案的人。答案 0 :(得分:6)
将拆分结果放在临时列表中:
my $grandParent = (split( "/", getcwd ))[-2];
答案 1 :(得分:5)
应该是:
use Cwd;
...
my $grandParent = ( split '/', getcwd ) [-2];
<强>附录:强> 另一种方式(不知何故更多'perlish'):
...
my ($parent, $grandParent) = reverse split qr{/}, getcwd();
(考虑到一些tchrist's好的建议)
附录2: 一些评论:
有时,可能根本没有$grandparent
目录。
如果在Unix系统'/'的根目录中使用,则上面会
结果是:
$parent = undef;
$grandParent = undef;
如果在'/'正下方的目录中,例如。 '/ somedir',
$parent = 'somedir';
$grandParent = ''; # empty string
所以你可以检查那个条件。此外,reverse
反转分割路径元素的顺序,所以你了解你
需要查看(现在)前两个元素以了解你的位置。
此致
RBO
答案 2 :(得分:4)
要记住的细节:
split()
的第一个参数是一个模式,而不是一个字符串,所以你应该通过将它写为匹配操作来提醒人们。 getcwd()
是一个无效的函数,所以你应该用空的parens来提醒人们。
$grandparent = ( split(m{ / }x, getcwd()) )[-2] || "/";
这不适用于非POSIX文件系统;相反,请参阅File::Spec
。
请忽略SO的愚蠢的色彩化,这弊大于利。
答案 3 :(得分:2)
便携式方法是使用File::Spec
的splitdir
方法:
use Cwd;
use File::Spec;
my $grand_parent = ( File::Spec->splitdir( getcwd() ) )[-2] || File::Spec->rootdir();