【发布时间】: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 数组中查找某些模式并使用 sed 命令并将输出另存为另一个数组,如下面的数组
my @modifiedfiles=`echo @files | grep -E '(DataFiles|Pfgas|Startups)' | sed -e 's/.*something//g; s/#.*$//g;'`
【问题讨论】:
你没有 - 这没有任何意义:)
Perl 有 grep 和 map 内置:
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 grep 和 map 的行为与命令行 grep 和 map 不同。有关详细信息,请参阅文档:
如果你真的想这样做,可以这样做:
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 过滤掉一个文件,脚本甚至会开始阻塞。
【讨论】:
s/.*something//g for @filteredfiles
请不要,只使用内置 Perl 函数:
@modifiedfiles = map({
s/.*something//g;
s/#.*$//g;
} grep({
/DataFiles|Pfgas|Startups/
} @files));
【讨论】: