一个内衬来访问perl中的数组元素?

时间:2010-11-05 19:19:27

标签: perl

我有以下内容:

my @path = split( "/", getcwd );
my $grandParent = $path[-2];

我想在一行中(就像在其他语言中一样),因为我没有再次使用@path,如下所示:

my $grandParent = split( "/", getcwd )[-2];

这可能吗?如果是这样,怎么样?

编辑:只是为了清楚 - 我在运行脚本的地方,我知道有些东西将是不变的(目录结构,名称等)。话虽这么说,验证很好,但在这种情况下比它的价值更加混乱;感谢那些提交错误检查解决方案的人。

4 个答案:

答案 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)

要记住的细节:

  1. 您必须考虑到没有获得足够的列表元素,以及适用的元素最终成为空字符串的时间。
  2. split()的第一个参数是一个模式,而不是一个字符串,所以你应该通过将它写为匹配操作来提醒人们。
  3. getcwd()是一个无效的函数,所以你应该用空的parens来提醒人们。

    $grandparent = ( split(m{ / }x, getcwd()) )[-2] || "/";
    
  4. 这不适用于非POSIX文件系统;相反,请参阅File::Spec

    请忽略SO的愚蠢的色彩化,这弊大于利。

答案 3 :(得分:2)

便携式方法是使用File::Specsplitdir方法:

use Cwd;
use File::Spec;

my $grand_parent = ( File::Spec->splitdir( getcwd() ) )[-2] || File::Spec->rootdir();