Для устранения проблем 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 s///
автоволшебно связывает с переменной по умолчанию $_
который regex свободен изменить. Большинство базовых функций воздействует на $_
по умолчанию.
perl -e'$_="foo"; s/foo/bar/; s/bar/baz/; print'
# распечатает baz
Предположение - то, что можно объединить использование выражений в цепочку :perldo
в VIM и что это будет работать логически.
Теперь моя проблема VIM лучше продемонстрирована с кодом - я уменьшил его до простого теста. Откройтесь новый буфер помещают следующий текст в него:
aa bb
aa
bb
Теперь выполните это :perldo s/a/z/; s/b/z/;
Буфер теперь имеет:
za zb
aa
zb
Почему было первое regex неудачное на второй строке, и все же второй regex был успешен отдельно, и на первой строке?
Похоже, что все первое выражение, которое вы проходите к : Perldo
должен вернуть истинное / определенное значение, или результаты отбрасываются, в соответствии с линиями.
Попробуйте это, ничего не происходит на любой строке:
:perldo s/a/z/; s/b/z/; 0
Попробуйте это, он работает на всех 3 строках, как и ожидалось:
:perldo s/a/z/; s/b/z; 1
Пример в : Perldo
Документация подсказки на это:
:perldo $_ = reverse($_);1
Но, к сожалению, это не говорит прямо то, что происходит.
Мне кажется, что только последняя команда выполняется на всех строках в [диапазоне].
Не знаю, что : Perldo
делает точно, но если вы запускаете что-то вроде
:perldo s/a/z/+s/b/z/
, то вы получаете что-то большее, что вы ожидаете.