0

File::Find用来搜索目录。然后我想用它@ARGV来匹配用户输入的术语。我只希望使用第一个到倒数第二个元素进行匹配(最后一个是输出名称)。我虽然我的代码可以工作,但它不是,有什么想法吗?

if ($File::Find::name =~ m/$_/ for @ARGV[0..-2]){
    #manipulate filenames
}

谢谢。

4

2 回答 2

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

文档:popjoinquotemeta

于 2013-06-11T11:10:17.197 回答
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]

于 2013-06-11T10:47:51.577 回答