我目前正在尝试查找包含所请求的特定字符串的文件名。例如,我有一个字符串companyABC
,我希望在文件名中搜索目录中的这个字符串。然后我希望它返回我正在寻找的文件。
我尝试了以下使用正则表达式但是没有得到一个字符串,它只是检查我不想要的任何顺序的那些字母:
$foundFile = grep(/[comapnyABC]/i, readdir Dir);
有没有办法在perl文件中搜索某个字符串并返回该文件名?
答案 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]
定义与这十个字符中的任何一个匹配的字符集:c
或o
或m
或p
或a
或n
或y
或A
或B
或C
。因此,如果任何文件名匹配这十个字符中的任何一个,它将匹配。 (或者八个字符中的任何一个,因为你正在进行不区分大小写的匹配,并且A / a和C / c都在列表中)
你想要
@matching_files = grep { /companyABC/i } readdir DIR;