我刚刚尝试使用以下Perl脚本使用File::Slurp模块进行一些文本替换。它在命令行(BASH)中作为参数提供的单个文件上工作得很好。
#!/opt/local/bin/perl -w
use File::Slurp qw( edit_file_lines );
foreach my $argnum (0 .. $#ARGV) {
edit_file_lines {
s/foo/bar/g;
print $_
}
$ARGV[$argnum];
}我想修改它以处理管道(即STDIN),以便它可以处于一系列管道操作的中间:例如:
command blah|....|my-perl-script|sort|uniq|wc....
在保留在命令行上处理单个文件的现有能力的同时,更改Perl脚本的最佳方法是什么?
发布于 2017-09-11 15:24:22
要让脚本在管道中工作,可以检查STDIN是否连接到tty
use strict;
use warnings;
use File::Slurp qw( edit_file_lines );
sub my_edit_func { s/foo/bar/g; print $_ }
if ( !(-t STDIN) ) {
while(<>) { my_edit_func }
}
else {
foreach my $argnum (0 .. $#ARGV) {
edit_file_lines { my_edit_func } $ARGV[$argnum];
}
}有关perldoc -X文件测试操作符的更多信息,请参见-t。
发布于 2017-09-11 16:26:28
你所需要的只是以下几点:
local $^I = '';
while (<>) {
s/foo/bar/g;
print;
}这基本上与perl -i -pe's/foo/bar/'相同,只是它在使用STDIN时不发出警告。
https://stackoverflow.com/questions/46158140
复制相似问题