0

这是一段代码

while($l=~/(\\\s*)$/) {
    statements;
}

$l包含一行文本文件,实际上此代码用于遍历文件中的行。

问题:

  1. 我不清楚条件在while做什么。我认为它试图\在行尾匹配一组后跟一些空格,并且只要一行以\并且可能是一些空格结尾,循环就应该停止。我不确定。

  2. 我遇到了声明$a ~= s/^(.*$)/$1/。据我所知,这^将强制在 string 的开头进行匹配,但 in(.*$)意味着匹配 string 末尾的所有字符。这是否意味着该语句正在尝试查找末尾的任何字符组是否与文本开头的字符组相同?

4

6 回答 6

2

有趣的是,这个声明:

while ( $l =~ /(\\\s*)$/ ) {

是一个无限循环,除非$l在循环内部进行了更改,以使正则表达式不再匹配。正如其他人已经提到的那样,这就是它的匹配项:

  • ( ... )一个捕获组,将字符串捕获到$1(这是第一个,而不是小写 L)
  • \\匹配文字反斜杠
  • \s*匹配 0 个或多个空格字符。
  • $将行尾与可选换行符匹配。

由于您没有/g修饰符,因此此正则表达式不会遍历匹配项,它只会检查是否存在匹配项,每次迭代都重置正则表达式,从而导致无限循环。

该声明

$a ~= s/^(.*$)/$1/

看起来比较没意思。它捕获一串字符直到字符串结尾,然后用它自己替换它。捕获的文本被存储$1并被简单地替换。这个正则表达式唯一有用的地方是:

  • 它匹配到 newline \n,仅此而已,这可能对解析器有一些用处。句点.匹配除换行符以外的任何字符,除非/s修饰符出现在正则表达式中。
  • 它捕获线路以$1供将来使用。然而,一个简单的/^(.*$)/也会做同样的事情。
于 2013-06-08T14:58:43.453 回答
1

1 . 同时_

通常while (regex)/g修饰符一起使用,否则,如果匹配,您将获得一个无限循环(除非您退出循环,如使用last)。
语句将在无限循环中连续执行。

在您的情况下,添加g

while($l=~/(\\\s*)$/g) 

将只有一个循环因为$- 使匹配唯一(匹配到字符串末尾的任何内容都是唯一的,因为$标记结束,并且之后没有任何内容......)。

2 .$a ~= s/^(.*$)/$1/

这是一个替代品。如果字符串^.*$匹配(它会,因为^.*$匹配(几乎,见评论)任何东西)它被替换为...... $1或里面的东西(),即它本身,因为匹配发生在第一个字符到字符串的末尾

  • ^表示字符串的开头
  • (.*)表示所有字符
  • $字符串结尾

所以这将替换$a为自身 - 可能不是你想要的。

于 2013-06-08T15:01:51.540 回答
0

它匹配一个文字反斜杠,后跟 0 个或多个空格,然后是行尾。

于 2013-06-08T14:27:04.740 回答
0

statements针对该文本文件中包含 a 的所有行执行\,后跟零个或多个空格 ( \s*),在行尾 ( $)。

于 2013-06-08T14:27:32.077 回答
0

(\\\s*)$ 此正则表达式意味着 --- a\后跟零个或多个数字,white space characters然后是行尾。既然你有你的正则表达式(...),你可以根据需要提取你匹配$1的内容。

http://rubular.com/r/dtHtEPh5DX

编辑——根据你的更新

$a ~= s/^(.$)/$1/--- 这是search and replace。因此,您的正则表达式匹配仅包含一个字符的行(因为您使用. http://www.regular-expressions.info/dot.html),但换行符除外。由于您使用(...),与正则表达式匹配的字符被提取并存储在变量中a

编辑——你改变了你的正则表达式,所以这里是更新的答案

$a ~= s/^(.*$)/$1/-- 与上面相同,但现在它匹配零个或多个字符(换行符除外)

于 2013-06-08T14:28:00.297 回答
0

它匹配以反斜杠字符结尾的行,忽略任何尾随空格字符。

在某些语言和数据文件中使用反斜杠结束行以指示该行在下一行继续。所以我怀疑这是合并这些续行的解析器的一部分。

如果您在RegExr输入正则表达式并将鼠标悬停在片段上,它会在工具提示中显示每个片段的含义。

于 2013-06-08T14:38:57.517 回答