• ベストアンサー

文字列操作に関する質問です。

すいません。教えてください。 テスト,:10,田中<TANAKA>NONAMAEHA一郎<ITIROU>TO言<I>IMASU,N000,123,__,050210,99999, が$_に入っているとして、これを テスト,:10,田中NONAMAEHA一郎TO言IMASU,N000,123,__,050210,99999, テスト,:10,田中NONAMAEHA一郎TOIIMASU,N000,123,__,050210,99999, テスト,:10,田中NONAMAEHAITIROUTO言IMASU,N000,123,__,050210,99999, テスト,:10,田中NONAMAEHAITIROUTOIIMASU,N000,123,__,050210,99999, テスト,:10,TANAKANONAMAEHA一郎TO言IMASU,N000,123,__,050210,99999, テスト,:10,TANAKANONAMAEHA一郎TOIIMASU,N000,123,__,050210,99999, テスト,:10,TANAKANONAMAEHAITIROUTO言IMASU,N000,123,__,050210,99999, テスト,:10,TANAKANONAMAEHAITIROUTOIIMASU,N000,123,__,050210,99999, というように<>の部分を展開してout.txtというファイルに出力するプログラムを作りたいです。 どうか、よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.4

$_="テスト,:10,田中<TANAKA>NONAMAEHA一郎<ITIROU>TO言<I>IMASU,N000,123,__,050210,99999,"; @a = split(/,/,$_,-1); @b = $a[2] =~ /([^A-Z][^<]*)<([A-Z]+)>/g; ($fmt = $a[2]) =~ s/[^A-Z][^<]*<[A-Z]+>/%s/g; open(OUT, ">out.txt"); foo([@b], []); close(OUT); sub foo { my @b = @{$_[0]}; my @c = @{$_[1]}; my @d = splice(@b, 0, 2); if (@d) { foo([@b], [@c,$d[0]]); foo([@b], [@c,$d[1]]); return; } $a[2] = sprintf($fmt, @c); print OUT join(",", @a)."\n"; }

1129san
質問者

お礼

回答ありがとうございます。 ばっちりできました。 再帰させているのですねなるほど。

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

$_="テスト,:10,田中<TANAKA>NONAMAEHA一郎<ITIROU>TO言<I>IMASU,N000,123,__,050210,99999,"; @a=split /,/; $a[2]=~s/([^A-Z].*?)<([A-Z].*?)>/\2/g; print join(",",@a) . ",";

  • t140
  • ベストアンサー率39% (59/150)
回答No.2

open(OUT, ">out.txt") or die; s/<.*?>//g; # s/<[A-Z]+>//g or s/<[^>]*>//g print OUT $_; close(OUT);

1129san
質問者

お礼

早速の回答ありがとうございます。

  • fire--
  • ベストアンサー率49% (146/293)
回答No.1

$_に入っている文字列ですが、この形では無理ですね。 <TANAKA>を田中と対応させていますが、<>を特殊文字と考えれば TANAKAは取り出せますが、これが田中と対応するのを理解するには 常識を前提とした推理が必要です。 <田中|TANAKA>ならば<>|を特殊文字とすえば可能でしょう。 やりかたは色々あると思いますが、初心者向けの単純な方法として つぎのような手順ではどうでしょう。 1.aaa<bbb>ccc<ddd>eee<fff>ggg の文字列を<>で分割し、 aaa bbb ccc ddd eee fff ggg の7個の文字列に分解する。 index関数とsubstr関数でできます。 2.bbb ddd fff を更に|で分解する。   これもindex関数とsubstr関数でできます。 3.次に全組み合わせの結合された文字列を作る。   $a = $b . $c;のように結合できます。 以下URLで全てできるはずです。 http://www.tohoho-web.com/wwwperl.htm 頑張ってください。

1129san
質問者

お礼

早速の回答ありがとうございます。 なるほど。参考にしてがんばってみます。

関連するQ&A