把制表符转换成空格的标准方法是计算到达制表符左侧的字符数量,然后将制表符用足够数量的空格来填充,直到移动到下一处制表符终止位。如果使用Perl的话,你可以很轻易地完成这个任务。
你要使用替换模式匹配操作符(substitution pattern-matching operator)找到命令行里的第一个制表符。然后使用length函数来计算制表符之前非制表字符的数量。再根据制表终止符的值分隔长度,并计算剩下的字符数,最后用正确数量的空格来替代制表符。
尽管在替换操作符后面使用/g修饰符很有吸引力,但是这个修饰符根本就不起作用。你必须每次都要重复整个模式匹配,这样你才能够知道最新使用替换空格的字符串的长度。
/e这个替换修饰符指定替换的右侧是代码,而不是一个简单的字符串。这就允许完成必要的计算,而不需要在替换字符串里进行变量替换。
下面是一个例子:
# expand tabs to spaces
# accept tabstop on command line or default to 4
$tabstop = $ARGV[0] + 0 || 4;
while (<STDIN>)
{
1 while(s/^(.*?)( +)/ . ' ' x ($tabstop * length()
- length() % $tabstop)/e);
print;
}
Perl利用常规字符串处理文本的能力使得像扩展制表符这样的任务变得非常简单。