Regex 在学习perl时,这行代码的作用是什么?
我试图理解正则表达式以及grep和readdir之间的关系。它相当详细地根据文件名中是否有一个后跟Regex 在学习perl时,这行代码的作用是什么?,regex,perl,Regex,Perl,我试图理解正则表达式以及grep和readdir之间的关系。它相当详细地根据文件名中是否有一个后跟'EW','NS'或'UD'的句点序列来过滤目录中的所有文件名,而不考虑大小写。(/i:“忽略案例”) 它的作用与此相同: my @file = grep { (/\.EW/i || /\.NS/i || /\.UD/i) }readdir(DIR); 但是,它也允许使用文件名,其中这些序列不是扩展名,而是文件名中节点的开头。这些类型的文件名有时在*nix环境中更常见:(file.ew.actio
'EW'
,'NS'
或'UD'
的句点序列来过滤目录中的所有文件名,而不考虑大小写。(/i
:“忽略案例”)
它的作用与此相同:
my @file = grep { (/\.EW/i || /\.NS/i || /\.UD/i) }readdir(DIR);
但是,它也允许使用文件名,其中这些序列不是扩展名,而是文件名中节点的开头。这些类型的文件名有时在*nix环境中更常见:(file.ew.action.ext
)。但请注意,我说的是开始(ht到ikegami),所以它匹配file.nst
,file.nsx
,等等。因此,如果这些是*扩展,则最好执行以下操作:
my @files = grep { /\.(?:ew|ns|ud)/i } readdir(DIR);
$
指示字符串的结尾(或记录分隔符之前)
即使您希望保持完整的行为范围,并且希望所有扩展都从这些序列开始,最好将其显式化,并编写如下表达式:/\(?:ew | ns | ud)\w*$/
(\w*
表示0个或更多“单词字符”(字母、数字+下划线)) 它更详细地根据文件名中是否有一个句点序列后跟'EW'
,'NS'
,或'UD'
,过滤目录中的所有文件名,而不参考大小写。(/i
:“忽略案例”)
它的作用与此相同:
my @file = grep { (/\.EW/i || /\.NS/i || /\.UD/i) }readdir(DIR);
但是,它也允许使用文件名,其中这些序列不是扩展名,而是文件名中节点的开头。这些类型的文件名有时在*nix环境中更常见:(file.ew.action.ext
)。但请注意,我说的是开始(ht到ikegami),所以它匹配file.nst
,file.nsx
,等等。因此,如果这些是*扩展,则最好执行以下操作:
my @files = grep { /\.(?:ew|ns|ud)/i } readdir(DIR);
$
指示字符串的结尾(或记录分隔符之前)
即使您希望保持完整的行为范围,并且希望所有扩展都从这些序列开始,最好将其显式化,并编写如下表达式:
/\(?:ew | ns | ud)\w*$/
(\w*
表示0个或更多“单词字符”(字母、数字+下划线)) 正则表达式解释如下:
/\.(?:ew|ns|ud)$/i
正则表达式解释如下:
/\.(?:ew|ns|ud)$/i
readdir返回DIR中的文件列表,其中DIR是目录的句柄 grep{}将该regexp应用于它看到的每个值,任何匹配项都放在@files中
正则表达式本身以不区分大小写的方式在您的文件名中匹配“.EW”、“.NS”或“.US”。(为了清楚起见,我使用引号)。readdir返回DIR中的文件列表,其中DIR是目录的句柄 grep{}将该regexp应用于它看到的每个值,任何匹配项都放在@files中 正则表达式本身以不区分大小写的方式在您的文件名中匹配“.EW”、“.NS”或“.US”。(为了清楚起见,我引用了我的话)
open
ed,它的句柄是DIR
readdir
生成打开目录的内容列表——文件名和目录名grep
根据每个列表项(保存在Perl的默认标量$中)隐式计算其代码块中的表达式。在本例中,一组regexs case会不敏感地尝试匹配每个列表项中的“.EW”、““.NS”或“.UD”
grep
的代码中的表达式计算结果为true,即找到了匹配项,则列表项将传递到数组@文件
open
ed,它的句柄是DIR
readdir
生成打开目录的内容列表——文件名和目录名grep
根据每个列表项(保存在Perl的默认标量$中)隐式计算其代码块中的表达式。在本例中,一组regexs case会不敏感地尝试匹配每个列表项中的“.EW”、““.NS”或“.UD”
grep
的代码中的表达式计算结果为true,即找到了匹配项,则列表项将传递到数组@文件
使用这条线的结果是什么?我会建议大家使用docs perlfunc,perlre。使用这条线会得到什么结果?我建议使用docs perlfunc、perlre…,
\z
表示字符串的结尾。如果没有$
或\z
,它甚至可以与相匹配。nslookuprc
readdir的成本将使在grep中花费的时间相形见绌;只有当您发现这个“优化”更具可读性或在需要时更容易修改时,这个更改才值得考虑。这是一个讲座,而不是一个答案。你的最后一段完全错了——没有理由要求文件名中的尾随字符是字母数字或下划线。“需求就是它,我们并没有被告知这一点。@Borodin,它将代码的总体意图和可以猜测的非预期行为进行了对比。一个是对编写这样的代码时可能尝试的内容的一般解释,另一个是它实际的功能。单词字符是扩展的合理期望。不是绝对的…,\z
表示字符串的结尾。如果没有$
或\z
,它甚至可以与相匹配。nslookuprc
readdir的成本将使在grep中花费的时间相形见绌;只有当您发现这个“优化”更具可读性或在需要时更容易修改时,这个更改才值得考虑。这是一个讲座,而不是一个答案。您的最后一段完全错误-没有理由要求文件名中的尾随字符为字母数字或以下