配列についての質問

このQ&Aのポイント
  • CGIの勉強中に遭遇した配列についての質問です。メッセージの表示部分で全員の内容を表示する方法を知りたいです。
  • 配列についての質問です。現在CGIの勉強中で、ゲストブックを作成しているのですが、メッセージの表示がうまくいきません。全員の内容を表示する方法を教えてください。
  • CGIの勉強中に、ゲストブックの作成で困っています。メッセージの表示部分で、全員の内容を表示する方法を教えてください。
回答を見る
  • ベストアンサー

配列について

 現在CGIの勉強として簡単なゲストブックを作ってるんですけど、わからないことがあるので質問します。 -------log.datの内容------- Aさん<>GOOです。<> Bさん<>まあいいんじゃない?<> Cさん<>ファイトー<> -------メインのCGI(表示部分)------- open(D,"log.dat"); $data=<D>; close(D); @log=split(/<>/,$data); ($name,$mes)=@log; print "$name : $mes";  こんな感じで内容を書き込むことはできましたが、 いざメッセージを表示しようとしたときに、僕が作った方法ではAさんの内容しか表示されません。  どうすれば全員の内容を表示することができるのでしょうか? 変な質問をしてるかもしれませんが、 よろしくお願いします。

  • Perl
  • 回答数2
  • ありがとう数2

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

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

>順番に配列に番号を振って行くことって可能でしょうか? @log01,@log02,@log03のように配列を作っていくことは可能だと思いますが、その後の取扱が面倒になるので、配列の配列にすればいいと思います ------------------------------------------------------------------ open(D,"log.dat"); @data=<D>; close(D); $i=0; foreach (@data){ $log[$i++]=[split(/<>/)]; } $logSize=$i; for($i=0;$i<$logSize;$i++){ ($name,$mes)=@{$log[$i]}; print "$name : $mes\n"; } ------------------------------------------------ ($name,$mes)=@{$log[$i]}; は、元の書き方を活かしているのでこういう書き方をしていますが $name=$log[$i][0]; $mes=$log[$i][1]; の様に 名前=$log[0からの一連番号][0]; メッセージ=$log[0からの一連番号][1]; のようにアクセスできます。 特に順番にこだわらないのなら、配列にしないで、名前をキーとしたハッシュにするのも1つの方法だと思います。

if_else
質問者

お礼

難しいですね・・・。 がんばって見ます。ありがとうございましたm(_ _)m

その他の回答 (1)

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

$data=<D>; だと一行しかデータを読み込んでません。 @data=<D>; とすると配列として全てのデータを読み込みます。 全員の分は、その配列の1つ1つについて処理をします。 --------------------------------------------------- open(D,"log.dat"); @data=<D>; close(D); foreach (@data){ @log=split(/<>/); ($name,$mes)=@log; print "$name : $mes\n"; }

if_else
質問者

補足

ありがとうございます。勉強になります。m(_ _)m あの、もうひとつ質問なんですけど、 順番に配列に番号を振って行くことって可能でしょうか? こんな感じで↓ @log01=("Aさん","GOOです。"); @log02=("Bさん","まあいいんじゃない?"); @log03=("Cさん","ファイトー"); よろしくお願いしますm(_ _)m

