学习perl,这行做什么?

时间:2014-02-12 16:30:09

标签: regex perl

my @file = grep { (/\.EW/i || /\.NS/i || /\.UD/i) }readdir(DIR);

我试图了解正则表达式以及grep和readdir如何相互关联。

4 个答案:

答案 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.extfile.nst,依此类推。因此,如果这些是*扩展,那么最好执行以下操作:

file.nsx

/\.(?:ew|ns|ud)$/i 表示字符串的结尾(或记录分隔符之前)。

即使您希望保留所有行为,并希望所有扩展开始这些序列,最好将其设为显式,然后编写表达式如:$/\.(?:ew|ns|ud)\w*$/表示0个或更多“单词字符”(字母,数字+下划线))。

答案 2 :(得分:2)

  1. 目录首先open,其句柄为DIR
  2. readdir生成已打开目录内容的列表 - 文件名和目录名
  3. grep隐式计算其代码块中针对每个列表项的表达式(保存在Perl的默认标量$_中)。在这种情况下,一组正则表达式不区分大小写尝试匹配每个列表项中的“.EW”,“。NS”或“.UD”。
  4. 如果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)