-3

您好,我有一个包含 1000 多个 BEGIN 和 END 的大文件,我正在寻找一种逻辑,它会告诉我每个 BEGIN 是否有 END。

例如:

    # Begin Variable

      Name = loopEndDriven
      Decl_type = UInt8
      Usage = Z
      Value = CE_SELECT

    # End Variable

    # Begin Variable

      Name = locationNeeded
      Decl_type = Loop_Location_t
      Usage = Z
      Value = SHORT_LOCATION

    # End Variable
4

4 回答 4

1
perl -lne 'BEGIN{$t=0}
           if(/Begin/ ||(eof && $t==1))
           {print "No end at $." unless($t==0);$t=1}
           $t=0 if(/End/);' your_file

当每个 Begin 没有 End 时,上述命令将打印行号。我在下面测试过:

> cat temp
    # Begin Variable

      Name = loopEndDriven
      Decl_type = UInt8
      Usage = Z
      Value = CE_SELECT

    # End Variable

    # Begin Variable

      Name = locationNeeded
      Decl_type = Loop_Location_t
      Usage = Z
      Value = SHORT_LOCATION

    # Begin Variable

      Name = locationNeeded
      Decl_type = Loop_Location_t
      Usage = Z
      Value = SHORT_LOCATION

> perl -lne 'BEGIN{$t=0}if(/Begin/ ||(eof && $t==1)){print "No end at $." unless($t==0);$t=1}$t=0 if(/End/);' temp
No end at 17
No end at 23
>

在类似的行中,我希望您也可以编写逻辑来检查每个 End 是否有 Begin。

于 2013-10-08T07:06:54.987 回答
1

假设不允许嵌套。

my $in_begin = 0;
while (<>) {
   if (/# Begin/) {
      warn(qq{Missing "End" at line $.\n"}) if $in_begin;
      $in_begin = 1;
   }
   elsif (/# End/) {
      warn(qq{Missing "Begin" at line $.\n"}) if !$in_begin;
      $in_begin = 0;
   }
}

warn(qq{Missing "End" at EOF\n"}) if $in_begin;

更好的诊断:

my $begin = 0;
while (<>) {
   if (/# Begin/) {
      warn(qq{Missing "End" for "Begin" at line $begin\n}) if $begin;
      $begin = $.;
   }
   elsif (/# End/) {
      warn(qq{Missing "Begin" for "End' at line $.\n"}) if !$begin;
      $begin = 0;
   }
}

warn(qq{Missing "End" for "Begin" at line $begin\n"}) if $begin;
于 2013-10-08T13:18:33.197 回答
0

平衡的表达

您发布的语料库中没有 BEGIN 或 END 关键字。以下单行将使用您的块注释检查平衡的表达式。

$ perl -ne '$pairs += 1 if /Begin Variable/;
            $pairs -= 1 if /End Variable/;
            END {
              if ($pairs == 0) {print "balanced\n"} else {print "unbalanced\n"}
            }' /tmp/foo

使用当前发布的语料库,单行应该打印balanced.

于 2013-10-08T06:35:20.313 回答
0

当您要求逻辑而不是实现时:

  • 逐行浏览文件
  • 每次遇到时增加一个变量# Begin Variable
  • 每次遇到这个变量就递减# End Variable
  • 如果变量曾经变为2,则前一个块是未结束的。以某种方式记录并减少。
于 2013-10-08T09:03:10.653 回答