my @file = grep { (/\.EW/i || /\.NS/i || /\.UD/i) }readdir(DIR);
我试图理解正则表达式以及grep和readdir如何相互关联。学习perl,这行是做什么的?
my @file = grep { (/\.EW/i || /\.NS/i || /\.UD/i) }readdir(DIR);
我试图理解正则表达式以及grep和readdir如何相互关联。学习perl,这行是做什么的?
它,而冗长,筛选的基础上是否有期,其后无论是'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或更多“单词字符”(字母,数字+下划线))。
正则表达式解释说:
/\.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)
READDIR正在恢复中DIR,其中DIR是一个句柄目录中的文件的列表。
grep {}将这个正则表达式应用到它看到的每个值,并且任何匹配项都放在@files中。
正则表达式本身与文件名中的“.EW”,“.NS”或“.US”匹配,但不区分大小写。 (行情是我的清晰)。
^这是正确的答案。 – Borodin
open
ED和它的手柄是DIR
readdir
产生的开放目录的内容列表 - 包括文件和目录名grep
隐含评估在反对它的每一个代码块中的表达列表项(以Perl的默认标量$_
保存)。在这种情况下,一组正则表达式不区分大小写地尝试匹配每个列表项中的“.EW”,“.NS”或“.UD”。grep
的代码中的表达式的值为true,即找到匹配的列表项被传递到阵列@file
有什么结果,你用这条线时得到什么?我会建议文档perlfunc,perlre。 – sln