后台任务
为了消除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
但不幸的是,它没有明确说明正在发生的事情。