如何使用Perl将C注释从一行开始移动到结尾?

时间:2009-05-19 07:11:29

标签: c perl comments

如何在当前循环中运行时检查下一行? 另外,如何将C注释移动到表的行尾?

我有一个这样的文件:

array_table=
{
    /* comment 1*/ (unsigned int a); 
    /* comment 2*/ (unsigned int b); 
    /* comment 3*/ (unsigned int c); 
    /* comment 4*/ (unsigned int d);
}

我的目的是将这些评论移到行尾,如:

array_table=
{
    (unsigned int a); /* comment 1*/
    (unsigned int b); /* comment 2*/
    (unsigned int c); /* comment 3*/ 
    (unsigned int d); /* comment 4*/
}

我怎样才能在Perl中做到这一点?任何人都可以帮我解决Perl代码吗?

4 个答案:

答案 0 :(得分:1)

这样的事情应该有效:

while (<>) {
    chomp;
    if ($_ =~ m%^(.*)/\*(.*)\*/(.*)$%) {
            printf "%s%s/*%s*/%s", $1, $3, $2, $/;
    } else {
            print $_ . $/;
    }
}

括号中的表达式匹配评论之前的任何内容,评论本身以及评论后留下的任何内容。 printf然后按正确的顺序重新组合它们。

答案 1 :(得分:1)

好的 - 重申我认为你要求的内容,你想解析一个文件,并寻找表格的分配

foo=
   {
       ....
   }

并且在块中,您希望将注释移动到行尾。有很多方法可以做到这一点,最优雅的方法通常与你在循环中做的其他事情有关。浮现在脑海中的那个只是为了记住最后一行包含'='并在一行开头匹配'{'时使用该事实的事实。使用我最喜欢的perl结构之一,标量上下文中的范围运算符。所以这会给......

my $last_line_an_assignment = 0;
while (<DATA>)
{
    if (($last_line_an_assignment && m!^\s*{!) .. m!^\s*}!)
    {
        s!(/\*.*?\*/)\s*(.*)$!$2 $1!;
    }

    print $_;

    $last_line_an_assignment = m!=!;
}

__DATA__

  /* comment other */ (unsigned int a); 

  other_assignment=
     /* not a table */ 12;

  array_table=
      {
        /* comment 1*/ (unsigned int a); 
        /* comment 2*/ (unsigned int b); 
        /* comment 3*/ (unsigned int c); 
        /* comment 4*/ (unsigned int d);
      }

  /* comment other */ (unsigned int a); 

您可以将数据打印到另一个文件,也可以使用perl的'-i'选项更新文件

local (@ARGV) = ($filename);
local ($^I) = '.bak';
while (<>)
{
    # make changes to line AND call print
}

这会导致perl备份$ filename(扩展名为'.bak'),然后循环中的所有打印调用都将覆盖文件中的内容 - 有关更多信息,请参阅中的'-i'选项。 “perlrun”手册页。

答案 2 :(得分:0)

如果您只想更改array_table声明中的评论:

perl -pe's,^(\s*)(/\*.*?\*/)\s*(.*?)[ \t]*$,$1$3 $2, if/^\s*array_table\s*=/../^\s*\}/'

另外简单地说:

perl -pe's,^(\s*)(/\*.*?\*/)\s*(.*?)[ \t]*$,$1$3 $2,'

答案 3 :(得分:0)

使用Regexp :: Common而不是滚动自己的。 E.g。

use Regexp::Common;

while ($_ = <DATA>) {
    chomp;
    if (s/(^\s*)($RE{comment}{C})//) {
        print $1, $_, $2, "\n";
    }
    else {
        print $_, "\n";
    }
}

__DATA__
              /* comment other */ (unsigned int a); 

              other_assignment=
                 /* not a table */ 12;

              array_table=
                  {
                    /* comment 1*/ (unsigned int a); 
                    /* comment 2*/ (unsigned int b); 
                    /* comment 3*/ (unsigned int c); 
                    /* comment 4*/ (unsigned int d);
                  }

              /* comment other */ (unsigned int a);