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