VIM 7.2使用`:perldo`和多个表达式编写脚本问题

时间:2010-02-01 20:03:49

标签: perl vim scripting

后台任务

为了消除X-Y问题,我会说我正在做的事情:我正在尝试在VIM 7.2中使用:perldo来完成两项任务:

  • 清除所有尾随空格,包括(清除不删除)具有空格的行
    • s/\s+$//;
  • 删除第一个非空格字符之前存在的非制表符空格
    • s/^ (\s*) (?=\S) / s#[^\t]##g;$_ /xe;

我想一次性完成这一切。目前,使用:perldo,我可以通过两次通过。 (通过使用:perldo两次)

该命令应如下所示:

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

Perl背景

为了理解这个问题,您必须了解Perl s///自动绑定到正则表达式可以自由修改的默认变量$_。大多数核心功能默认在$_上运行。

perl -e'$_="foo"; s/foo/bar/; s/bar/baz/; print'#将打印baz

假设您可以在VIM中使用:perldo链接表达式,并且它可以在逻辑上工作。

VIM不太好

现在我的VIM问题可以通过代码得到更好的证明 - 我已经将它简化为一个简单的测试。打开一个新缓冲区,将以下文本放入其中:

aa bb
aa
bb

现在运行此:perldo s/a/z/; s/b/z/;缓冲区现在具有:

za zb
aa
zb

为什么第二行的第一个正则表达式不成功,但第二个正则表达式本身是成功的,并且在第一行?

3 个答案:

答案 0 :(得分:6)

您传递给:perldo的整个Perl表达式似乎必须返回true / defined值,否则结果将被丢弃,每行。

试试这个,任何一行都没有发生:

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

试试这个,它可以按预期在所有3行上运行:

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

:perldo文档中的示例提示:

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

但不幸的是,它没有明确说明发生了什么。

答案 1 :(得分:5)

不知道:perldo正在做什么,但是如果你运行的话

:perldo s/a/z/+s/b/z/
然后你会得到更像你期望的东西。

答案 2 :(得分:0)

在我看来,只有最后一个命令在[范围]中的所有行上运行。