-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'파일 만 검색하려고합니다. 그 조건을 어디에 두어야합니까?
어? 나는 네가 방금 말한 것을 전혀 모른다. 14 시간 후에 4 개의 downvotes 및 응답 없음으로 판단해서, 나는 혼란스러워하는 유일한 사람이 아니다. 성취하려는 것을 더 명확하게 설명하십시오. "사용자가 'tmp *'"를 입력하면 어디서, 어떻게, 왜? "그것은 ...", 어디서, 그리고 왜 검색합니까? 나는 당신이하려는 일이 아마도 매우 간단하다는 느낌을 가지고 있지만, 아무도 당신이 말하는 것을 이해할 수는 없습니다. –