Perl 配列を置きかえるとき、次の配列とつなげて置き換えするには?ともう一つ

[上に] [前に] [次に]
!!! [E-Mail] 2000/01/23(日) 17:21:35
CGIスクリプトのソースを意味がわかるように置きかえる
CGIスクリプトを作ろうとしているのですが、コメント
(置き換えのとき)やIF、
FORなど数行に渡っているものをどうすればいいか、
また、''の中の変数などを置き換えないようにするには
どうすればいいのでしょうか。
1.コメント
2.シングルクォーテーション
この二つを何とかしてください。
スクリプトはこれです。
#!/usr/local/bin/perl

open(IN, "okikae.cgi");#置換元スクリプト
open(OUT, "> kekka.txt");#置換結果
@data = <IN>;
@data =~ s/\n#(.*)\n/コメント $1/g;#問題地点
@data =~ s/print ([^;]*);/$1を表\示する/g;#printの置き換え
close(IN);
foreach $data (@data) {
print(OUT "$data");
}
close(OUT);

びぎな++ 2000/01/24(月) 11:10:45
ちょっと興味があったので,考えています。初心者ですが・・・

コメント行以外にはPerlの改行を示す「;」がついていますから,
逆をついて,

--------------foreachの中----------------------
if ($data =~ s/\;//g) {print OUT "$data\n";}
$data =~ s/(.+$)\n/コメント $1/g;
print OUT "$data\n";
-----------------------------------------------

なんてするのはどうでしょう。表示は「コメント #〜〜・・・」となりますが。
その他については考え中です。(^^;

びぎな++ 2000/01/24(月) 11:25:28
ごめんなさい!
これじゃfor文の中身も全部コメントになっちゃいますね。
やっぱりわたしにゃできません。(^^;
では。

ふじ 2000/01/24(月) 14:17:28
Perlは非常にいろんな書き方が出来る言語なので、
単純に「# があったらその後は行末までコメント」
等という処理ではおそらく追いつきません。

for (0..$#array){
    s#hoge#fuga#g;
}
とか書けますし、行頭に # が付いていればコメントと見なせるかというと

print <<END;
# これはコメントじゃない
END

とかいう場合もあるし。

if や for などの {} (ブロック)があるものについては、
一文字ずつ見ていって { と } の数の対応を数えるという
手もありますが、これとて

s/\{/\[/g;

なんて場合もあるからエスケープも考慮しなくちゃいけないし・・・・

まともに作ろうと思ったら、Perl の構文解析エンジンと同等のものになるでしょう。
# Perl のソースを読む?(^^;

!!! [E-Mail] 2000/01/29(土) 21:32:35
では、あきらめます。

[上に] [前に] [次に]