Bash Perl模块文件:带STDIN管道的Slurp
我刚刚尝试使用以下Perl脚本使用File::Slurp模块进行一些文本替换。它可以在命令行(BASH)中作为参数提供的单个文件上正常工作 我想改变它以适应管道(即STDIN),以便它可以在一系列管道操作的中间: 例如:Bash Perl模块文件:带STDIN管道的Slurp,bash,perl,stdin,Bash,Perl,Stdin,我刚刚尝试使用以下Perl脚本使用File::Slurp模块进行一些文本替换。它可以在命令行(BASH)中作为参数提供的单个文件上正常工作 我想改变它以适应管道(即STDIN),以便它可以在一系列管道操作的中间: 例如: command blah | | | |我的perl脚本| sort | uniq | wc.. 更改Perl脚本以实现此目的的最佳方法是什么,同时保留在命令行上处理单个文件的现有功能?要使脚本在管道中工作,可以检查STDIN是否连接到tty: use strict; use
command blah | | | |我的perl脚本| sort | uniq | wc..
更改Perl脚本以实现此目的的最佳方法是什么,同时保留在命令行上处理单个文件的现有功能?要使脚本在管道中工作,可以检查
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];
}
}
使用严格;
使用警告;
使用文件::Slurp qw(编辑文件行);
sub my_edit_func{s/foo/bar/g;print$}
如果(!(-t标准差)){
while(){my_edit_func}
}
否则{
foreach my$argnum(0..$#ARGV){
编辑文件行{my_edit_func}$ARGV[$argnum];
}
}
有关
-t
文件测试操作符的更多信息,请参阅 您只需要以下内容:
local $^I = '';
while (<>) {
s/foo/bar/g;
print;
}
local$^I='';
而(){
s/foo/bar/g;
印刷品;
}
这与
perl-i-pe的/foo/bar/'
基本相同,只是在使用STDIN时它不会发出警告。是的,但我发现没有任何东西解决了我的具体问题。使用File::Slurp模块的限制排除了以下答案。您是否不明白-pi
的作用,或者您必须使用File::Slurp
执行此任务还有其他原因?我已编辑了您的问题,以便在代码中添加缩进。不客气,不过下次请你自己做。如果您要求一大群人阅读并理解您的代码,那么尽可能让代码易于理解肯定是礼貌之举。我建议不要使用File::Slurp。它有巨大的问题,而且看起来它们不会很快得到修复(例如,编码完全被破坏)。@mob,是的,我一直在使用命令行perl-pi,但日益增加的复杂性让我想学习如何用一个合适的perl脚本来做这件事。我给出的例子只是一个最小的例子,我知道这个构造,我的问题需要使用File::Slurp包。但是@melpomene的评论让我觉得我可能需要避开这个包。这回答了这个问题,因为它允许我使用File::Slurp包(或者,一般来说,其他包)。
local $^I = '';
while (<>) {
s/foo/bar/g;
print;
}