4

使用不匹配的数组大括号 ("[ ]") 或范围括号 ("{ }") 编译(或执行)perl 程序会导致“缺少右花括号或方括号”语法错误。Perl 经常将源报告为您的最后一个代码行(“在 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

4

10 回答 10

13

如何立即解决此错误:

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

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

如何防止未来的错误:

  1. StackOverflow 问题 719476展示了如何修改大括号/括号的 VIM 大括号/括号语法着色。(有些版本默认不这样做。)

  2. Karl Guertin 的 AutoClose 插件在键入时自动匹配 [, (, {, ", ' 符号。

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

  4. 付费书呆子用户说:“在 VIM 编辑器中使用perltidy和nmap。”

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

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

 

sub foo {
...
}

或者

sub bar
{
...
}
于 2009-11-24T22:24:52.437 回答
9

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

于 2009-11-24T22:17:58.527 回答
5

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

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

nmap \g mt:%!perltidy<CR>'t
于 2009-11-25T08:48:40.623 回答
3

使用帕德雷。单击 Perl->查找不匹配的大括号。它将光标向右移动到问题上。

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

http://padre.perlide.org/

于 2012-10-25T20:46:58.310 回答
1

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

:syntax on

于 2009-11-24T22:17:18.170 回答
0

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

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

于 2009-11-27T23:02:40.387 回答
0

如果您没有看到任何丢失的大括号:如果文件在 Windows 中创建并尝试在 Linux 中使用,则将\r
替换为\n可以帮助解决此问题。

于 2013-03-05T12:29:41.573 回答
0

我在一个看起来完美匹配的大括号和方括号的脚本中遇到了这个错误......除了我使用了 bash 样式的语法,它实际上注释掉了一行的后半部分(带有花括号对的后半部分) .

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

$data_len="${#insert_data}";

对此:

$data_len=length($insert_data);
于 2015-01-30T08:30:18.507 回答
0

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

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

90在期望结束大括号之前根据需要限制块长度。

于 2016-04-22T17:07:55.823 回答
0

作为@Ether 和@Matthew Glidden 的简单重新陈述和组合:

意图显示如下 ( vi command like this)

  1. 转到文件顶部 ( 1G)
  2. 搜索括号(/[[({]然后按“Enter”)
    • 那是“斜线”“开口方括号”“开口方括号”“开口圆括号”“开口花括号”“闭合方括号”
    • 作为一个正则表达式,我们正在寻找一个全是左大括号的自定义字符类。
  3. 查找结束匹配括号 ( %)
  4. 再次查找起始括号 ( %)
  5. 查找下一个左括号 ( n)
  6. 从 3 开始重复,直到您检查了文件中的所有括号。

早在 HP-UX 11.11(如 ~2001)上的 vi 就可以工作。

于 2022-01-27T19:24:09.147 回答