首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl模块文件:带有STDIN管道的Slurp

Perl模块文件:带有STDIN管道的Slurp
EN

Stack Overflow用户
提问于 2017-09-11 14:29:08
回答 2查看 214关注 0票数 0

我刚刚尝试使用以下Perl脚本使用File::Slurp模块进行一些文本替换。它在命令行(BASH)中作为参数提供的单个文件上工作得很好。

代码语言:javascript
复制
#!/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脚本的最佳方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-11 15:24:22

要让脚本在管道中工作,可以检查STDIN是否连接到tty

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2017-09-11 16:26:28

你所需要的只是以下几点:

代码语言:javascript
复制
local $^I = '';

while (<>) {
  s/foo/bar/g; 
  print;
}

这基本上与perl -i -pe's/foo/bar/'相同,只是它在使用STDIN时不发出警告。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46158140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档