|
/*========================================================*/ <<<あゆしゃのC言語プログラミング>>> /*========================================================*/ 第411回 GIBS5 2次元配列入出力 発行 2003年12月26日(金曜日) 発行数 約3200 {magclick} {magclick} /*========================================================*/ はじめに ( 決り文句 ) /*========================================================*/ ・このメールマガジンはまぐまぐさんから発行しています。 ・ジャンルは、マルチメディアのプログラム、C言語です。 ・このメールマガジンは、横60文字で作成しています。 また、インデントはすべて半角スペース4つで構成しています。 ・ここで扱うプログラムは、C言語と半光年以内のものです。 ・登録解除は、まぐまぐさんのホームページでお願いします。 ・まぐまぐさんのバックナンバー(下欄参照)を活用して下さい。 ・ここは私の復習の場です。内容は約1ヶ月内外に私が勉強した 内容になっています。最新の技術があれば、へたれもあります。 ・わかりやすさを優先させる為、たまに嘘があるかもしれません。 /*========================================================*/ ご挨拶 /*========================================================*/ こんにちは。あゆしゃです。 いやぁ、ハーフパイプって、怖いですねぇ。 しかし、あゆしゃ@ハーフパイプ安全運転宣言の私でも、 エメラルドのノーマルをクリアできました。 するとなんと、ダイヤモンドカップなるものが出現したでは ありませんか? これはもう、 「レインボーロード! レインボーロード!」 という勢いで、コースを見てみたのですが、 ・・・ないじゃん。やだなぁ。。 {magclick} /*========================================================*/ 今回のお題 << GIBS5 2次元配列入出力 >> /*========================================================*/ 前回、ターン終了時の処理についてまとめてみました。 さて今回は、2次元配列の一括入出力についてまとめて、 2003年を終了したいと思います。 /*========================================================*/ データはテキストで保存されており、それを読み込んで スプリットします。 # ファイルからデータを全部読み込む open( IN, $file_name ); # ファイルをオープン @dt = <IN>; # ファイルの内容をすべて読み込む close( IN ); # ファイルを閉じる # データを処理する foreach $dt2 ( @dt ) # データ量だけループ { $d = split( /,/, $dt2 ); # カンマ区切りのデータを分割 print $d[ $index_name ]; # 名前を出力 } Perlで書くと、こんな感じです。 すべての情報をメモリ上に読み込んで、それを必要なときに スプリットします。 2種類のデータがリンクしている場合は、こんな感じに なります。 foreach $dt2 ( @dt ) # データ量だけループ { $d = split( /,/, $dt2 ); # カンマ区切りのデータを分割 $d2 = split( /,/, $ndt[ $index_name ] ); # 名前情報1つ取得 print $d2[ $index_name ]; # 名前を出力 } なんだかもう、スプリットばかりで飽き飽きです。 そこであゆしゃは、2次元配列に興味を持ちました。 /*========================================================*/ あゆしゃがPerlの教科書としているのは、 Perl/CGI Programming & Samples 大島智樹&平尾順一著 と、 CGI&Perl 究極のレシピ350 杜甫々著 この2つですが、2次元配列については、簡単な代入と参照が とほほさんの本に示されているだけでした。 $i = 0; foreach ( @d ) # データをループ { @d2 = split( /,/ ); # 1レコードを取得 $j = 0; foreach ( @d2 ) # 1レコードをループ { $md[ $i ][ $j++ ] = $_; # データをセット } $i++; } print "name:$md[ 3 ][ 2 ]<BR>"; # データを狙い撃ちで出力 1行ずつスプリットして、1件ずつ2次元配列にセットする。 簡単ですが、面白くありません。 私はこう、したいのです。 $i = 0; foreach ( @d ) # データをループ { @md[ $i++ ] = split( /,/ ); # 一括設定! したいな } print "name:$md[ 3 ][ 2 ]<BR>"; # データを狙い撃ちで出力 配列を一度に代入したかったのですが、どうもこれは、Perlの 文法上よろしくないようで、わけの分からにゃい結果になります。 代入のところを、 $md[ $i++ ] = split( /,/ ); ${ md[ $i++ ] } = split( /,/ ); $( md[ $i++ ] ) = split( /,/ ); @d = split( /,/ ); $md[ $i++ ] = @d; とかなんとか、いじってみたのですが、全滅でした。 Perlにおいては基本的知識のないあゆしゃにとって、アイデア だけではどうにもならないと思いました。 そこで、インターネットで調べてみることにしました。 /*========================================================*/ すると、あっさりと解決方法が見つかりました。 ご親切なことに、展開だけでなく保存するときに使用できる 一括参照の方法まで解説してありました。 @md[ $i++ ] = [ split( /,/ ) ]; # 一括設定 print "name:$md[ 2 ][ 3 ]<BR>"; # 単体参照 print OUT join( ",", @{ $md[ 2 ] } ); # 一括参照 [ ] 演算子と、{ } 演算子を、上手に使うことが答えだった ようです。 これは初心者のアイデアでは、どうにもならなかったですね。 解説を見てみると、[ ] 演算子は、この場合は配列のインデック スを指定するものではなく、 リスト参照コンストラクター というご立派な名前があるそうです。8へぇ。 C言語ライクに解説すると、[ ] 演算子は、split関数の戻り値で あるスタック上の一時的な配列をメモリ上にアロケートして、その ポインタを取得する、といった感じでしょうか。 だからsplit関数の戻り値を直接代入しては、わかんにゃい結果 になったのですね。当然といえば、当然です。 { } 演算子にいたっては、$変数を@変数にキャストしてしまえ、 という、すごい方法でした。 しかし実際、これを使ってみると、 ・・・動くのですねぇ(ほくほく)^^ /*========================================================*/ さいごに /*========================================================*/ 厳密に言うとちがうのですが、まぁ、いいでしょう。 論理的に納得することは大事なことです。 ちなみに参考にしたホームページは、個人のもののようなので アドレスは書きませんが、Googleにて、 Perl 多次元 split で検索できる中の、「Perlでリストのリストを扱う」という ページです。 この内容が難しいのですよ、奥さん。 {magclick} /*========================================================*/ 次回予告 /*========================================================*/ 次回は1月5日(月曜日)に、第412回を送ります。 お題は「2004年」 毎年恒例、1ヵ年目標についてのお話です。 お楽しみに! /*========================================================*/ 最後の決り文句 /*========================================================*/ このメールマガジンは、まぐまぐさんから発行しています。 このメールマガジンを解除したい場合は、まぐまぐさんをご利用 ください。このメルマガのまぐまぐアイディーは最後にあります。 このメールマガジンには広告が挿入されます。 このメールマガジンの内容に文面の引用はありません。 めーらっくすの場合はめーらっくすの利用方に従ってください。 このメールマガジンの内容は、転用、流用、宣伝、リンク、 いやぁ、プログラムって、本当に、面白いものですね、それでは また来年お会いしましょう、さいなら*3 なんて大歓迎です。 {magclick} /*========================================================*/ /*========================================================*/ 発行者 あゆしゃ まぐまぐアイディー 0000020674 まぐまぐバックナンバー http://jazz.tegami.com/backnumber/frame.cgi?id=0000020674 あゆしゃの世界 http://ayusya.hp.infoseek.co.jp/ 登録と解除 http://www.mag2.com/m/0000020674.htm ご意見・ご感想・ご質問メール mailto:ayusya@flamenco.plala.or.jp めーらっくす <<過去ログがタイトル別になっています>> http://www.mailux.com/mm_dsp.php?mm_id=MM3E1AEE285AB4F |