4

刚刚在perl中遇到了tab扩展的代码,代码如下:

1 while $string =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e;

我对其进行了测试以使其正常工作,但是我太菜鸟了,无法理解这一点,有人愿意解释一下它为什么起作用吗?或任何可以帮助我理解这一点的相关材料的指针将不胜感激,非常感谢。

4

2 回答 2

8

Perl 允许您在正则表达式中嵌入任意代码作为替换表达式。

$&是由最后一个模式匹配匹配的字符串——在本例中,是一些制表符。

$`是最后一个模式匹配所匹配的字符串之前的字符串——这可以让您知道之前的文本有多长,因此您可以正确地将内容与列对齐。

例如,针对字符串"Something\t\t\tsomething else"$&is"\t\t\t"$`is运行此命令"Something"length($&)为 3,因此最多需要 24 个空格,但length($`)%8为 1,因此要使其与每 8 个列对齐,它会添加 23 个空格。

于 2011-04-30T22:46:50.387 回答
2

正则表达式上的e标志意味着将替换字符串 ( ' ' x (...etc...) 视为 perl 代码并为每个匹配项解释/执行它。所以,基本上寻找任何有 1 个或多个 ( +) 制表符 ( \t) 的地方,然后执行小的 perl 片段将这些制表符转换为空格。

该代码段计算匹配的制表符数量,将该数字乘以 8 以获得所需的空格数,但还考虑了匹配制表符之前可能出现的任何内容。

于 2011-04-30T22:48:46.147 回答