- 締切済み
文字列操作に関する質問です。の回答のプログラムについての質問です
以前、”文字列操作に関する質問です。”という質問タイトルで投稿をしてある回答をいただいたのですが、 その回答にあるプログラムが目的どおり動くのはわかりましたが読解がどうしても出来ないので教えていただけないでしょうか。 以下がそのプログラムです。 $_="テスト,: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"; } まず4行目ですが、 ([^A-Z][^<]*)<([A-Z]+)>は、A-Z以外の文字・<以外の文字の0回以上の繰り返し・<A-Zの文字の1回以上の繰り返し> という意味だと思ったのですが表示させてみると@bの内容は$b[0]=田中,$b[1]=TANAKA,$b[2]=一郎,...$b[5]=Iでした。 それと7行目のfoo([@b], []);において引数[@b], []がどういうものなのかわかりません。[]って何でしょうか? さらに11行目my @b = @{$_[0]};において@{$_[0]}って何でしょうか。ハッシュ(連想配列)?? 同様に15、16行目foo([@b], [@c,$d[0]]);foo([@b], [@c,$d[1]]);もよくわかりません。 自分でもいろいろ調べたつもりなのですがどうしてもわかりません。 どうかよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- hara_peko
- ベストアンサー率28% (11/38)
No.2です。すいません、URL二つ書いたらくっついちゃいましたね。ごめんなさい。(^^; 途中で切り取って見に行ってください。
- hara_peko
- ベストアンサー率28% (11/38)
7,11,15,16行目に関しては下記のURLを参考にしてみて下さい。情報が足りないようでしたら「perl」「リファレンス」「perlreftut」「perlref」といったキーワードで探すとよいでしょう。
- osamuy
- ベストアンサー率42% (1231/2878)
> まず4行目ですが、 正規表現のパターンとしては質問文通りです。 パターン一致演算子にオプションとしてgが指定されてますので、左辺@bに一致した文字列が全て代入されます。 この動作の説明については、Perlの標準添付ドキュメントperlopにかかれてますので、そちらをごらんになってみては。 > 7行目のfoo([@b], []) []は、無名配列への参照(reference)を生成するコンストラクタです。 サブルーチンfooは、内部で自分自身fooを再帰呼び出ししてます。この際今扱ってるデータに悪影響が及ばないよう、[@b]でデータを複製してから、fooを呼び出してます。 第2引数の[]は、結果を受け取るため(結果としてデータを設定してるのが、15-16行目あたりになります)に、空の配列への参照を渡してます。 参照については、ドキュメントperlrefをご覧ください。再帰的なデータ構造については、ドキュメントperldsc/perlfaq4/perlfaq7あたりが参考になります。