Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Perl模块文件:带STDIN管道的Slurp_Bash_Perl_Stdin - Fatal编程技术网

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

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

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

我想改变它以适应管道(即STDIN),以便它可以在一系列管道操作的中间: 例如:

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;
}