расширение вкладки в Perl - PullRequest
4 голосов
/ 01 мая 2011

только что обнаружил код для расширения вкладки в perl, вот код:

1 while $string =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e;

Я проверил, чтобы это работало, но я слишком новичок, чтобы понять это, кто-нибудь хочет объяснить, почему это работает? или любой указатель на связанный материал, который мог бы помочь мне понять это, был бы оценен, большое спасибо.

Ответы [ 2 ]

8 голосов
/ 01 мая 2011

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

$& - это строка, соответствующая последнему совпадению с шаблоном - в этом случае используется некоторое количество символов табуляции.

$` - это строка, предшествующая тому, что было сопоставлено с последним сопоставлением с шаблоном - это позволяет узнать, как долго был предыдущий текст, чтобы вы могли правильно выровнять элементы по столбцам.

Например, если запустить это для строки "Something\t\t\tsomething else", $& равно "\t\t\t", а $` равно "Something". length($&) равно 3, поэтому требуется не более 24 пробелов, но length($`)%8 равно 1, поэтому для выравнивания по столбцам каждые восемь добавляется 23 пробела.

2 голосов
/ 01 мая 2011

Флаг e в регулярном выражении означает обработку замещающей строки (' ' x (...etc...) как кода perl и интерпретацию / выполнение ее для каждого совпадения.Итак, в основном ищите любое место, где есть 1 или более (+) символов табуляции (\t), затем выполните небольшой фрагмент perl, чтобы преобразовать эти вкладки в пробелы.

Фрагмент подсчитывает, сколько вкладок былосовпал, умножает это число на 8, чтобы получить требуемое количество пробелов, но также учитывает все, что может быть до совпадений.

...