学习perl,这行做什么?

enj*_*ife 1 regex perl

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

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

use*_*259 7

readdir返回DIR中的文件列表,其中DIR是目录的句柄.

grep {}正在将regexp应用于它看到的每个值,匹配的任何内容都放在@files中.

正则表达式本身在文件名中匹配".EW",".NS"或".US",不区分大小写.(为清晰起见,引用是我的).


Axe*_*man 5

它,而冗长,过滤器基于是否有期,其后无论是序列目录中的所有文件名'EW','NS''UD'在一个文件的名称,没有参考案例.(/i:"忽略大小写").

它做同样的事情:

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

然而,它也将允许文件名,其中这些序列是不扩展,而是开始一个的节点中的文件名.这些类型的文件名有时在*nix环境中更常见:( file.ew.action.ext).但请注意,我说开始(ht到ikegami),所以它匹配file.nst,file.nsx等等.因此,如果这些是*扩展,那么最好执行以下操作:

/\.(?:ew|ns|ud)$/i
Run Code Online (Sandbox Code Playgroud)

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

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

  • ...和`\ z`表示字符串的结尾.没有`$`或`\ z`,它甚至会匹配`.nslookuprc` (3认同)