2013-07-28 115 views
-4

我正在通過-f選項接受用戶輸入,無論他輸入什麼內容,都會遞歸搜索相應的文件。在Perl中查找匹配模式的文件

我的問題是:當用戶輸入「tmp *」時,它也搜索「abctmp」,「xyztmp」等。我想要做的只是以tmp開頭的文件來。 總之,無論用戶輸入相應的文件都應該推送到數組。

目前我正在這樣做,但我確信有一些優雅,簡短的方法來做到這一點。

#! /perl/bin/perl 
use strict; 
use warnings; 
use File::Find; 
use getopt::Long; 

my $filename="tmp*.txt"; 
find({ wanted  => \&wanted, 
     preprocess => \&dir_search, 
}, '.'); 

sub wanted{ 
    my $regex; 
    my $myop; 
    my @mylist; 
    my $firstchar= substr($filename, 0,1); # I am checking first character. 
              # Whether it's ".*tmp" or just "tmp*" 

    if($filename=~ m/[^a-zA-Z0-9_]/g){  #If contain wildcard 
     if($firstchar eq "."){    # first character "." 
      my $myop = substr($filename, 1,1); 
      my $frag = substr($filename,2); 
      $filename = $frag; 
      $regex = '\b(\w' . ${myop}. ${filename}. '\w*)\b'; 
      # Has to find whatever comes before 'tmp', too 
     } else { 
      $regex = '\b(' . ${myop}. ${filename}. '\w*)\b'; 
      # Like, "tmp+.txt" Only search for patterns starting with tmp 
     } 
     if($_ =~ /$regex/) { 
      push(@mylist, $_); 
     } 
    } else { 
    if($_ eq $filename) { #If no wildcard, match the exact name only. 
     push(@mylist, $_); 
    } 
} 

} 

sub dir_search { 
    my (@entries) = @_; 
    if ($File::Find::dir eq './a') { 
     @entries = grep { ((-d && $_ eq 'g') || 
         ((-d && $_ eq 'h') || 
        (!(-d && $_ eq 'x')))) } @entries; 
    # Want from 'g' and 'h' folders only, not from 'x' folder 
    } 
    return @entries; 
} 

而另一件事是,我只想搜索'.txt'文件。我應該在哪裏放置這種情況?

+0

咦?我不知道你剛剛說了什麼。從4次下降看,14小時後沒有答案,我不是唯一一個感到困惑的人。請嘗試更清楚地解釋你想要完成的事情。 「當用戶輸入'tmp *'」在哪裏,如何以及爲什麼? 「它搜索...」在哪裏,如何以及爲什麼?我有這樣的感覺,你想要做的事可能很簡單,但沒有人能弄清楚你想說什麼。 –

回答

1
#!/perl/bin/perl 

sub rec_dir { 
    ($dir,$tmpfile_ref) = @_; 
    opendir(CURRENT, $dir); 
    @files = readdir(CURRENT); 
    closedir(CURRENT); 

    foreach $file (@files) { 
     if($file eq ".." || $file eq ".") { next; } 
     if(-d $dir."/".$file) { rec_dir($dir."/".$file,$tmpfile_ref); } 
     elsif($file =~ /^tmp/ && $file =~ /\.txf$/) { push(@{$tmpfile_ref},$dir."/".$file); } 
    } 
} 

@matching_files =(); 
$start_dir = "."; 
rec_dir($start_dir,\@matching_files); 
foreach $file (@matching_files) { print($file."\n"); } 

我沒有測試它。除了印刷錯誤,我認爲它會起作用。