Проблема Сценариев VIM 7.2 с ':perldo' и несколькими выражениями

Фоновая задача

Для устранения проблем X-Y, я скажу, что я делаю: я пытаюсь использовать :perldo в VIM 7.2 для выполнения двух задач:

  • Очистите весь запаздывающий пробел, включая (очищающийся не удаляющий) строки, которые только имеют пробел
    • s/\s+$//;
  • Удалите пробел невкладки, который существует перед первым - не пробел
    • s/^ (\s*) (?=\S) / s#[^\t]##g;$_ /xe;

Я хотел бы сделать это все с одной передачей. В настоящее время, использование :perldo, Я могу получить эту работу с двумя передачами. (при помощи: perldo дважды)

Команда должна быть похожей на это:

:perldo s/\s+$//; s/^ (\s*) (?=\S) / s#[^\t]##g;$_ /xe;

Фон Perl

Для понимания этой проблемы, необходимо знать немного о Perl s/// автоволшебно связывает с переменной по умолчанию $_ который regex свободен изменить. Большинство базовых функций воздействует на $_ по умолчанию.

perl -e'$_="foo"; s/foo/bar/; s/bar/baz/; print' # распечатает baz

Предположение - то, что можно объединить использование выражений в цепочку :perldo в VIM и что это будет работать логически.

VIM, не являющийся хорошим

Теперь моя проблема VIM лучше продемонстрирована с кодом - я уменьшил его до простого теста. Откройтесь новый буфер помещают следующий текст в него:

aa bb
aa
bb

Теперь выполните это :perldo s/a/z/; s/b/z/; Буфер теперь имеет:

za zb
aa
zb

Почему было первое regex неудачное на второй строке, и все же второй regex был успешен отдельно, и на первой строке?

7
задан Evan Carroll 1 February 2010 в 20:03
поделиться

3 ответа

Похоже, что все первое выражение, которое вы проходите к : Perldo должен вернуть истинное / определенное значение, или результаты отбрасываются, в соответствии с линиями.

Попробуйте это, ничего не происходит на любой строке:

:perldo s/a/z/; s/b/z/; 0

Попробуйте это, он работает на всех 3 строках, как и ожидалось:

:perldo s/a/z/; s/b/z; 1

Пример в : Perldo Документация подсказки на это:

:perldo $_ = reverse($_);1

Но, к сожалению, это не говорит прямо то, что происходит.

6
ответ дан 6 December 2019 в 23:05
поделиться

Мне кажется, что только последняя команда выполняется на всех строках в [диапазоне].

0
ответ дан 6 December 2019 в 23:05
поделиться

Не знаю, что : Perldo делает точно, но если вы запускаете что-то вроде

:perldo s/a/z/+s/b/z/

, то вы получаете что-то большее, что вы ожидаете.

5
ответ дан 6 December 2019 в 23:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: