perl中的tab扩展

时间:2011-04-30 22:36:00

标签: perl tabs expansion

刚刚遇到了在perl中执行tab expansion的代码,这里是代码:

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

我测试它是有效的,但我太了解了这一点的新手,有人想解释一下为什么它有效吗?或任何可以帮助我理解这一点的相关材料的指针将不胜感激,非常感谢。

2 个答案:

答案 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以获得所需的空格数量,但也会考虑匹配标签之前可能出现的任何内容。