我File::Find
用来搜索目录。然后我想用它@ARGV
来匹配用户输入的术语。我只希望使用第一个到倒数第二个元素进行匹配(最后一个是输出名称)。我虽然我的代码可以工作,但它不是,有什么想法吗?
if ($File::Find::name =~ m/$_/ for @ARGV[0..-2]){
#manipulate filenames
}
谢谢。
我File::Find
用来搜索目录。然后我想用它@ARGV
来匹配用户输入的术语。我只希望使用第一个到倒数第二个元素进行匹配(最后一个是输出名称)。我虽然我的代码可以工作,但它不是,有什么想法吗?
if ($File::Find::name =~ m/$_/ for @ARGV[0..-2]){
#manipulate filenames
}
谢谢。
为什么要$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
。
是一个语句,而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]
。