可能是一个非常简单的问题:
我有一个 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
但这不起作用:在替换中使用未初始化的值 $text (s///) at
使用分数符号也不起作用:
cat input.txt | perl sed.perl -
最佳答案
@ARGV
不做你认为它做的事。它实际上是传递给 perl 的参数。
例如:
myscript.pl some arg
@ARGV
将主持'some', 'arg'
。
你想要的是STDIN
文件句柄。
例如
#!/usr/bin/perl
use strict;
use warnings;
while ( <STDIN> ) {
s/something/somethingelse/g;
print;
}
现在,它正在执行的操作是读取 STDIN
逐行。您的模式包括 \n
。你真的需要它吗?看起来您“只是”将其用作线 anchor ,因此您可以使用:
s/\.\)$/'\.'\)/g;
$
是“行尾”的正则表达式 - 请参阅 perlre
了解更多。
但是,正如 reinierpost 的评论中所述- 还有一件事可能很有用 - Perl 有“钻石运算符”<>
它做了两件事:
- 如果为脚本指定了文件名,则打开它们并从中读取。
- 如果未指定参数,则读取
STDIN
。
所以你可以这样做:
while ( <> ) {
s/something/somethingelse/g;
print;
}
然后您的脚本可以通过以下方式调用:
cat input.txt | ./yourscript.pl
或者:
./yourscript.pl input.txt
你会得到相同的结果。
关于perl - 如何在终端管道中运行 perl 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30169496/