プロが教える店舗&オフィスのセキュリティ対策術

下記のプログラムをベースにして置換を行いたいです。

use File::Basename;
use File::Copy;
use File::Find;
use File::Path;

my @filelist = ();


$inputfile='C:\Users\test.txt';
$outputfile='C:\Users\test_new.txt';

open (IN, $inputfile) or die "$!";
open (OUT, ">$outputfile") or die "$!";

while(<IN>) {
$str = $_;
if ($str =~ / ・・・・・
・・・・・
}
print OUT $str;
}

close (IN);
close(OUT);

sub wanted{
push(@filelist, $File::Find::dir."/$_") unless ($_ =~ /^\.$/);
}

Perlプログラムで下記の2つのソースを一括置換しようとしてます。
(1) paramIdとparamNameの文字列が同一の場合
<html:link styleClass="push" action="/numa.do" paramId="Id" paramName="Id" onclick="URL">ソース</html:link>

(2) paramIdとparamNameの文字列が同一でない場合
<html:link styleClass="push" action="/numa.do" paramId="Id" paramName="Name" onclick="URL">ソース</html:link>


やりたいことは
・ html:linkをs:aに変換
・ styleClassをcssClassに変換(これはわかるのですが位置の修正がわかりません。。)
・ action="/numa.do"を/numaに変換
・ paramIdとparamNameを文字列が同一か同一でないかで分岐処理したい。

目標は以下のように置換したいです。
(1) paramIdとparamNameの文字列が同一の場合
<s:a href="/numa?Id="%{ Id }" cssClass="push" onclick="URL">ソース</s:a>


(2) paramIdとparamNameの文字列が同一でない場合
<s:a href="numa" paramId="Id" paramName="Name" cssClass="push" onclick="URL">ソース</s:a>


どうしてもこの置換ができません、、誰かぜひ教えてください。
お願い致します。

A 回答 (3件)

まず, この手のことを本格的にやろうとしたら XML を扱うライブラリを使うことを考えるべきです. 例えば, 複数行にわたっていたりネストしていたりすると, 正規表現だけではなかなか難しいことをさせられる可能性があります.



逆に言えば, 「1行に収まっていて」「ネストはしていない」状況なら正規表現で処理することができます. ただし本題に入る前に以下の点を確認させてください:
・ほかの属性があったらどうしますか?
・「styleClassをcssClassに変換(これはわかるのですが位置の修正がわかりません。。)」とありますが, 「位置の修正」ってなんですか? そして, それはなぜしなければならないのですか (相手がよほどアホでない限り無意味な操作ですよ)? ついでに, 置き換えた結果を使う相手がよほどのアホであるという悲惨な状況を想定した場合, cssClass 属性はどこに入れる必要があるんですか?
・「action="/numa.do"を/numaに変換」とありますが, action 属性の値が "/numa.do" 以外のときは変換しないままでいいんですか?
・「paramIdとparamNameの文字列が同一の場合」のところに書いてある「%{ Id }」ってなんですか?
    • good
    • 0

あ, 今気づいた.



「やりたいこと」の中に
・ action="/numa.do"を/numaに変換
ってあるんだけど, 「目標」の方にはこの属性が入ってない. そして, なぜか href なんて属性が増えてる. つまり「やりたいこと」が「目標」を正確には反映していない.

あと #1 に補足:
・最終的に属性はどのような順番で並べればいいんでしょうか (「ほかの属性がある」場合には特に問題になるんだけど, そうでない場合も含めて)?
・元のソースで styleClass 属性の値が push でなかった場合にはどうすればいい?
・paramId, paramName および onclick の各属性の値は変わりえる?

この回答への補足

・actionをhrefの属性に変更になります。
action="/numa.do"をhref="/numa"にしたいです。

ごめんなさい、属性の順番(位置)については考慮しなくてもよくなりましたので順番は特に問題ないです。
>・元のソースで styleClass 属性の値が push でなかった場合にはどうすればいい?

その場合、属性の値は元の値と先の値を同じにさせます。

・paramId, paramName および onclick の各属性の値は変わりえる?

はい、変わります。

補足日時:2013/11/18 18:40
    • good
    • 0

えぇと, 実は「属性の順番に意味がある」方が (ある意味) 簡単だったりします. というのは, そのような場合には元のソース自体で


・styleClass → paramId → paramName → action という順に属性が表れる
という仮定ができる可能性があるからです. もしそうなら難しくないですよね.

これが, 「元のソースからして属性の順番がぐちゃぐちゃ」ということになると, わりとまじめに属性を処理する必要があります. まあできるんだけど, そういうことだと s でちまちま置換するよりも「元のソースから目的の文字列を『構築』する」という方針を考えた方が早いような気がする. 例えば
$ref = "numa";
$paramId = "Id";
$paramName = "Name";
$class = "push";
$click = "URL";
$content = "ソース";
と変数に値があるときに
<s:a href="numa" paramId="Id" paramName="Name" cssClass="push" onclick="URL">ソース</s:a>
という文字列を作りたい (上の変数の値を href や paramId などの属性の値にする) としたら, どう作りますか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!