在文件名Perl

时间:2015-07-23 14:41:15

标签: regex perl

我目前正在尝试查找包含所请求的特定字符串的文件名。例如,我有一个字符串companyABC,我希望在文件名中搜索目录中的这个字符串。然后我希望它返回我正在寻找的文件。

我尝试了以下使用正则表达式但是没有得到一个字符串,它只是检查我不想要的任何顺序的那些字母:

$foundFile = grep(/[comapnyABC]/i, readdir Dir);

有没有办法在perl文件中搜索某个字符串并返回该文件名?

2 个答案:

答案 0 :(得分:3)

你非常接近,你只是遇到了一些问题。

首先,这些方括号正在改变你的正则表达式的含义。一对方括号定义了一个"字符类" - 这是一组要匹配的字符。如果正则表达式找到任何一个这些字符,它们将匹配。所以你正在寻找一个' c'或者是' o或者是' m' ......等等,显然不是你想要的。所以失去那些括号。

$foundFile = grep(/comapnyABC/i, readdir Dir);

但那仍然没有给你你想要的东西。您不会返回文件名,而是获得找到的匹配数。如果您阅读the documentation for grep,就会看到它:

  

评估LIST的每个元素的BLOCK或EXPR(本地   将$_设置为每个元素并返回包含的列表值   表达式评估为true的那些元素。在   标量上下文,返回表达式的次数   真。

您将调用grep的结果分配给标量变量。这意味着您在标量上下文中将其称为 ,这就是您获得匹配数量的原因。要获得实际匹配,您需要在列表上下文中调用它。你可以通过几种方式做到这一点。最简单的方法是将结果分配给数组。

@foundFiles = grep(/comapnyABC/i, readdir Dir);

数组@foundFiles将包含与正则表达式匹配的所有文件名。但听起来你只希望有一个文件名匹配。所以你可以这样做:

($foundFile) = grep(/comapnyABC/i, readdir Dir);

这里唯一的区别是围绕$foundFile的括号。通常在Perl中,括号的存在与否没有区别,但在这里它们会产生重要的差异。他们将赋值分配到列表赋值,这意味着在列表上下文中调用grep,因此(如文档所述)返回实际匹配,而不仅仅是计数。

答案 1 :(得分:2)

[companyABC]定义与这十个字符中的任何一个匹配的字符集:companyABC。因此,如果任何文件名匹配这十个字符中的任何一个,它将匹配。 (或者八个字符中的任何一个,因为你正在进行不区分大小写的匹配,并且A / a和C / c都在列表中)

你想要

@matching_files = grep { /companyABC/i } readdir DIR;