刚刚在perl中遇到了tab扩展的代码,代码如下:
1 while $string =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e;
我对其进行了测试以使其正常工作,但是我太菜鸟了,无法理解这一点,有人愿意解释一下它为什么起作用吗?或任何可以帮助我理解这一点的相关材料的指针将不胜感激,非常感谢。
刚刚在perl中遇到了tab扩展的代码,代码如下:
1 while $string =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e;
我对其进行了测试以使其正常工作,但是我太菜鸟了,无法理解这一点,有人愿意解释一下它为什么起作用吗?或任何可以帮助我理解这一点的相关材料的指针将不胜感激,非常感谢。
Perl 允许您在正则表达式中嵌入任意代码作为替换表达式。
$&
是由最后一个模式匹配匹配的字符串——在本例中,是一些制表符。
$`
是最后一个模式匹配所匹配的字符串之前的字符串——这可以让您知道之前的文本有多长,因此您可以正确地将内容与列对齐。
例如,针对字符串"Something\t\t\tsomething else"
、$&
is"\t\t\t"
和$`
is运行此命令"Something"
。length($&)
为 3,因此最多需要 24 个空格,但length($`)%8
为 1,因此要使其与每 8 个列对齐,它会添加 23 个空格。
正则表达式上的e
标志意味着将替换字符串 ( ' ' x (...etc...
) 视为 perl 代码并为每个匹配项解释/执行它。所以,基本上寻找任何有 1 个或多个 ( +
) 制表符 ( \t
) 的地方,然后执行小的 perl 片段将这些制表符转换为空格。
该代码段计算匹配的制表符数量,将该数字乘以 8 以获得所需的空格数,但还考虑了匹配制表符之前可能出现的任何内容。