Есть ли лучший способ отделить (развернуть вкладки) с помощью Perl? - PullRequest
4 голосов
/ 01 июня 2010

Я хотел отсоединить мои исходные файлы. (Пожалуйста, не волнуйтесь о том, ПОЧЕМУ я хотел отключить свои источники. Это не главное :-) Я не смог найти утилиту для этого. Затмение не сделало это для меня, поэтому я реализовал свой собственный.

Я не смог вписать его в программу с одним вкладышем (-e). Я пришел со следующим, который отлично справился с работой.

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 - чемпионский язык обработки текста - правильным инструментом. Код кажется не очень элегантным. Если бы мне пришлось отсоединить источник, который предполагает таб = 8 пробелов, код выглядел бы еще хуже.

В частности, потому что я могу представить себе детерминированный конечный автомат с только 4 состояниями для выполнения работы.

У меня такое ощущение, что существует более элегантное решение. Я скучаю по Perl? В духе TIMTOWTDI меня интересуют другие способы сделать это.

и.

Ответы [ 7 ]

12 голосов
/ 01 июня 2010

Что случилось со старой программой Unix "раскрыть"? Я использовал это все время.

7 голосов
/ 01 июня 2010

Всякий раз, когда я хочу расширить вкладки, я использую Text :: Tabs .

7 голосов
/ 01 июня 2010

Я помню сценарий отсоединения от одной из книг О'Рейли, но сейчас не могу найти ссылку.

Мне также пришлось решить эту проблему, и я остановился на этом кратком решении, чтобы отделить строку:

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

В этом регулярном выражении $-[0] - это длина «предварительно согласованной» части строки - количество символов перед символом табуляции.


Как однострочник:

perl -pe '1 while s/\t/" "x(4-($-[0]%4))/e' input
5 голосов
/ 02 июня 2010

Это легко сделать в vim:

:set expandtab
:retab

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

3 голосов
/ 02 июня 2010

Не могу позволить vi быть одному здесь. Emacs:

M-x tabify
M-x untabify
2 голосов
/ 01 июня 2010

Я делаю это в VIM с:

:%s/^V^I/    /g

(это буквальный ^ V , за которым следует буквальный tab ), а затем :%gq для исправления неправильного интервала. Perl перебор.

1 голос
/ 04 августа 2011

Точное выражение:

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

И расширение полезно для командной строки не внутри программы, которая может расширять или нет некоторые строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...