2014-02-12 69 views
1
my @file = grep { (/\.EW/i || /\.NS/i || /\.UD/i) }readdir(DIR); 

我试图理解正则表达式以及grep和readdir如何相互关联。学习perl,这行是做什么的?

+1

有什么结果,你用这条线时得到什么?我会建议文档perlfunc,perlre。 – sln

回答

5

它,而冗长,筛选的基础上是否有期,其后无论是'EW''NS',或在一个文件名'UD'的序列,没有参考案例目录中的所有文件名。 (/i:“忽略大小写”)。

它做同样的事情,因为这:

my @files = grep { /\.(?:ew|ns|ud)/i } readdir(DIR); 

然而,它也将允许文件名,其中这些序列扩展,但开头的节点在文件名。这些类型的文件名有时会在* nix环境中看到:(file.ew.action.ext)。但是请注意,我说开始(ht到ikegami),所以它匹配file.nst,file.nsx等等。如果这些都是*扩展,这将是最好做到以下几点:

/\.(?:ew|ns|ud)$/i 

$表示字符串的结尾(或记录分隔符之前)。

即使你想保持全范围的行为,并希望所有分机开始与这些序列,这是更好地使明确,并写这样的表达:/\.(?:ew|ns|ud)\w*$/\w*意思是0或更多“单词字符”(字母,数字+下划线))。

+3

...和'\ z'表示字符串的结尾。如果没有'$'或'\ z',它甚至可以匹配'.nslookuprc' – ikegami

+1

readdir的成本将会使grep中的任何时间都变得侏儒;如果您发现这种“优化”更易读或更容易根据需要进行修改,则此更改仅值得考虑。 – ysth

+0

这是一个讲座,而不是答案。而最后一段完全是错误的 - 没有理由要求文件名中的尾随字符是字母数字或下划线。要求是什么,我们没有被告知。 – Borodin

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) 
7

READDIR正在恢复中DIR,其中DIR是一个句柄目录中的文件的列表。

grep {}将这个正则表达式应用到它看到的每个值,并且任何匹配项都放在@files中。

正则表达式本身与文件名中的“.EW”,“.NS”或“.US”匹配,但不区分大小写。 (行情是我的清晰)。

+0

^这是正确的答案。 – Borodin

2
  1. 目录是第一open ED和它的手柄是DIR
  2. readdir产生的开放目录的内容列表 - 包括文件和目录名
  3. grep隐含评估在反对它的每一个代码块中的表达列表项(以Perl的默认标量$_保存)。在这种情况下,一组正则表达式不区分大小写地尝试匹配每个列表项中的“.EW”,“.NS”或“.UD”。
  4. 如果grep的代码中的表达式的值为true,即找到匹配的列表项被传递到阵列@file