后台任务

为了消除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


为什么第一个正则表达式在第二行中不成功,而第二个正则表达式本身和第一行都成功了?

最佳答案

看来,传递给:perldo的整个Perl表达式必须返回一个真实的/定义的值,否则,每行结果将被丢弃。

试试这个,任何行都不会发生任何事情:

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


试试这个,它可以在所有3行上正常工作:

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


:perldo文档中的示例提示:

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


但不幸的是,它没有明确说明正在发生的事情。

10-02 23:05