![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
PerlでCGIスクリプト(掲示板もどき)を作成しています。
配列の操作がうまくいかず、ご教授頂きたいと思います。
<やりたい事>
1.ブラウザ上のフォームからの入力を、カンマ区切りでテキストファイルに追記して保存。
2.そのテキストの一部を使ってHTMLで表を作る。
<実際の作業>
1.フォームからのデータはcgi-lib.plで連想配列として受け取り、unshiftでテキストファイルへ追記する。
&ReadParse;
#フォームからデータを受け取る
$o=$in{'name'};
$p=$in{'mail'};
$q=$in{'title'};
$r=$in{'comment'};
open(IN,"xxx.txt");
@tmp1=<IN>;
close(IN);
#1件1行として新規データを追加する
unshift (@tmp1,"$oo" , "," , "$pp" , "," , "$qq" , "," , "$rr","\n");
open(OUT,">xxx.txt");
print OUT @tmp1;
close(OUT);
2.xxx.txtのデータを読み込んで、1列目(name)と3列目(title)だけを使った表を作る。
データを読み込む時点でつまづき、先に進めません。
<テキストファイルの例>
1行目:a,b,c,d
2行目:e,f,g,h
3行目:i,j,k,l
以下同様
<症状>
print @tmp1;とすると、a~lの全てのデータが表示される。
$tmp1[0];とすると、(a)のみ表示される。
$tmp1[1];とすると、カンマ(,)が表示される。
$tmp1[2];とすると、(b)が表示される。
<質問>
一つの行(配列)に対して2回繰り返す処理(nameとtitle)と、行単位で繰り返す処理(1行目、2行目…)を合わせればいいのだろうと思っていますが、どうすればいいのかわかりません。
気分的には↓こんな感じです。
foreach {
"行の処理"
foreach {
"列の処理"
}
}
そもそも、区切り文字であるカンマが、配列に格納されている時点で失敗しているのかな?とも思っています。
宜しくお願いします。
なお、不足している情報がありましたら補足いたします。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_08.png?e8efa67)
No.3ベストアンサー
- 回答日時:
> unshift (@tmp1,"$oo" , "," , "$pp" , "," , "$qq" , "," , "$rr","\n");
ここがやはりちょっとおかしいですね。
本来は
unshift @tmp1, "$oo,$pp,$qq,$rr\n";
このようにすべきだと思います。
こうすれば一行につき一件のデータとなります。
> 2.xxx.txtのデータを読み込んで、1列目(name)と3列目(title)だけを使った表を作る。
この場合も上記のようにしていれば簡単です。
一行につき一件のデータで、そのデータがカンマ区切りになっているわけですから、
open IN, "xxx.txt";
my @tmp1 = <IN>;
close IN;
my $HTML = "<table>\n";
$HTML .= "<tr><th>name</th><th>title</th></tr>\n";
for (@tmp1) {
chomp;
my @data = split /,/; # ←これでカンマ区切りのデータが配列に格納されます
$HTML .= "<tr><td>$data[0]</td><td>$data[2]</td></tr>\n";
}
$HTML .= "</table>\n";
print "Content-Type: text/html\n\n";
print $HTML;
exit;
となり、$data[0]と$data[2]でテーブルを作って下さい。
ありがとうございます。
unshift (@tmp1,"$oo" , "," , "$pp" , "," , "$qq" , "," , "$rr","\n");
を
unshift @tmp1, "$oo,$pp,$qq,$rr\n";
に修正したところうまくいきました。
No.2
- 回答日時:
デフォルトでは @tmp1 = <IN>; の直後では $tmp1[0] の値は "a,b,c,d\n" になっていないとおかしいはずです. 特殊変数で影響するのは $/, $,, $" くらいかな. ただ, 本当にこのコードでやってるなら入力そのものは間違っていないはずです. あと気になるのが, この「<症状>」というのが「どの時点で表示させたものか」ですね. どこで表示させたかがわからないので, この症状だけ見せられても問題解決には全然使えないです. 問題が生じるなるべく小さなコードを載せておいてくれればいいんですが....
ついでにいえば, 「1件 1行」とするなら「1行 = 配列の 1要素」とするのが安全じゃないかな. この unshift はちょっと疑問.
ありがとうございます。
unshift (@tmp1,"$oo" , "," , "$pp" , "," , "$qq" , "," , "$rr","\n");
を
unshift @tmp1, "$oo,$pp,$qq,$rr\n";
に修正したところうまくいきました。
No.1
- 回答日時:
@tmp1 = <IN>; としたならば $tmp1[0] には "a,b,c,d\n" が入っていると思うのですが、、もしかしたらグローバル変数で挙動を変えられたかも知れません。
"perldoc perlvar" というコマンドで Perl にあらかじめ定義されている変数一覧とその説明を見ることが出来ます。本当に @tmp1=<IN>; で $tmp1[0] に1行目が入っていないのならば、これを探すと設定するべき変数が見つかると思います。
これだけではヒントにならないと思うので、サンプルコードを書いておきますね。(インデントは消えてしまうのですね。。。)
<入力(hoge.txt)>
a,b,c,d
e,f,g,h
i,j,k,i
<コード>
open(IN, "hoge.txt");
@lines = <IN>;
close(IN);
$i = 0;
foreach $line (@lines) {
print ++$i;
@cols = split(/,/, $line);
foreach $col (@cols) {
print "\t$col";
}
}
<出力>
1 a b c d
2 e f g h
3 i j k i
それぞれの処理をサブルーチンに分けていたせいもあるかもしれません。
ご提示のコードでうまくいきそうな気配がしてきました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- その他(プログラミング・Web制作) python コードについて(初学者です) 3 2023/07/20 14:44
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- PHP 文字列を段落で分ける方法を教えて下さい。 2 2023/03/09 10:03
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アルファベットに付いて質問し...
-
Perlのエラーについてご教授く...
-
テキストファイルで提出とは?
-
perlプログラミング 空白行削除
-
perlをバージョンアップしたら...
-
perl 正規表現でエラー
-
LinuxにおいてのPerlのプログラ...
-
Perlの質問:行と列を入れ替え...
-
Strawberry Perl for Windows ...
-
ターミナルで特定の文字と文字...
-
Perlの全角スペース 文字化け?
-
Perlで時間の計算
-
openした後、closeしないでプロ...
-
これをビジュアルスタジオで実...
-
【超初心者】異なるディレクト...
-
ファイルをディレクトリ分配の...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
どのようなプログラムをつくれ...
-
csvで順番の入れ替え
-
perlでの三次元配列の作り方
-
配列の中に重複文字列があるか...
-
要素を削除する最適な方法
-
perlで複数行のデータを自由に...
-
pushをすると行ができる
-
ファイルから読み込んで配列へ
-
Perlの初歩的な質問・・・
-
行・列の整理! perl
-
C言語のバイナリモードでのfsca...
-
perl-cgi 文字の長さでソートし...
-
C言語でバイナリファイルの読み...
-
Pythonの再帰関数の動作の流れ...
-
CSVデータ「","」と「,」混在読...
-
perlで読み込んだURLを配列に入...
-
perlの無名配列の使い方を教え...
-
ソートのテクニックについて
-
ランダムでかぶらないように4...
-
頻度表の作成(Perl初心者です)
おすすめ情報