匹配数组Perl的多个元素

时间:2013-06-11 10:38:17

标签: arrays perl match elements

我正在使用File::Find搜索目录。然后,我想使用@ARGV来匹配用户输入的字词。我只想要第一个到第二个最后一个元素用于匹配(最后是输出名称)。我虽然我的代码可以工作,但它不是,任何想法?

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

感谢。

2 个答案:

答案 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

文档:popjoinquotemeta

答案 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]