メルマガ:あゆしゃのC言語プログラミング
タイトル:あゆしゃのC言語プログラミング(Vol.411) GIBS5 2次元配列入出力  2003/12/27


/*========================================================*/
    <<<あゆしゃの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

ブラウザの閉じるボタンで閉じてください。