在我的程序中,我存储了在@indentation_stack中看到的缩进级别
例如:
$line =~ /^(\s*)(if|elif|else|while)/
push(@indentation_stack, $1);然后将我在后续行中看到的缩进级别与@indentation_stack的最后一个元素中的缩进级别进行比较。
if ($line =~ /^(\s*)[^\s+]/) {
while (@indentation_stack && $1 le $indentation_stack[-1]){
print $indentation_stack[-1],"}\n";
pop @indentation_stack;
}
}其思想是,如果后续行上的缩进等同于@indentation_stack的最后一个元素,则打印一个}和一个换行符。
只要缩进包含spaces,就可以很好地工作。但是,如果我使用\t创建相同级别的缩进,我的代码将无法按预期工作。
EDIT:如果所有间距都是一致的,要么全部使用\t,要么全部使用spaces,那么就没有问题。所以我想我想要解决的是,我如何简单地比较空间。也就是说,一个\t可能等同于多个spaces。
有人知道为什么会发生这样的事情吗?
谢谢你的帮助。
发布于 2014-10-05 11:04:38
制表符与空格的问题是一个没有答案的老问题,选择一个并保持一致,因为两者混合是不好的。不同的编辑器可以将选项卡显示为不同数量的空格,甚至可以根据上下文动态显示单个文件中的选项卡。
因此,很多编辑器,包括emacs,都提供了自动将制表符转换为空格的方法,并且只在您按tab键时插入空格。
此外,您的程序可以将制表符转换为一定数量的空格,尽管这可能需要将制表符转换为所有行中的空格,而不仅仅是您正在生成的那些行。除非你想做一种混合的表示或转换为最接近的制表符间距-这是一个很大的复杂性,但没有什么原因。
发布于 2014-10-05 11:53:11
你是在问如何计算标签的可见长度吗?制表符将光标移动到下一个制表位。
use constant TAB_STOP => 4;
sub indent_size {
my ($s) = @_;
my $i = 0;
while ($s =~ /\G([ \t])/g) {
$i += $1 eq "\t" ? ( TAB_STOP - ($i % TAB_STOP) ) : 1;
}
return $i;
}
if (my ($indent) = $line =~ /^([ \t]+)[^ \t\n]/) {
my $indent_size = indent_size($indent);
while (@indent_stack && $indent_size <= indent_size($indent_stack[-1])) {
print pop(@indent_stack), "}\n";
}
}将缩进及其长度存储在堆栈中会更有效。
https://stackoverflow.com/questions/26199108
复制相似问题