zadanie Tło
Aby wyeliminować problemy XY powiem co robię: Staram się używać :perldo
w VIM 7.2 wypełnić dwa zadania:VIM problemem 7,2 skryptów z `: perldo` i wiele wyrażeń
- Wyczyść wszystko końcowe białe znaki, w tym (nie wyczyszczenie usuwanie) wiersze tylko mają spacje
s/\s+$//;
- usunięcia nie-tab spacje, który istnieje przed pierwszym non spacją
s/^ (\s*) (?=\S)/s#[^\t]##g;$_ /xe;
Chciałbym zrobić to wszystko z jednym przejściem. Obecnie, używając :perldo
, mogę uruchomić to za pomocą dwóch przebiegów. (Przy użyciu: perldo dwukrotnie)
Komenda powinna wyglądać następująco:
:perldo s/\s+$//; s/^ (\s*) (?=\S)/s#[^\t]##g;$_ /xe;
Perl tło
Aby zrozumieć ten problem, trzeba wiedzieć trochę o Perl s///
automagicznie wiąże się z domyślna zmienna $_
, którą regex można dowolnie modyfikować. Większość podstawowych funkcji działa domyślnie na $_
.
perl -e'$_="foo"; s/foo/bar/; s/bar/baz/; print'
# wypisze baz
Założenie jest takie, że można wyrażenia łańcuchowe wykorzystujące :perldo
w VIM i że będzie działać logicznie.
VIM nie jest miły
Teraz mój problem VIM jest lepiej wykazać z kodem - Mam go zredukowana do prostego testu. Otworzyć nowe miejsce buforowania następujący tekst do niego:
aa bb
aa
bb
teraz uruchomić ten :perldo s/a/z/; s/b/z/;
Bufor ma teraz:
za zb
aa
zb
dlaczego pierwszy regex nieudaną w drugim rzędzie, i jeszcze drugi regex odniósł sukces sam w sobie i w pierwszym rzędzie?
Tak, który wyjaśniłby wyniki OP: Ostatnia instrukcja w' perldo' musi zwrócić wartość true lub cały wynik 'perldo' jest odrzucane. –
Przełączam to na moją odpowiedź, ponieważ ma to sens. Wyobrażam sobie, że drugą odpowiedzią było wykorzystanie '0 + 0 = 0 (bez wymiany)', a 1 + 0 lub 0 + 1 spowodowałoby zastąpienie. To jest dość głupia rzecz, której nie udokumentowano. –