我的作业比标题更深入一点,但标题是我的主要问题。这是作业:
编写一个 perl 脚本,该脚本将对文件/目录列表中的所有常规文件以及文件/目录列表中目录下的所有常规文件中所有出现的正则表达式进行 grep。如果文件不是 TEXT 文件,则应首先通过 unix 命令字符串(无开关)对该文件进行操作,然后搜索结果行。如果 -l 开关只给出了包含正则表达式的文件的文件名,则每行一个。在这种情况下,一个文件名最多应出现一次。如果未给出 -l 开关,则应打印所有匹配的行,每行都以文件名和冒号开头。从命令行调用的示例:
plgrep 'ba+d' file1 dir1 dir2 file2 file3 dir3
这是我的代码:
#!/usr/bin/perl -w
use Getopt::Long;
my $fname = 0;
GetOptions ('l' => \$fname);
$pat = shift @ARGV;
while (<>) {
if (/$pat/) {
$fname ? print "$ARGV\n" : print "$ARGV:$_";
}
}
到目前为止,除了读取非文本文件并在使用 -l 开关时打印出文件名的副本之外,该代码完成了它应该做的所有事情。这是我在命令行输入以下内容后的输出示例:plgrep 'ba+d' file1 file2
- 文件1:我的狗很坏。
- 文件 1:我的狗非常棒。
- file2:我吉他不好。
- file2:虽然吉他弹得不好,但弹起来还是很有趣的!
这是完美的!但是当我使用 -l 开关只打印文件名时,这是我在命令行上输入以下内容后得到的:plgrep -l 'ba+d' file1 file2
- 文件 1
- 文件 1
- 文件2
- 文件2
我如何摆脱那些重复的,所以它只打印:
- 文件 1
- 文件2
我试过了:
$pat = shift @ARGV;
while (<>) {
if (/$pat/) {
$seen{$ARGV}++;
$fname ? print "$ARGV\n" unless ($seen{$ARGV} > 1); : print "$ARGV:$_";
}
}
但是当我尝试在没有 -l 开关的情况下运行它时,我只会得到:
- 文件1:我的狗很坏。
- file2:我吉他不好。
我也试过:
$f名称?打印 "$ARGV\n" 除非 ($ARGV > 1) : 打印 "$ARGV:$_";
但我一直在 plgrep 第 17 行出现语法错误,靠近 ""$ARGV\n" unless"
如果有人可以帮助我解决我的重复问题以及作业的斜体部分,我将非常感激。我什至不知道从那个斜体部分开始。