Regex 在学习perl时,这行代码的作用是什么?

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

我试图理解正则表达式以及grep和readdir之间的关系。

它相当详细地根据文件名中是否有一个后跟
'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中花费的时间相形见绌;只有当您发现这个“优化”更具可读性或在需要时更容易修改时,这个更改才值得考虑。这是一个讲座,而不是一个答案。您的最后一段完全错误-没有理由要求文件名中的尾随字符为字母数字或以下