work, study, life ..........

Monday, April 13, 2009

Perl学习之: 模仿grep指令

最近用perl写了一个模仿grep指令的小程序,其功能是可以在多级目录下或文件中查找指定的字符串,并打印出所在对应文件的行数.可以根据需求修改一些小地方,作为删除多级目录指定的文件用.由于自身的水平不够,写的不是很好,欢迎提出意见,共同学习进步!

使用方法,先任意命名,例如 search.plx,贴入下面的代码,授予执行权限.

$ search.plx "字符串" 目录名/文件

可以指定多个目录或者是文件名。

代码如下,经过测试的:

#!/usr/bin/perl
#
##############################
#Author: jeremy
#Email: jiang313hua@gmail.com
###############################

use warnings;
use strict;

die "Usage: $0 \n" unless #@ARGV < 2 ;
my $strings = $ARGV[0];
my $para;

shift @ARGV;

foreach $para(@ARGV){
if ( -d $para){
search_dir($para);
}elsif ( -f $para) {
search_file($para);
}else{
print "Don't search.\n";
}
}

sub search_file {
my $flname = shift;
open FL, "$flname" or die "Can't open the file: $!";
my $line = 1;
while (){
if ($_ =~ /$strings/){
print "FILENAME: $flname contains strings($strings) in the $line lines!\n";
}
$line += 1;
}
close(FL);
}

sub search_dir {
my $dirs=shift;
my $flname;

opendir DH, "$dirs" or die "Couldn't open the directory -- $dirs: $!";
my @arry = readdir(DH);

foreach $flname (@arry){
next if "$flname" eq "." or "$flname" eq "..";

if ( -f "$dirs/$flname" ) {
open FL,"$dirs/$flname";
my $line = 1;
while (){
if ($_ =~ /$strings/){
print "FILENAME: $dirs/$flname contain strings ($strings) in the $line lines!\n";
}
$line += 1;
}
close(FL);
}

if ( -d "$dirs/$flname" ) {
my $dir = "$dirs" . "/$flname";
search_dir($dir);
}

}
closedir(DH);
}

No comments: