gpt4 book ai didi

regex - Vi 没有正确处理我的 perl 脚本中的大括号

转载 作者:行者123 更新时间:2023-12-01 12:40:11 24 4
gpt4 key购买 nike

Vi 搞砸了我的 perl 脚本!虽然代码末尾的 { 不匹配任何右花括号,但第 27 和 28 行末尾的 { 匹配相同的 } 在 30。

这是 Vi 如何处理我的脚本行为的屏幕视频。

mini-screencast demonstrating the issue
(来源:abbasinasab.com)

这也是我的麻烦代码:

#CODE                                                                                                               
while ($data =~ m{
^foo_\s+ $X \s* \{
( (?: [^{}]+ | \{(?1)\} )* )
\}
}mgx)
{
my $Y = $1;
next if $Y !~ m{
bar_$Z \s* \{
( (?: [^{}]+ | \{(?1)\} )*? )
\}
}mx;

my $DO = $1;
#CODE
}

我的问题是:

  1. 在这种情况下,Vi 如何以及为什么不能处理大括号。
  2. 我怎样才能重写我写的丑陋的代码片段以避免 Vi 的这种混淆。

最佳答案

Vim 中有两个功能可能会被复杂的语法所欺骗:

  • 'matchpairs' 突出显示和跳转使用内部启发式。这可能会受到轻微影响(cp. :help cpo-M):
:set cpo+=M

有了这个,% 正确地跳转到预期的右大括号(除非你有像 matchpairs.vim 这样的插件覆盖 % 命令).另请注意,'cpoptions' 设置是全局的,因此这可能会对其他 文件类型产生不利影响。

  • 语法高亮是基于正则表达式的。因此,它会因极端情况和复杂语法(如 C++ 和 Perl)而失败,这些无法用正则表达式忠实地建模(但需要自定义解析器)。

一般来说,我会避免为了让编辑高兴而重写代码。其他人可能会使用不同的编辑器,很快代码就会因各种此类“解决方法”而严重扭曲。唯一的异常(exception)是当代码明显复杂和繁琐时,一般可读性会通过重组得到改善。

关于regex - Vi 没有正确处理我的 perl 脚本中的大括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25629026/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com