刚刚遇到了在perl中执行tab expansion的代码,这里是代码:
1 while $string =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e;
我测试它是有效的,但我太了解了这一点的新手,有人想解释一下为什么它有效吗?或任何可以帮助我理解这一点的相关材料的指针将不胜感激,非常感谢。
答案 0 :(得分:8)
Perl允许您在正则表达式中嵌入任意代码作为替换表达式。
$&
是与最后一个模式匹配匹配的字符串 - 在这种情况下,是一些选项卡字符。
$`
是前一个模式匹配所匹配的字符串之前的字符串 - 这可以让您知道上一个文本的长度,因此您可以正确地将事物与列对齐。
例如,针对字符串"Something\t\t\tsomething else"
执行此操作,$&
为"\t\t\t"
,$`
为"Something"
。 length($&)
为3,因此最多需要24个空格,但length($`)%8
为1,因此为了使其每8对齐一列,它会增加23个空格。
答案 1 :(得分:2)
正则表达式上的e
标志意味着将替换字符串(' ' x (...etc...
)视为perl代码,并为每个匹配解释/执行它。所以,基本上寻找任何有1个或更多(+
)制表符(\t
)的地方,然后执行小的perl片段将这些制表符转换为空格。
该代码段会计算匹配的标签数量,将该数字乘以8以获得所需的空格数量,但也会考虑匹配标签之前可能出现的任何内容。