我正在编写一个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中管道输入和调用参数之间的区别?还想知道我是否在这个正确的轨道上。
感谢。
答案 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
}