- 締切済み
条件を指定しての置換
Perlでの文字置換の質問です。以下のように文字列があった場合に +AAA a01 name +BBB b01 name +CCC c01 name +DDD d01 name ・ ・ +CCCと+DDDの間にあるnameの文字のみaddressに置換したい時は どのようにPerlで記述したらよろしいでしょうか。 全てのnameがaddressになってしまい困っています。 よろしくお願いします。 完成形↓ +AAA a01 name +BBB b01 name +CCC c01 address +DDD d01 name
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
ここでは if の条件で使われているので, 件の URL にある「フリップフロップ演算子」の方>#3. 意味は「左にある条件が成り立ってから右にある条件が成り立つまでの間」です. 今は s/// if /\+CCC/ .. /\+DDD/; なので「/\+CCC/ が成り立ってから /\+DDD/ が成り立つまでの間 s/// を実行する」という意味になって, 結局「/\+CCC/ にマッチする行から /\+DDD/ にマッチする行までに対して s/// で置換する」ということになります. ただ, 「パターンとして覚える」なら s/// if /\+CCC/ ... /\+DDD/; と . をもう 1つ加えた方が安全かも.
- pick52
- ベストアンサー率35% (166/466)
> ちなみに(/\+CCC/../\+DDD/)この中の..はどういう意味ですか。 これは範囲演算子では? print "$_\n" foreach(0 .. 10);
- pick52
- ベストアンサー率35% (166/466)
+CCCと+DDDの間にあるnameは1つのみですか? また、+CCCと+DDDは残しますか? 恐らくはもっと効率のいい方法があると思いますけど(そもそも書き方 間違っている可能性大です)こんな感じで。 my $str = <<'TEXT'; +AAA a01 name +BBB b01 name +CCC c01 name +DDD d01 name ・ ・ TEXT $str =~ s/(?=\n)?(?=\+CCC\n)(.*?)(name)(\n.*?)*?(?<=\n\+DDD)(?<=\n)?/$1address$3/gs; print $str; exit;
- sakusaker7
- ベストアンサー率62% (800/1280)
s/name/address/ if (/\+CCC/../\+DDD/); なんてので。 ^を追加するとかはお好きに。
お礼
ありがとうございました。 できました!! ちなみに(/\+CCC/../\+DDD/)この中の..はどういう意味ですか。