my @file = grep { (/\.EW/i || /\.NS/i || /\.UD/i) }readdir(DIR);
我试图了解正则表达式以及grep和readdir如何相互关联。
答案 0 :(得分:7)
readdir返回DIR中的文件列表,其中DIR是目录的句柄。
grep {}正在将regexp应用于它看到的每个值,匹配的任何内容都放在@files中。
正则表达式本身在文件名中匹配“.EW”,“。NS”或“.US”,不区分大小写。 (为了清楚起见,引用是我的。)
答案 1 :(得分:5)
它,而不是详细,根据是否有一个句点序列,后跟'EW'
,'NS'
或{{}来过滤目录中的所有文件名1}}在文件名中,不参考大小写。 ('UD'
:“忽略大小写”)。
它做同样的事情:
/i
但是,它还允许文件名中的那些序列不是扩展名,而文件名中的节点的开头。这些类型的文件名有时在* nix环境中更常见:(my @files = grep { /\.(?:ew|ns|ud)/i } readdir(DIR);
)。但请注意,我说开始(ht到ikegami),所以它匹配file.ew.action.ext
,file.nst
,依此类推。因此,如果这些是*扩展,那么最好执行以下操作:
file.nsx
/\.(?:ew|ns|ud)$/i
表示字符串的结尾(或记录分隔符之前)。
即使您希望保留所有行为,并希望所有扩展开始这些序列,最好将其设为显式,然后编写表达式如:$
(/\.(?:ew|ns|ud)\w*$/
表示0个或更多“单词字符”(字母,数字+下划线))。
答案 2 :(得分:2)
open
,其句柄为DIR
readdir
生成已打开目录内容的列表 - 文件名和目录名grep
隐式计算其代码块中针对每个列表项的表达式(保存在Perl的默认标量$_
中)。在这种情况下,一组正则表达式不区分大小写尝试匹配每个列表项中的“.EW”,“。NS”或“.UD”。grep
代码中的表达式求值为true,即找到匹配项,则列表项将传递给数组@file
答案 3 :(得分:1)
正则表达式解释说:
/\.EW/i the character '.' followed by the letters "EW" (case insensitive)
|| or
/\.NS/i the character '.' followed by the letters "NS" (case insensitive)
|| or
/\.UD/i) the character '.' followed by the letters "UD" (case insensitive)