2009-05-19 2 views
1

現在のループで実行中に次の行を確認する方法はありますか? また、テーブルの行末にCコメントを移動するにはどうしたらいいですか?Perlを使って行頭から最後までCのコメントを移動するにはどうしたらいいですか?

私はこのようなファイルを持っている:私はPerlでそれを行うことができますどのように

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

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

を私の意図は次のように行の最後にそれらのコメントを移動するのですか?誰もがPerlコードで私を助けることができますか?このような

+1

エラー:ENOTXTSPK – Alnitak

+0

あなたの質問はすべて奇妙にフォーマットされている必要がありますか? – innaM

+0

CAN HAZ TEH CODEZ? – daotoad

答えて

1

何か作業をする必要があります:

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

括弧表現は、コメントの前にコメントした後に残されたコメント自体、そして何かを何かを一致させます。 printfは正しい順序でそれらを再構成します。

+0

なぜあなたはそれをchompし、 –

+0

だから$ 3には改行が含まれていない。おそらく余計だろう。 – Alnitak

+0

btw perlreのマニュアルページがあいまいです - '$'は "行末(または末尾の改行文字)に一致しています"という意味です。 $ _と一致するとは言わないので、入力に何が起こっているのかは不明です。\ r \ n – Alnitak

1

OK - あなたがファイルを解析したい、私はあなたが求めている何を考えて言い直し、およびフォーム

foo= 
    { 
     .... 
    } 

とブロック内で、あなたがコメントを移動したいのassigmentsを探すために行末。これを行うにはいくつかの方法がありますが、最もエレガントなのは通常ループ内で何をやっているのかと関係しています。心に浮かぶのは、最後の行に '='が含まれていることを覚えておいて、行の先頭に '{'をマッチングするときにその事実を使用することです。私の好きなperlのコンストラクトの1つを使って、スカラーコンテキストの範囲演算子。だから、これはあなたが別のファイルにデータを印刷するか、またはあなたの場所にあるファイルを更新することができ、

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

これをperlへ「-i」オプションを使用して...

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に$ filenameのバックアップを作成させ(extention '.bak')、ループ内のすべての印刷呼び出しは内容を上書きします。詳細については、 "perlrun"マニュアルの '-i'オプションを参照してくださいページ。

+0

私はaを持っています。ファイル内のファイルが1つずつファイルを検索してテーブルを検索していて、最後に表示されているコメントを移動する必要があります...これは私が欲しいものです....私は次のことを知りたいループを実行している間ループごとに毎回各ラインを集めて、最後に=を確認しています...そして、私はテーブルの次の行に存在していることを確認するためにhwを知っています。 ... – User1611

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,' 
0

使用正規表現::一般的ではなく、独自の圧延より。例えば。

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); 
関連する問題