-3

こんにちは、数千の 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

ネストが許可されていないと仮定します。

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

実装ではなくロジックを求める場合:

  • ファイルを 1 行ずつ見ていく
  • 遭遇するたびに変数をインクリメントする# Begin Variable
  • 遭遇するたびにこの変数を減らします# End Variable
  • 変数が になった場合2、前のブロックは終了していません。これを何らかの方法で記録し、減分します。
于 2013-10-08T09:03:10.653 に答える