代码之家  ›  专栏  ›  技术社区  ›  javamonkey79

一个在Perl中访问数组元素的行程序?

  •  1
  • javamonkey79  · 技术社区  · 14 年前

    我有以下几点:

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

    因为我不再使用@path,所以我想用一行(和其他语言一样),如:

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

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

    编辑:只是为了清楚-我从哪里运行脚本,我知道有些东西是不变的(目录结构、名称等)。也就是说,验证是很好的,但是在这个场景中,验证比它的价值更混乱;这要感谢那些以任何方式提交错误检查的解决方案的人。

    4 回复  |  直到 14 年前
        1
  •  5
  •   Community Dunja Lalic    7 年前

    应该是:

    use Cwd;
    ...
    
    my $grandParent = ( split '/', getcwd ) [-2];
    

    附录: 另一种方式(更像是“珍珠”):

    ...
    
    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
  •  6
  •   zigdon    14 年前

    将拆分结果放入临时列表:

    my $grandParent = (split( "/", getcwd ))[-2];
    
        3
  •  4
  •   tchrist    14 年前

    要记住的精简:

    1. 您必须考虑到没有返回足够的列表元素,以及当适用的元素最终成为空字符串时。
    2. split() _的第一个参数是一个模式,而不是字符串,因此您应该通过将其作为匹配操作写入来提醒人们。
    3. getcwd() 是一个空函数,而不是一个空词,所以应该使用空parens来提醒人们。

      $grandparent = ( split(m{ / }x, getcwd()) )[-2] || "/";
      

    这在非POSIX文件系统上不起作用;相反,请参见 File::Spec .

    请忽略So__的白痴色彩证明主义,它弊大于利。

        4
  •  2
  •   Alan Haggai Alavi    14 年前

    一种便携的方式是使用 splitdir 方法 File::Spec :

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