【发布时间】:2013-02-18 04:56:46
【问题描述】:
我的作业比标题更深入一点,但标题是我的主要问题。这是作业:
编写一个 perl 脚本,该脚本将对文件/目录列表中的所有常规文件以及文件/目录列表中目录下的所有常规文件中所有出现的正则表达式进行 grep。 如果文件不是 TEXT 文件,则应首先通过 unix 命令 strings 操作该文件(无开关)并搜索结果行。 如果 -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
- file1:我的狗坏了。
- file1:我的狗非常棒。
- 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 开关的情况下运行它时,我只会得到:
- file1:我的狗坏了。
- file2:我的吉他不好。
我也试过了:
$fname ?打印 "$ARGV\n" 除非 ($ARGV > 1) : 打印 "$ARGV:$_";
但我在 plgrep 第 17 行,靠近 ""$ARGV\n" 除非"
如果有人可以帮助我解决我的重复问题以及作业的斜体部分,我将不胜感激。我什至不知道从那个斜体部分开始。
【问题讨论】:
标签: perl printing no-duplicates