如何在终端管道中运行perl文件

时间:2015-05-11 13:52:03

标签: perl terminal

可能是一个非常简单的问题: 我有一个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 -

2 个答案:

答案 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