【问题标题】:using unix commands like grep and sed for the perl array对 perl 数组使用 grep 和 sed 等 unix 命令
【发布时间】:2016-09-21 04:45:21
【问题描述】:

如何在 perl 数组中查找某些模式并使用 sed 命令并将输出另存为另一个数组,如下面的数组

my @modifiedfiles=`echo @files | grep  -E '(DataFiles|Pfgas|Startups)' | sed -e 's/.*something//g; s/#.*$//g;'` 

【问题讨论】:

    标签: perl unix sed grep


    【解决方案1】:

    你没有 - 这没有任何意义:)

    Perl 有 grepmap 内置:

    my @filteredfiles = grep { /(DataFiles|Pfgas|Startups)/ } @files;
    my @modifiedfiles = map { s/.*something//g; s/#.*$//g; $_ } @filteredfiles;
    

    也可以一步完成:

    my @modifiedfiles =
        map { s/.*something//g; s/#.*$//g; $_ }
        grep { /(DataFiles|Pfgas|Startups)/ } @files;
    

    但是 Perls grepmap 的行为与命令行 grepmap 不同。有关详细信息,请参阅文档:

    如果你真的想这样做,可以这样做:

    use IPC::Open2;
    
    $pid = open2(\*CHLD_OUT, \*CHLD_IN,
        "grep  -E '(DataFiles|Pfgas|Startups)' | sed -e 's/.*something//g; s/#.*$//g;"
    );
    
    for my $file (@files) {
        print CHLD_OUT $file."\n";
        my $result_fn = <CHLD_IN>;
        chomp $result_fn;
        push @modifiedfiles, $result_fn;
    }
    

    不,你不想这样做 :) 它有很多缺点和很高的失败风险。我假设如果grep 过滤掉一个文件,脚本甚至会开始阻塞。

    【讨论】:

    • 这是一个很好的答案,有一步一步的建议和。文档链接 +1 :-)
    • 可能值得一提的就地能力s/.*something//g for @filteredfiles
    【解决方案2】:

    不要,只使用内置 Perl 函数:

    @modifiedfiles = map({
      s/.*something//g;
      s/#.*$//g;
    } grep({ 
      /DataFiles|Pfgas|Startups/
    } @files));
    

    【讨论】:

    • Unmatched ) 在正则表达式中;标记为,我收到此错误!
    猜你喜欢
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多