代码之家  ›  专栏  ›  技术社区  ›  Uri London

有没有更好的方法来使用Perl来Detab(扩展选项卡)?

  •  4
  • Uri London  · 技术社区  · 14 年前

    我想找出我的源文件。(请不要对我为什么要调查我的消息来源发火。这不是重点:(-)我找不到一个实用程序来做这件事。Eclipse不是为我做的,所以我实现了自己的。

    我无法将它放入一行程序中。 我带着以下东西来的,做得很好。

    while( <> )
    {
        while( /\t/ ) {
            s/^(([^\t]{4})*)\t/$1    /;
            s/^((([^\t]{4})*)[^\t]{1})\t/$1   /;
            s/^((([^\t]{4})*)[^\t]{2})\t/$1  /;
            s/^((([^\t]{4})*)[^\t]{3})\t/$1 /;
        }
        print;
    }
    

    然而,这让我怀疑Perl——处理文本的冠军语言——是否是正确的工具。代码看起来不太优雅。如果必须确定tab=8个空格的源代码,代码看起来会更糟。

    具体地说,因为我可以想到一个只有4个状态的确定性状态机来完成这项工作。

    我觉得存在一个更优雅的解决方案。我是否缺少一个Perl习语?在Timtowtdi的精神中,我对其他的方法很好奇。

    美国。

    7 回复  |  直到 13 年前
        1
  •  7
  •   mob    14 年前

    我记得奥雷利的一本书中有一个迂回的剧本,但我现在似乎找不到链接。

    我也必须解决这个问题,并且我解决了这个简明的解决方案来消除一条线:

    1 while $line =~ s/\t/" " x ($tablength - ($-[0] % $tablength))/e ;
    

    在这个正则表达式中 $-[0] 是行的“预匹配”部分的长度——制表符之前的字符数。


    作为一个班轮:

    perl -pe '1 while s/\t/" "x(4-($-[0]%4))/e' input
    
        2
  •  12
  •   Paul Tomblin    14 年前

    旧的Unix程序“expand”发生了什么?我以前一直用这个。

        3
  •  7
  •   toolic    14 年前

    每当我想展开选项卡时,我使用 Text::Tabs .

        4
  •  5
  •   Eugene Yarmash    14 年前

    这在VIM中很容易做到:

    :set expandtab
    :retab
    

    http://vim.wikia.com/wiki/Converting_tabs_to_spaces

        5
  •  3
  •   Pedro Silva    14 年前

    不能让 vi 在这里独处。Emacs:

    M-x tabify
    M-x untabify
    
        6
  •  2
  •   Ether    14 年前

    我在VIM中这样做是为了:

    :%s/^V^I/    /g
    

    (这是字面意思) v 后跟一个文字 标签 ) :%gq 修正不正确的间距。Perl太过分了。

        7
  •  1
  •   stealthyninja michkra    13 年前

    确切的表达方式是:

    1 while $line =~ s/\t/" " x ($tablength+1 - ($-[0] % $tablength))/e ;
    

    而expand对于命令行很有用,而不是在程序内部,程序可能会扩展或不扩展某些行。