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

すいません。教えてください。

テスト,: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というファイルに出力するプログラムを作りたいです。
どうか、よろしくお願い致します。

A 回答 (4件)

$_に入っている文字列ですが、この形では無理ですね。


<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

頑張ってください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/11/28 20:19

open(OUT, ">out.txt") or die;


s/<.*?>//g; # s/<[A-Z]+>//g or s/<[^>]*>//g
print OUT $_;
close(OUT);
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/11/29 11:40

$_="テスト,: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) . ",";
    • good
    • 0

$_="テスト,: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";
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/12/02 19:18

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