如何使用VIM修复perl语法错误“缺少右侧卷曲或方括号”?

时间:2009-11-24 22:14:36

标签: perl vim syntax-error

使用不匹配的数组括号(“[]”)或范围括号(“{}”)编译(或执行)perl程序会导致“缺少右侧卷曲或方括号”语法错误。 Perl经常将源代码报告为您的最后一个代码行(“at EOF”),这可能与实际丢失的代码相差甚远。

示例perl错误消息:

Missing right curly or square bracket at ./foo.pl line 100, at end of line
syntax error at ./foo.pl line 100, at EOF
Execution of ./foo.pl aborted due to compilation errors.

vi或Vi IMproved(VIM)用户如何解决此错误消息?我添加了一些VIM增强功能的答案。请添加您自己的想法,做法或vi插件。

注意:使用VIM版本发布的原始问题没有突出显示perl括号和括号。许多新版本都这样做;有关详细信息,请参阅vim.org

9 个答案:

答案 0 :(得分:13)

如何立即解决此错误:

  1. 在VIM中,选择一个开头{,[,或(符号。%命令在匹配{},[]和()对之间跳转。不匹配将跳转到意外位置。< / p>

  2. 安装perltidy,运行它,查找奇怪的缩进代码块。

  3. 如何防止未来出现错误:

    1. StackOverflow question 719476显示如何修改大括号/括号的VIM大括号/括号语法着色。 (默认情况下,某些版本不会这样做。)

    2. Karl Guertin's AutoClose plugin自动匹配[,(,{,“,键入时的符号。

    3. perltidy脚本重新格式化perl以提高可读性,这可能会暴露不匹配的符号。

    4. 用户a paid nerd说:“使用perltidy在VIM编辑器中使用nmap。”

      nmap \g mt:%!perltidy<CR>'t

    5. 使用一致的{}匹配缩进(一般提示,不是特定于此perl错误)。

    6. sub foo {
      ...
      }
      

      sub bar
      {
      ...
      }
      

答案 1 :(得分:9)

您可以使用命令匹配vim中的大括号/括号/括号。所以用它来搜索不匹配的字符。

答案 2 :(得分:5)

我经常使用perltidy重新格式化我的代码。当我重新格式化缺少终结符的代码时,进一步的代码会奇怪地缩进,我可以快速向上追踪以找到问题。

Bonus :我使用此映射立即重新格式化文件而不会丢失光标位置:

nmap \g mt:%!perltidy<CR>'t

答案 3 :(得分:3)

使用padre。单击Perl-&gt;查找不匹配的大括号。它会将光标向右移动到问题所在。

我带着同样的问题来到这个页面。使用perltidy和vim没有任何帮助,perltidy后缩进看起来很好。出于某种原因,我在'sub'关键字之前有一个额外的开放式大括号。 Padre只需点击一下即可解决问题。

http://padre.perlide.org/

答案 4 :(得分:1)

使用语法高亮显示,vim几乎总是这样做,并且有一个非常复杂的perl语法高亮方案。

:syntax on

答案 5 :(得分:0)

听起来你可能正在谈论一种教学情况,在这种情况下,教导良好的缩进将解决大多数这些问题。

然而,有时我在服务器上没有像vim和perltidy这样的细节,我使用quick'n'dirty技术来查找语法错误 - 只需在代码中的不同点添加右卷曲,直到行号更改,这是你的麻烦点。

答案 6 :(得分:0)

如果您没有看到任何缺失的牙箍:
如果在Windows中创建文件并尝试在Linux中使用,则用 \ n 替换 \ r 有助于解决此问题。

答案 7 :(得分:0)

我在脚本中出现了这个错误,似乎完全匹配了花括号和方括号......除了我使用了bash风格的语法,它实际上注释掉了一行的后半部分(下半部分是卷曲的)大括号)。

当我更改此行时错误消失了:

$data_len="${#insert_data}";

到此:

$data_len=length($insert_data);

答案 8 :(得分:0)

使用正则表达式缩小违规代码的范围。使用shell的示例pcregrep

cat index.pl |pcregrep '[\{]{1}[\w\W^}^{]{90,}'

根据需要改变90,以便在期望结束括号之前限制块长度。