为了消除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 s///
自动绑定到正则表达式可以自由修改的默认变量$_
。大多数核心功能默认在$_
上运行。
perl -e'$_="foo"; s/foo/bar/; s/bar/baz/; print'
#将打印baz
假设您可以在VIM中使用:perldo
链接表达式,并且它可以在逻辑上工作。
现在我的VIM问题可以通过代码得到更好的证明 - 我已经将它简化为一个简单的测试。打开一个新缓冲区,将以下文本放入其中:
aa bb
aa
bb
现在运行此:perldo s/a/z/; s/b/z/;
缓冲区现在具有:
za zb
aa
zb
为什么第二行的第一个正则表达式不成功,但第二个正则表达式本身是成功的,并且在第一行?
答案 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)
在我看来,只有最后一个命令在[范围]中的所有行上运行。