我正在使用File::Find
搜索目录。然后,我想使用@ARGV
来匹配用户输入的字词。我只想要第一个到第二个最后一个元素用于匹配(最后是输出名称)。我虽然我的代码可以工作,但它不是,任何想法?
if ($File::Find::name =~ m/$_/ for @ARGV[0..-2]){
#manipulate filenames
}
感谢。
答案 0 :(得分:3)
为什么要在这里使用$File::Find::name
?这是相对路径,而不仅仅是文件名。我假设您正在尝试匹配文件名。这是你做的:
my $output = pop @ARGV; # now you can use @ARGV freely
my $regex = join "|", # join by alternations
map quotemeta, # disable meta characters
@ARGV; # list of file names
find(sub {
/$regex/i or return; # quick check
# manipulate files...
}, $dir);
您可以进行调整,例如禁用元字符,是否使用不区分大小写/.../i
。
答案 1 :(得分:1)
EXPR for LIST
是一个陈述,而不是表达。 if (COND) {BLOCK}
期望COND
成为表达式。
您可以通过do {BLOCK}
将一个块嵌入到表达式中,但这不会完全符合您的要求。
如果您想表达“如果列表中的任何项目匹配则操纵文件名”,请执行
if (grep { $File::Find::name =~ /$_/ } LIST) { ... }
如果您想表达“如果列表中的所有项目都匹配则操纵文件名”,请执行
if (not grep { not $File::Find::name =~ /$_/ } LIST) { ... }
你不能像@array[0..-2]
那样对数组进行切片,因为范围运算符在数组下标中并不特殊;从0到-2的范围是空的。相反:@array[0 .. @array-2]
。