• 締切済み

条件を指定しての置換

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

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

ここでは if の条件で使われているので, 件の URL にある「フリップフロップ演算子」の方>#3. 意味は「左にある条件が成り立ってから右にある条件が成り立つまでの間」です. 今は s/// if /\+CCC/ .. /\+DDD/; なので「/\+CCC/ が成り立ってから /\+DDD/ が成り立つまでの間 s/// を実行する」という意味になって, 結局「/\+CCC/ にマッチする行から /\+DDD/ にマッチする行までに対して s/// で置換する」ということになります. ただ, 「パターンとして覚える」なら s/// if /\+CCC/ ... /\+DDD/; と . をもう 1つ加えた方が安全かも.

  • pick52
  • ベストアンサー率35% (166/466)
回答No.3

> ちなみに(/\+CCC/../\+DDD/)この中の..はどういう意味ですか。 これは範囲演算子では? print "$_\n" foreach(0 .. 10);

参考URL:
http://ja.wikibooks.org/wiki/Perl/%E6%BC%94%E7%AE%97%E5%AD%90#.E7.AF.84.E5.9B.B2.E6.BC.94.E7.AE.97.E5.AD.90
  • pick52
  • ベストアンサー率35% (166/466)
回答No.2

+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)
回答No.1

s/name/address/ if (/\+CCC/../\+DDD/); なんてので。 ^を追加するとかはお好きに。

kenkenaoao
質問者

お礼

ありがとうございました。 できました!! ちなみに(/\+CCC/../\+DDD/)この中の..はどういう意味ですか。

関連するQ&A