関連するQ&A

  • データの抽出、配列操作で教えて下さい。

    こんばんは、お世話になります。 配列操作で教えて頂きたく。 次のデータをuser.datとします。 1<>yamada<>99999<> 2<>tanaka<>22222<> 3<>suzuki<>10101<> 4<>yamada<>12345<> 5<>yamada<>55555<> user.datの中からyamadaの行だけ取り出して 3番目の数字データでソート表示したいのですが なかなかうまくいきません。 open(F,"user.dat"); @load_txt = <F>; close(F); foreach $data (@load_txt){ if((split(/<>/,$data)[2]) eq "$usid"){push(@txt_lines,$data);} } @txt_lines = sort{(split(/<>/,$a))[2] <=> (split(/<>/,$b))[2]}@txt_lines; 上記でおかしな所ありましたらご教示頂きたく 宜しくお願いします。

    • ベストアンサー
    • Perl
  • 読み込んだデータを配列へ代入する方法

    ---ここから--- 1,2 3,4 ---ここまで--- このようなファイルを読み込んでデータを配列へ格納するには, $pathname="D://data.txt"; open MYFILE, "$pathname"; @list=<MYFILE>; for($i=0;$i<2;$i++){ @dat=split(/,/,$list[$i]); print @dat; } close MYFILE; といったようなforあるいはwhileで1つの配列(上の場合だと@dat)に1行のデータを繰り返し入れていく方法しか思い浮かびません。できれば1行目のデータは@dat1という配列へ,2行目のデータは@dat2という配列へ,といったように行ごとに別々の配列へ代入させたいのですが良い方法はないでしょうか。 もしくは@dat=([1,2],[3,4])のような2次配列の形にでもできれば最高なのですが、、、

    • ベストアンサー
    • Perl
  • 配列要素

    ファイルから読み込んだ、要素数の分からない配列があります。 前から2つずつ順に表示したいのですが、どうしたらよいでしょうか? <ファイルfruit.datの内容>―――→商品名(全角) 半角数字 りんご 210 いちご 350 みかん 390 ぶどう 500 レモン 100 柿 200 <<表示>> 商品:りんご 210円    いちご 350円    みかん 390円 商品:ぶどう 500円 商品:レモン 100円    柿 200円 open(RF,"<fruit.dat"); while(<RF>){ @data=split; ---<ここで処理>--- } close(RF); このような感じです。 配列@dataから2つずつ表示させたいんです。 良い方法がありましたら、教えてください。

    • ベストアンサー
    • Perl
  • 二次元配列への格納

    ファイル名:log.dat は以下の構造をしています。 "Key-01"|"参照"|"P2"|"yamada" (\n\r)←改行 "Key-02"|"書込"|"P5"|"minami" (\n\r)←改行 "Key-03"|"参照"|"P3"|"yamada" (\n\r)←改行 open(IN,"log.dat") || die "log.dat",": $!"; @log=<IN>; close(IN); で@logにデータを読み込んだ後、 foreach(@log){ $data = $_; $data =~ s/ //g; $data =~ s/\n//g; $data =~ s/\r//g; $data =~ s/"//g; @second =split(/\|/ , $data); <---(1) で配列@secondに格納するのですが、 この時、@secondを(\n\r)=改行で区切るように二次元配列にしたい のです。 @second = ( [ Key-01 , 参照 , P2 , yamada ] [ Key-02 , 書込 , P5 , minami ] [ Key-03 , 参照 , P3 , yamada ] ) 上記<---(1) の部分をどのように変更すればいいでしょうか。

    • ベストアンサー
    • Perl
  • 関数の中から別の関数内のforeachの実行結果を得られない

    お世話になります。 環境 perl 5.8.0 RHLinux9 以下のようにsub _Htmlからsub _List1を呼び出す場合は正常にリスト表示できるのですが、sub _List2を呼び出した場合、 Content-Type: text/html <HTML lang=ja > <HEAD>...として表示されてしまいます。 sub _List1{ @list = (0, 1, 2, 3, 4, 5); foreach (@list) { print "$_\n"; } } sub _List2{ $a1 = "./dir/data.dat"; $a2 = "./dir/data.dat"; $a3 = "./dir/data.dat"; &FileOpen('FILE1',"$a1"); &FileOpen('FILE2',"$a2"); &FileOpen('FILE3',"$a3"); @DATA = <FILE1>; push @DATA, <FILE2>,<FILE3>; close(FILE1); close(FILE2); close(FILE3); foreach (@DATA) { ($key,$val)=split(/=/,$_); print "$key=$val"; $StartNum++; } } sub _Html{ print <<EOM; <table> <tr><td> .. EOM &_List(''); print <<EOM; <tr><td> .. </table> EOM } sub _List2の内容を、CGIからhtmlを表示する際のスキン.htmlファイル内に下記のように記述した場合も 正常にリスト表示されます。 --スキン.html------ print <<"<!---HTML--->"; <HTML lang=ja > <HEAD>... <!---HTML---> $a1 = "./dir/data.dat"; $a2 = "./dir/data.dat"; $a3 = "./dir/data.dat"; &FileOpen('FILE1',"$a1"); &FileOpen('FILE2',"$a2"); &FileOpen('FILE3',"$a3"); @DATA = <FILE1>; push @DATA, <FILE2>,<FILE3>; close(FILE1); close(FILE2); close(FILE3); foreach (@DATA) { ($key,$val)=split(/=/,$_); print "$key=$val"; $StartNum++; } } print <<"<!---HTML--->"; ... </BODY></HTML> <!---HTML---> 1; ---

    • ベストアンサー
    • Perl
  • CGIプログラムを使ってレースの結果をHTMLに表示

    CGIプログラムの件でご質問したいのですが、datファイルのレース結果をCGIプログラムを使ってHTMLに表示したいと思っています。 datファイルの内容は、レースの結果が1位から順に10位くらいまでA,B,Cクラス混合で並んでいます。 1,Aクラス,青チーム,12:50,山本太郎 2,Cクラス,赤チーム,11:23,山田花子 3,Bクラス,黄チーム,10:52,松本典子 4,Aクラス,桃チーム,10:32,加藤茶子 それをCGIプログラムによって、各クラスごとに表示します。 CGIのプログラムの内容は、 open (FILE, "<data.dat") || die "File 'data.dat' Open Error."; @all = <FILE>; close(FILE); foreach (@all){ ($data1, $data2, $data3, $data4,$data5) = split(/,/, $_); next unless ($data2 eq "A"); &one_data; } sub one_data { print << "END_OF_ONE"; <P>$data1位<BR> $data2<BR> $data3<BR> $data4<BR> $data5<BR> </P> END_OF_ONE } 1; だいたいこんな感じですが、この各クラスごとに表示したHTMLのファイルの順位のところが、もとのdatファイルの順位になってしますので、それを1位から順にクラス別の順位として表示したいのです。 それにはどのようにしたらよいでしょうか? すみません、あまりperlの言語の知識がないもので。。

    • 締切済み
    • CGI
  • 連想配列で時間短縮したい

    aaa.txt 06011800, 5.3 06012100, 5 06020000, 4.5 06020300, 6.2 … bbb.txt 06011800, 5.1 06012100, 7.5 06020000, 5.1 06020300, 9.3 … という二つのファイルがあります。 以下のプログラムを用いて、 06011800, 5.3, 5.1 06012100, 5, 7.5 06020000, 4.5, 5.1 06020300, 6.2, 9.3 … といった感じでデータを作る事に成功したのですが、どうしてもループに無駄が多く、時間がかかってしまいます。 連想配列などを使えば時間が短縮出来そうなのですが、よくわかりません。 ご教示いただけないでしょうか。 以下、作成したプログラム。 $csvfile1 = $ARGV[0]; $csvfile2 = $ARGV[1]; open(DAT1, $csvfile1) || die $!; while($line=<DAT1>) { chomp($line); @dat = split(/,/,$line); open(DAT2, $csvfile2) || die $!; while($line2=<DAT2>) { chomp($line2); @dat2 = split(/,/,$line2); if($dat[0] == $dat2[0]){ print "$dat[0],$dat[1],$dat2[1]\n"; } } } close(DAT);

    • ベストアンサー
    • Perl
  • 指定行に書込み

    open( IN, "log.cgi" ); @f_data = <IN>; close( IN ); $i = '1'; open( OUT, ">dat.cgi" ); select OUT; print "document.open();\n"; print "document.write('"; foreach( @f_data ){ if( $i > 5 ){ last; } ( $f_data1, $f_data2, $f_data3, $f_data4 ) = split( /<>/ ); $f_data1 =~ s/ //g; print "$f_data1"; $i++; } print "');\n"; print "document.close();\n"; select STDOUT; close( OUT ); 上記スクリプトで、指定された行数、又は指定された場所でdat.cgiに 書き出したいのですが、どのように書けばよろしいのでしょうか? 例えば、 ・100行目に書き出す。 または、 ・指定された文字列の間に書き出す。 (例)<!--開始-->ここに書き出す。<!--終了--> このどちらかが出来ればいいのですが、上記スクリプトをどのように変更すれば可能になるでしょうか?お手数ですが、どうぞ宜しくお願いいたします。

    • ベストアンサー
    • Perl
  • textareaに入力されたデータを読み込む

    例えば以下のようにtextarea内にデータが入力されているとします(カンマ区切り,スペース区切り,タブ区切りなどはなんでも良いのですが)。 +---ここから---+ 1 2 3 4 5 6 7 8 9 10 11 12 +---ここまで---+ これらのデータを配列に格納する方法が,だいぶネットサーフィンしていたのですが分かりません。 以降,Perlになってしまうのですが,1行ずつ配列にdat=(1,2,3,4)のように格納していくか,あるいは行列(2次配列)の形で格納したいのです。 $pathname="D://datafile.dat"; open MYFILE, "$pathname"; while (<MYFILE>) { chomp; @{"dat$."} = split /,/; } close MYFILE; +----------- $pathname="D://datafile.dat"; open MYFILE, "$pathname"; @dat = map {chomp;[split /,/]} <MYFILE>; close MYFILE;

  • cgiでの並べ替えについて

    フォームを使用して書き込みされたログファイルを並べ替えしているんですが、意図しない動きをするんです。 ログデータは以下のような感じです。 a=***&b=***&c=***&d=***&e=*** #-----並べ替えを行う open (FILE2,"<naisen.log"); flock(FILE2,2); @log2 = <FILE2>; flock(FILES,8); close FILES; @sort2 = sort {(split(/[&=]/,$a))[7] <=> (split(/[&=]/,$b))[7];} @log2; @sort3 = sort{(split(/[&=]/,$a))[5] cmp (split(/[&=]/,$b))[5];}@sort2; open (FILE2,">naisen.log"); flock (FILE,2); @filew = @sort3; print FILE2 @filew; close(FILE2); a=***&b=***&c=***&d=120 a=***&b=***&c=***&d=111 というデータがあった場合、意図している動きは a=***&b=***&c=***&d=111 a=***&b=***&c=***&d=120 という順番に並べ替えられるものですが、 a=***&b=***&c=***&d=120 a=***&b=***&c=***&d=111 です。 なぜ111の方が下にきてしまっているのでしょうか? また全部ではなく一部だけに並べ替えが適用されないのはナゼでしょうか?

    • ベストアンサー
    • CGI

専門家に質問してみよう