嵌套注释修改的问题,可以使用perl解决么?

嵌套注释修改的问题,可以使用perl解决么?

程序里有这样的注释,要求修改;
/* comment start
/* following coments
/* again
/* comment end */

希望得到的结果是
/* comment start
** following coments
** again
** comment end */

用sed尝试了很多,仍然没有能够解决。
请高手帮忙。谢谢。


[Copy to clipboard] [ - ]
CODE:
~]$ cat test
程序里有这样的注释,要求修改;
/* comment start
/* following coments
/* again
/* comment end */

希望得到的结果是
/* comment start
** following coments
** again
** comment end */

用sed尝试了很多,仍然没有能够解决。
请高手帮忙。谢谢。



[Copy to clipboard] [ - ]
CODE:
~]$ cat test.pl
#! /usr/bin/perl -w
#       test.pl

use strict;     use warnings;

open(FN,"test")||die $!;
my $i=0;
while(<FN>){
        if ($_=~/^\/\*/){
                if($i==1){
                        $_=~s/^\/\*/**/;
                }else{$i=1;}
        }
        $i=0 if $_=~/\*\//;
        print $_;
}



[Copy to clipboard] [ - ]
CODE:
~]$ ./test.pl
程序里有这样的注释,要求修改;
/* comment start
** following coments
** again
** comment end */

希望得到的结果是
/* comment start
** following coments
** again
** comment end */

用sed尝试了很多,仍然没有能够解决。
请高手帮忙。谢谢。

非常感谢。需要修改的文件命想从shell传入,这样的话程序应该怎样修改?
从来没写过perl,问题太弱了,sorry。


QUOTE:
原帖由 jcadam 于 2007-9-10 17:45 发表
非常感谢。需要修改的文件命想从shell传入,这样的话程序应该怎样修改?
从来没写过perl,问题太弱了,sorry。

这样MS也行
my $tag=0;
while(<FILE>)
{
        if(/\/\*/../\*\//)
        {
                if($tag==0)
                {
                        $tag=1;
                        print;
                        next;
                }
                s/\/\*/\*\*/;
        }
        print;
}

这是一种方法:
$variable=`shell command`;

不好意思,我没说清出意思。
就是在shell中可以用
./perlscript.pl modify_file
这样的形式调用的意思。
这个应该怎么写?


QUOTE:
原帖由 jcadam 于 2007-9-10 18:58 发表
不好意思,我没说清出意思。
就是在shell中可以用
./perlscript.pl modify_file
这样的形式调用的意思。
这个应该怎么写?

将test.pl里面的open(FN,"test"); 的"test"替换成$ARGV[0];
就是open(FN,$ARGV[0]); 试试看
谢谢perljoker和shappen。
我的问题解决了。
shappen兄的代码稍微和我想的有些不一样,比如
/* test comment */

/* test comment2
/* following
/* test comment2 end */

/* test comment3
/* following 1
/* following 2
/* test comment3 end */
替换以后的结果将是
/* test comment */

** test comment2
** following
** test comment2 end */

** test comment3
** following 1
** following 2
** test comment3 end */

这个问题能不能在引申一下,不知道解决起来是否会变复杂。
1.通常修改source的人对删除部分的做法就是把大段的代码注释掉,比如下面这段

    int sampleVar;   /* this is a var */

    /***********************************
    /* function start with nothing
    /* @author: stupidman
    /* @return: int XXX
    /* comment end here */
    int sampleFoo {
          this.sampleVar = 0;   /* something you want to do */
          return this.smapleVar;  /* return it */
    }
注释之后就变成了
   /*
   int sampleVar;   /* this is a var */
   
   /***********************************
   /* function start with nothing
   /* @author: stupidman
   /* @return: int XXX
   /* comment end here */
   int sampleFoo {
   this.sampleVar = 0;   /* something you want to do */
   return this.smapleVar;  /* return it */
   }
   */
这样的话,之前正确的注释就变成了嵌套注释了。
能不能用perl写一个快速检验和修改代码是否符合某个约定好的规范的工具?
觉得还是可以做一做的。这次两位兄弟帮我看到了perl的妙处,赶紧找了资料
学起来。脚本语言有很多快捷方便的地方阿。
2. perljoker兄弟给的脚本对多行注释效果非常之好,但是单行的情况,比如
   /* printf("%2d\n", tPar->cnt); /* the original comment */
这样的source的情况也有,应该怎么修改。我自己是用perljoker兄的脚本做了
多行注释的整理之后,再使用sed修改的,能否有一个脚本可以对这两种情况进
行处理?
3. 其实嵌套注释的问题还是挺复杂,但是如果用栈作简单的分析来解决似乎更好,
而且更加准确。perl也应当能胜任。自己想了想,不知道怎样trim掉格式之后再
把格式返回来。因为时间紧迫就放弃了。不知有没有更好的解决办法?

再次感谢。

对于输入参数提供目标文件名, 修改
open(FILE, $ARGV[0]) or die "Where the hell is $ARGV[0]?"; 即可

对于单行的问题, 正则式很难解决, 比如说这么一行:
/* test1*/    /* test2 */ /* test3 */
这也属于解决嵌套时会涉及到的问题.

对于嵌套的处理, 需要按顺序的处理字符串中的字符
.
貌似麻烦事太多,我也是初学者,难了我也8会
而且能简单,何必负责
我这样认为,可以修改源码,做这样的替换

[Copy to clipboard] [ - ]
CODE:
$_ =~ s/\/\*/\n\/*/sg;

这样/*必然作为行首了
然后再使用原来简单的代码来修改注释
或者把这个作为预处理,同一个pl就能实现这样的目的
看看效果如何


QUOTE:
原帖由 perljoker 于 2007-9-14 09:52 发表
貌似麻烦事太多,我也是初学者,难了我也8会
而且能简单,何必负责
我这样认为,可以修改源码,做这样的替换
$_ =~ s/\/\*/\n\/*/sg;
这样/*必然作为行首了
然后再使用原来简单的代码来修改注释
或者把这 ...

恩, 注释的问题和换行无关, 将整个源文件作为一个字符串来匹配更恰当.


~正常情况下都能替换~

    open FILE, $ARGV[0] or die "Where the hell is $ARGV[0]?";
    my $str = join "", <FILE>;
    close FILE;
   
    while ($str =~ s~(/\*[^/]*)/\*~$1**~g) {};
   
    print "\n$str";