可能是一个非常简单的问题:
我有一个perl文件sed.perl
,它将字符串作为输入,在那里进行一些替换并将其打印在标准输出上。
#!/usr/bin/perl
use warnings;
use strict;
use diagnostics;
use feature 'say';
#use Cwd;
my ($text) = @ARGV;
$text =~ s/\.\)\n/'\.'\)\n/;
print $text;
我想用终端管道的字符串输出来提供脚本。让我们这样说:
cat input.txt | perl sed.perl
但这不起作用:Use of uninitialized value $text in substitution (s///) at
使用分数符号也不起作用:
cat input.txt | perl sed.perl -
答案 0 :(得分:2)
@ARGV
并不能按照您的想法行事。它实际上是传递给perl的论据。
E.g。 :
myscript.pl some arg
@ARGV
将托管'some', 'arg'
。
你想要的是STDIN
文件句柄。
e.g。
#!/usr/bin/perl
use strict;
use warnings;
while ( <STDIN> ) {
s/something/somethingelse/g;
print;
}
现在正在做的是逐行阅读STDIN
。您的模式包含\n
。你真的需要吗?看起来你只是&#39;只是&#39;使用它作为线锚,所以你可以使用:
s/\.\)$/'\.'\)/g;
$
是&#34;行尾的正则表达式&#34; - 有关详情,请参阅perlre
。
然而,正如reinierpost的评论中所指出的那样 - 另外一件事可能有用 - perl有&#34;钻石运营商&#34; <>
做了两件事:
STDIN
。 所以你可以这样做:
while ( <> ) {
s/something/somethingelse/g;
print;
}
然后您的脚本可以通过以下方式调用:
cat input.txt | ./yourscript.pl
或者:
./yourscript.pl input.txt
你会得到相同的结果。
答案 1 :(得分:0)
您尝试阅读文本就好像它是一个参数一样,实际上对于管道,来自input.txt
的信息将是您从stdin
读取的内容。使用左侧进程中的管道stdout
连接到正确进程的stdin
。