首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较\s和\t

比较\s和\t
EN

Stack Overflow用户
提问于 2014-10-05 10:34:41
回答 2查看 76关注 0票数 2

在我的程序中,我存储了在@indentation_stack中看到的缩进级别

例如:

代码语言:javascript
复制
$line =~ /^(\s*)(if|elif|else|while)/
push(@indentation_stack, $1);

然后将我在后续行中看到的缩进级别与@indentation_stack的最后一个元素中的缩进级别进行比较。

代码语言:javascript
复制
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

有人知道为什么会发生这样的事情吗?

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2014-10-05 11:04:38

制表符与空格的问题是一个没有答案的老问题,选择一个并保持一致,因为两者混合是不好的。不同的编辑器可以将选项卡显示为不同数量的空格,甚至可以根据上下文动态显示单个文件中的选项卡。

因此,很多编辑器,包括emacs,都提供了自动将制表符转换为空格的方法,并且只在您按tab键时插入空格。

此外,您的程序可以将制表符转换为一定数量的空格,尽管这可能需要将制表符转换为所有行中的空格,而不仅仅是您正在生成的那些行。除非你想做一种混合的表示或转换为最接近的制表符间距-这是一个很大的复杂性,但没有什么原因。

票数 3
EN

Stack Overflow用户

发布于 2014-10-05 11:53:11

你是在问如何计算标签的可见长度吗?制表符将光标移动到下一个制表位。

代码语言:javascript
复制
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";         
    }
}

将缩进及其长度存储在堆栈中会更有效。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26199108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档