使用cmd和管道参数进行Perl过滤

时间:2017-11-05 22:15:06

标签: regex perl stdin argv

我正在编写一个Perl脚本(filter.pl),用于过滤STDIN上显示的数据,将所有出现的一个字符串更改为另一个字符串并输出所有输入行,更改并更改为STDOUT。我的用法如下:

USAGE: ./filter.pl 'FROMSTRING' 'TOSTRING'

例如,以下是我运行脚本的方法:

echo "this is a test" | filter.pl 'a' '@'
#output: "this is @ test"

到目前为止,这是我的代码:

#!/usr/bin/perl
use strict;
use warnings;

#Verify two cmd arguments are present.     
if ($#ARGV !=2)
    {
    print "Usage: ./filter.pl FROMSTRING TOSTRING";
    exit(1);
    }

#read from STDIN, replace FROMSTRING with TOSTRING, then print output
while (<>)
    {
    s/$ARGV[0]/$ARGV[1]/gi;
    print $_;
    exit(0);
    }

基本上这个脚本使用“(STDIN)”来读取每一行输入,使用$ _来访问每一行读取,使用“s ///将所有出现的FROMSTRING更改为TOSTRING,然后打印出来。

当我从命令行运行时,出现错误:找不到命令。我怀疑这是因为我不知道Perl中管道输入和调用参数之间的区别?还想知道我是否在这个正确的轨道上。

感谢。

1 个答案:

答案 0 :(得分:2)

<><ARGV>的简写,其中ARGV是特殊的文件句柄,可以引用标准输入,也可以引用@ARGV中所有文件名的输入流

由于您的脚本将@ARGV用于指定输入文件以外的目的,因此您无法使用ARGV来读取标准输入。您应该明确使用<STDIN>来读取标准输入而不是<>

while (<STDIN>)
{
    s/$ARGV[0]/$ARGV[1]/gi;
    print $_;
    exit(0);       # <---- this probably belongs outside the loop
}