Perlコーディング初心者質問スレ Part 44
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/10/17(月) 00:47:17ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0010nobodyさん
2005/10/17(月) 01:08:17ID:???0011nobodyさん
2005/10/17(月) 01:42:22ID:???誰か (ちゃんとしたスクリプトを書いてくれるとこ) に依頼した方が会社もお前もいい判断だろうに。
1〜2週間やそこら悩んでできないくらいだったらそのほうがはるかにコストパフォーマンスがよいハズ。
つかそんなことで雇ってもらえてるのが、何ていうか、うらやましい。
0012nobodyさん
2005/10/17(月) 01:48:57ID:???0013766
2005/10/17(月) 01:57:00ID:???おっしゃるとおりです。おいらもできるってゆっちゃったのがいけなかったんです。ほんとに前スレの999ですね。。。情けないです。
0014766
2005/10/17(月) 01:59:05ID:???今回だけマジで助けてほしい。。お願いします。
0015nobodyさん
NGNG0016nobodyさん
2005/10/17(月) 02:20:21ID:???まだ出来てないなら要点まとめて頂戴。
まずは、送信したフォームの情報が正しく所得できているのか。
↓
POSTでなく、GETで値をみられるようにする。
データを保存する方法はわかっているのか。
↓
変数に入れた文字が保存できたのか調べる。
0017nobodyさん
2005/10/17(月) 02:43:10ID:???買い物などのWEBで、検索や完了まで時間がかかるとき、「ただいま検索(登録)中です」のような一時的画面を表示させたいのですが、
perlではどのような方法があるでしょうか?
一定時間(例えば1分とか)は、特定の一時ページを表示して、
完了した時に完了ページを表示するものをイメージしています。
javaなどでは時々このようなページを使っているとこがあるのですが。。。。
一応、小枝とかその他有名なサイトは見たんですが、
こういう点での会報がわからなくて。。。。
0018766
2005/10/17(月) 02:50:52ID:???すいません。ありがとうございますです。
・送信したフォームの情報はexcelで開いたとき、名前が文字化け(EUCでやってるからだと思いますが、解決策わからず。。)
・変数にいれた文字(回答番号 1とか2とか)はcsvに数字で保存できています。
【お手上げ】
・前スレ >>981 に書いたような並びでexcelに保存ができなし。。
・名前をいれてなかったらエラー(送信できない)ようにしたい。
です。何卒ご指導お願いいたします。。まじですいません。
001916
2005/10/17(月) 03:04:21ID:???「エクセルは関係ない」。
エクセルで読める表示形式で保存したいって言うのは最後の手段で、今はそこまでいってないので頭から忘れてください。
送信する
↓
データを受け取る
↓
ファイルに保存する
第一段階でHTMLのメソッドをgetに・・・
って現段階のコード、どっかにアップしてもらったほうが早そうね。
もうちょっと常駐しとく。
002016
2005/10/17(月) 03:21:03ID:???0021nobodyさん
2005/10/17(月) 03:41:01ID:???現段階のコードは前スレに。
参考にやり取りを列挙すると
前スレ http://pc8.2ch.net/test/read.cgi/php/1123777607/ の
Q >>922-925
A >>931,932
Q >>936-938
A >>950
Q >>954-956
A >>958
Q >>981,982-986 (現状の全ソース)
その要件を実装するのはすぐにできるけれど、
完成物を渡してしまっても766のためにはならないしな…
0022nobodyさん
2005/10/17(月) 03:51:17ID:???じゃないとまた同じ事繰り返す羽目になる
002316
2005/10/17(月) 04:19:43ID:???0025766
2005/10/17(月) 04:40:42ID:???レス有難うございます。
ヒントだけでも結構です。。後はもちろん自分でなんとか完成させるつもりです。
何卒宜しくお願いいたします。
0027766
2005/10/17(月) 04:54:56ID:???http://www.nextftp.com/sentobeat/
皆さんに頼りっぱなしなのもわかっております。
ヒントだけでもいただければもちろん自分でもなんとかするようにします。
なんとか宜しくお願いいたします。。マジ泣
002816
2005/10/17(月) 05:03:25ID:???希望動作は最初のとおりでいいのよね?
002916
2005/10/17(月) 05:12:34ID:???0030766
2005/10/17(月) 05:13:39ID:???まじですか ほんとに有難うございます。。
はい。希望動作は >>18 に書いたものです。
今なんとか自分でもとりあえずエラー機能をつけようと思って
#入力チェック
if ($in{name} eq '') { &error('名前を入力してください',''); }
を頭につけてみたんですが、動きませんでした。。orz
何卒宜しくお願いいたします。
0031766
2005/10/17(月) 05:16:11ID:???ありがとうございます。
http://other.free-uploader.com/up/
でお願いしますです。
003216
2005/10/17(月) 05:30:28ID:???ソース汚いままだけど保存はちゃんとされるはず。
読みにくかったfont size=2はスタイルに勝手に変えちゃったままですが。
003316
2005/10/17(月) 05:32:40ID:???003416
2005/10/17(月) 05:41:52ID:???0035766
2005/10/17(月) 05:42:40ID:???有難うございますです。マジで感謝です。
今試してみたんでうが、動かない。。泣
パーミッションもなおしますた。
はじめのはquestion_1.inc っていうふぁいると連動してたんですが、
作っていただいたものは関係ありますか?
question_1.cgiにいきなりアクセスですよね?
003616
2005/10/17(月) 05:44:24ID:???usestrictでエラー追いやすいように一つにまとめました。
0037766
2005/10/17(月) 05:53:08ID:???!!!!
でけてるー!!! 感謝です!
こんな朝方まで付き合ってくださって本当にありがとうございます。大泣
ソースみたらやっぱり全然違いますた。。
これは質問をquestion_1.tsvから読み込まなくても、index.html → post でquestion.cgiでももしかしていけますか?
003816
2005/10/17(月) 05:57:15ID:???perlの中の変数はかなり弄ったけど、フォームの部分は触ってません。
0039766
2005/10/17(月) 06:04:44ID:???わかりましたです!やってみますです。
本当に有難うございます。
あと名前をcsvに書き出したいんですが、$in{name}で書き出せるのでしょうか?(配列は自力でやりますです。)
あとその名前が入っていなかったら、エラーにしたいんですが、さっき入れた if ($in{name} eq '') { &error('名前を入力してください',''); } じゃだめでしょうか?
これで最後の質問です。。ご指導おねがいできませんでしょうか?
0040766
2005/10/17(月) 06:16:25ID:???すませんです。。せっかく作っていただいたのですが、
1人目の名前: name1
その人の1〜3問目の回答番号: hoge1, hoge2, hoge3,
1〜3問目の正解番号: anser1,anser2,anser3
2人目の名前: name2
・
とすると
name1、hoge1, hoge2, hoge3,(改行)
”空欄”,anser1,anser2,anser3(改行)
name2、hoge1, hoge2, hoge3,(改行)
”空欄”,anser1,anser2,anser3(改行)
・
になってませんでした。。。泣
hoge1,anser1(改行)
hoge2,anser2(改行)
・
になってました。。もう一度みてもらえませんでしょうか、、再度大泣
004116
2005/10/17(月) 06:23:47ID:???いつのまにか名前入力とか増えてたのね。
>あと名前をcsvに書き出したいんですが、$in{name}で書き出せるのでしょうか?(配列は自力でやりますです。)
フォームで<input type="text" name="name" value="">としていれば$in{name}に入る。
>あとその名前が入っていなかったら、エラーにしたいんですが、さっき入れた if ($in{name} eq '') { &error('名前を入力してください',''); } じゃだめでしょうか?
cgi-lib.plでのエラー表示用はCgiDie。CgiErrorでもいいけどどっちがいいとかは忘れた。
unless ($in{name}) { &CgiDie('名前を入力してください');}
とりあえず、ヒキなおいらに頼るような仕事は今後受けないようしましょうね。
昔、友達に頼まれたCGIが、これによく似てたから作ってみただけですので。
↑これも、ただ働きだったけど。
0042766
2005/10/17(月) 06:36:14ID:???レス有難うございます。やってみますです。
はいです。今後出来ない仕事は請けないです。(絶対)
>>40 の内容をいただいたソースもとにいじってみたんですけど
やぱりエラーでした。。
# CSVへの書き出し
open (CSV , '>>file.csv');
flock (CSV,2);
print CSV join(',', $in{name}, $in{'Q'.$i}), "\n";
print CSV join(',', '', $array[1]), "\n";
flock (CSV,8);
close (CSV);
004316
2005/10/17(月) 06:36:39ID:???こゆこと?
my$data;
my@q1;
my@q2;
for (my$i = 1; $i <= @question; $i ++) {
my@array = split("\t", $question[$i - 1]);
push(@q1, $in{'Q'.$i});
push(@q2, $array[1]);
}
$data = $in{name}.','.join(',', @q1)."\n".','.join(',', @q2)."\n";
正解を保存する理由もよく分からないままなんですが。
あと、選択する問題が4つ目とか増えるなら36行めを
for (my$s = 1; $s <= (@array - 2); $s ++) {
にしないとだめです。
0044766
2005/10/17(月) 06:46:20ID:???はっ!! できてる!
有難うございますー!! (泣きっぱなし)
名前は今EUCなので、excel開けたときに文字化けすてるんですが、
こいつをcsvに書き出すときに直すソースってありますでしょうか?
(ほんとにこれで最後でございます。。)
0045766
2005/10/17(月) 06:53:52ID:???をrequire "cgi-lib.pl";の後に挿入したら、名前しれているのに
でっかく 名前を入力してください て出ます。。
いれるとこ間違ってるのかな?
004616
2005/10/17(月) 06:56:07ID:???読み方 : シーエスブイ
フルスペル : Comma Separated Values
別名 : コンマ区切り
データの保存形式のこと。文字コードの指定はない。
エクセルはShift_jis限定だっけ?
メモ帳じゃないテキストエディターで変換保存すれば読めるはず。
保存時からShift_jisにしたいのならコード変換の処理が必要。
というか、ラジオボタンで値が数字だけだからいらなかったのに、テキストフォームつけるなら、Jcodeとか必要よ?
>>45
&ReadParse;の後
0047766
2005/10/17(月) 07:08:46ID:???jcode.pl 入れますた。
下のコードをどっかにいれたりしたらokだったりしますか?
# jcode.plを用いたコード変換
require 'jcode.pl';
open READ, '<sjis.txt';
open WRITE, '>euc.txt';
while(my $data = <READ>){
jcode::convert(*data, 'euc');
print WRITE $data; }
close WRITE; close READ; exit;
004816
2005/10/17(月) 07:17:18ID:???先頭で
require 'jcode.pl';
さっき変えたところで
$data = $in{name}.','.join(',', @q1)."\n".','.join(',', @q2)."\n";
jcode::convert(\$data、'sjis');
# CSVへの書き出し
というかエクセルは文字コード固定なの?
OOoしか使ってないからエクセルのことは知らないよ。
0049nobodyさん
2005/10/17(月) 07:31:39ID:???2ch外でやってもらえません?
0050766
2005/10/17(月) 07:49:53ID:???長い間ほんとにお手数おかけしました。
無事完成いたしましたです。
本当に感謝です。たすけていただいて本当にうれしくて泣きそうでした。
有難うございました。
これから教えていただいたことを無駄にしないように自分で勉強かさねていきますです。
>>49
すいませんでしたです。
0051nobodyさん
NGNG005216
2005/10/17(月) 07:53:59ID:???次の質問どぞー
↓
0053nobodyさん
2005/10/17(月) 08:09:02ID:???0054nobodyさん
2005/10/17(月) 08:39:52ID:???0055nobodyさん
2005/10/17(月) 09:18:14ID:???0056nobodyさん
2005/10/17(月) 10:19:11ID:???0058nobodyさん
2005/10/17(月) 13:09:39ID:???二度と来ないでくれ。
0059nobodyさん
2005/10/17(月) 17:49:53ID:???0060nobodyさん
2005/10/17(月) 18:40:37ID:???そこに誘導(隔離?)するのがいいかもね。
0061nobodyさん
2005/10/17(月) 19:11:36ID:???http://pc8.2ch.net/test/read.cgi/php/1102980903/
ここに誘導しとけばよかったね
0062nobodyさん
2005/10/18(火) 00:10:47ID:aW0OtyWyプログラム名は test.cgi です。手元で、% ./test.cgi > log として、出力されたログを見ると、きちんと
EUC-JPで出力されているのですが、ブラウザでアクセスしたり、fetch コマンドでアクセスしたり、telnet で
直接WebServerと話したり、とにかくApache を通すと、日本語の部分が、&xxx; と、文字実体参照の形に
なってしまいます。どうすれば文字化けを無くせるでしょうか。
(余計な部分を切り詰めた)プログラムを貼ります。
#! /usr/local/bin/perl -w
binmode(STDOUT, ":encoding(euc-jp)");
$filename= "/usr/local/man/ja/man3/strlen.3.gz";
$command = "gzcat $filename | /usr/local/bin/groff -man -Thtml -dlang=ja_JP.eucJP";
open(PIPE, "-|:encoding(euc-jp)", "$command") or die;
@html = <PIPE>;
close(PIPE);
print "Content-type: text/html; charset=euc-jp\n\n";
for $text (@html) {
print $text;
}
006362
2005/10/18(火) 00:12:05ID:aW0OtyWyコマンドライン上で ./test.cgi > log とした時の、ファイル log の中の一部分。
<a href="#名称">名称</a><br>
WebServer にCGIを起動させて結果を得た場合の、上と同じ部分。(アンド記号はわざと全角にした。)
<a href="#&Igrave;&frac34;&frac34;&Icirc;">&Igrave;&frac34;&frac34;&Icirc;</a><br>
環境。
OS: FreeBSD 5.4-RELEASE i386
WebServer: Server version: Apache/1.3.33 (Unix)
Perl: This is perl, v5.8.7 built for i386-freebsd-64int
0065nobodyさん
2005/10/18(火) 00:27:48ID:aW0OtyWyHTMLにするのはあきらめて、Plain text で我慢しろ、っていう意味ですか?
0067nobodyさん
2005/10/18(火) 03:43:48ID:???いちいちCGIで出力するより、htmlで吐いてアップした方が良いとは思うが・・・。
コマンドラインとApacheで動作が異なる場合はまず環境変数を疑う。
とりあえず2行目あたりに
$ENV{'LANG'} = 'ja_JP.eucJP';
を挿入。これで大丈夫だと思う。確かめてないけど。
0069nobodyさん
2005/10/18(火) 13:57:42ID:???フォルダの中身を全て消す処理というのはどうすれば良いのでしょうか?
ファイルの場合は @Test=''; これだけで消せますが、
フォルダの中身全てを消去する方法が判らず製作が滞っています。
何方かお知恵をお貸し下さい。お願いします。
0070nobodyさん
2005/10/18(火) 14:03:18ID:???0072nobodyさん
2005/10/18(火) 14:29:41ID:???ここにツッコミを入れる奴はおらんのか?(笑)
0073nobodyさん
2005/10/18(火) 14:48:42ID:???@Test = `del c:\*.*`;
とするんじゃなかったっけ?
0074nobodyさん
2005/10/18(火) 15:15:57ID:???0075nobodyさん
2005/10/18(火) 15:41:11ID:???また>>16が降臨して、>>69の掲示板スクリプトを全部作ってやればいい。
但し、↓のスレでやってほしい。
■こんなCGI作ってください■
http://pc8.2ch.net/test/read.cgi/php/1102980903/
0076nobodyさん
2005/10/18(火) 17:06:06ID:???0077nobodyさん
2005/10/18(火) 17:11:13ID:???0078nobodyさん
2005/10/18(火) 21:16:25ID:???> とりあえず2行目あたりに
> $ENV{'LANG'} = 'ja_JP.eucJP';
> を挿入。
で、うまく行きました。
%gzcat /usr/local/man/ja/man3/strlen.3.gz \
| env -i /usr/local/bin/groff -man -Thtml -dlang=ja_JP.eucJP
と、環境変数無しで実行すると、groff が実体参照を吐くことも確認できました。
ありがとうございました。
0079nobodyさん
2005/10/18(火) 22:15:08ID:???レンタル鯖のCGIで接続したい場合、どういった方法を取ればいいのでしょうか。
CGI自体はローカル起動、ローカルのMySQL、ローカル起動、レンタル鯖のMySQLで正しく動くので、スクリプト上のエラーではないと思います。
0080nobodyさん
2005/10/18(火) 22:25:23ID:???htmlの方で、
<form method="post" action="****.cgi">
コメント<Input Type="text" Name="com" Size="**" Maxlength="**">
<INPUT TYPE="image" SRC="img/send.jpg" align=right>
<form>
としておいてテキストを書込み、SENDボタンを押すと、CGIが動作しコメントがログに書込される、というものです。
でperlのCGIの方で(既存のCGIを自分で修正)
#!/usr/bin/perl -w
use CGI;
変数宣言
$form = new CGI;
$com = $form->param('com');
open (TEXTFILE,">>./log.txt")
print TEXTFILE $com;
print TEXTFILE "\n";
close (TEXTFILE);
としてるのですが、どうにもうまくいきません。
どうすればうまくいくかヒントでもいただけませんでしょうか?
0081nobodyさん
2005/10/18(火) 22:27:43ID:???「変数宣言」がコメントになってないとか
あと、何がうまくいかないのか不明。
500エラーなのかファイルに保存されないのか、詳しく書くように。
008280
2005/10/18(火) 22:32:41ID:???すみません。
インターナルサーバエラーを起こして動かないという状況です。
ちなみに変数宣言は
my ($form, $com);
としています。
0083nobodyさん
2005/10/18(火) 22:41:45ID:???ヒント:Content-type(たぶん)
008479
2005/10/18(火) 23:10:34ID:???0086nobodyさん
2005/10/18(火) 23:42:22ID:???0089nobodyさん
2005/10/19(水) 00:52:35ID:???何に使われるのかが非常に気になるのだが・・・
0091nobodyさん
2005/10/19(水) 17:01:02ID:mMzWKjOm指定したディレクトリ内にある、ファイルとディレクトリの名前、
そしてそれらのパーミッションを取得して表示させるCGIを作成してます。
stat でファイルのパーミッションは上手く取得できるのですが、
ディレクトリのパーミッションは 000 が返ってきます。
どうやったらディレクトリのパーミッションも取得できますか?
該当部分の今のソースはこんな感じです。
$dir ="cgi-bin";
opendir(DIR, $dir);
while (defined($uhaha = readdir(DIR))) {
if ($uhaha ne '.' && $uhaha ne '..') {
@st = stat "$permis";
$per = substr((sprintf "%03o", $st[2]), -3);
print "$uha:$per<br>\n";
}
}
closedir(DIR);
0092nobodyさん
2005/10/19(水) 17:13:00ID:mMzWKjOmopendir(DIR, $dir);
while (defined($uhaha = readdir(DIR))) {
if ($uhaha ne '.' && $uhaha ne '..') {
@st = stat "$uhaha";
$per = substr((sprintf "%03o", $st[2]), -3);
print "$uhaha:$per<br>\n";
}
}
closedir(DIR);
0093nobodyさん
2005/10/19(水) 17:18:56ID:???こちらの環境ではちゃんと表示されるよ
問題は他のところにあると思う
関係ないけれど、
> $per = substr((sprintf "%03o", $st[2]), -3);
ここは
$per = sprintf "%03o", $st[2] & 0700;
の方が良いんじゃないかと思ったり
009493
2005/10/19(水) 17:20:55ID:???$per = sprintf "%03o", $st[2] & 0777;
0095nobodyさん
2005/10/19(水) 17:36:12ID:???パーミッションを000にすることは普通ないだろうから、
statに失敗している可能性があるな。
opendir(DIR, $dir);
while (defined($uhaha = readdir(DIR))) {
if ($uhaha ne '.' && $uhaha ne '..') {
@st = stat "$uhaha";
if (@st > 0) {
$per = substr((sprintf "%03o", $st[2]), -3);
print "$uhaha:$per<br>\n";
} else {
print "$uhaha:stat失敗($!)\n";
}
}
}
closedir(DIR);
とでもして試してみたらどうだろうか。
0096nobodyさん
2005/10/19(水) 17:57:17ID:???stat "$dir$uhaha"
じゃなかろうかカレントディレクトリでテストしちゃったから気づかなかった
009791
2005/10/19(水) 17:57:31ID:mMzWKjOmありがとうございます。
後述しますが、こちらの環境のせいかもしれません.....
あと、$per = sprintf "%03o", $st[2] & 0777; の方が何故良いのか、
パッと見てまだわからないので、後で調べてみます。
>>95
やってみました。
全部「stat失敗(No such file or directory)」でした。
そして、なんらかの原因でうまく情報を取得できていないみたいだったんで、
情報を取得したいディレクトリの中に、このスクリプトを放り込んで実行した所、
完璧に表示されました。
上位でも下位でも、階層が違うディレクトリを指定すると、
上手く情報が取得出来ないようです。
なんでだ...
009891
2005/10/19(水) 18:00:40ID:mMzWKjOm全て謎がとけましたw
その通りですね。
テンパってるとダメですね.....ありがとうございました!
0099nobodyさん
2005/10/19(水) 23:56:03ID:???0,yamada,A32,333
1,tanaka,B22,555
上記のようなCSVファイルから1行ずつ読み込んでハッシュに入れたいのですがどのように
すればいいのでしょうか。問題点がCSVの一行目をカンマごとにばらしたのをハッシュのキー名
にして2行目からをそれぞれの値として入れなくてはいけないのです。
モジュールも使えないのでよりどうしたらいいのかわかりません。
$filename="test.csv";
%arr2 = &COUNT($filename);
foreach $value (values %arr2) {
print "$value\n";
}
sub COUNT{
open (IN, $filename)or die "$!";
while(<IN>){
$buff = $_;
chomp($buff);
@buff = split(/,/, $buff);
%arr2 =();
$arr2[] = @buff[];
$arr2[] = @buff[];
$arr2[] = @buff[];
close IN;
return %arr2;
}
}
whileの前に先に一行だけ読み込んでキーを作ってしまうべき何でしょうか。
ずっと堂々巡りで悩んでしまいました。
0100nobodyさん
2005/10/20(木) 00:29:03ID:???>whileの前に先に一行だけ読み込んでキーを作ってしまうべき何でしょうか。
それが一番ラクだと思うけど。むしろ何故ソレを実行しないのかわからん。
0101nobodyさん
2005/10/20(木) 00:32:14ID:???@buff = split(/,/, $buff);
%arr2 =();
$arr2[] = @buff[];
$arr2[] = @buff[];
$arr2[] = @buff[];
の意味が分からん。俺の知識不足。つまり
@buff = split(/,/, $buff);
%arr2 =();
$arr2[0] = @buff[0];
$arr2[1] = @buff[1];
$arr2[2] = @buff[2];
ってことなの?
0102nobodyさん
2005/10/20(木) 00:36:48ID:???$arr2[0] = shift(@buff);
$arr2[1] = shift(@buff);
...
だろうな。そもそもハッシュ使いたいっぽいからこれでも違うけど。
てか今はどうしていいかわからなくなってる状態だと思われ。
0103nobodyさん
2005/10/20(木) 00:36:51ID:???これでいいのか分からんが。
count('test.csv' => \%data) or die 'Failed to count';
print "$_: ", join(' / ', @{$data{$_}}), "\n" for sort keys %data;
sub count {
-f (my $file = shift) or warn('No such file'), return;
open IN, '<' . $file or warn($!), return;
my $hash = shift;
my @key = <IN> =~ /\w+/g;
while (<IN>) {
chomp;
my $i = 0;
push @{ $hash->{$key[$i++]} }, $_ for split /,/;
}
close IN;
}
010499
2005/10/20(木) 00:47:28ID:???この次の段階としてCSVファイルの任意の部分だけを読み込み、書き換えよう
にしなくてはいけないので、できるだけ汎用性を持たせた関数を作るよう心がけるように
との事なので、悩んでいました。
配列のところはそのようにするつもりです。whileでまわして配列をハッシュに移すのに
途惑っていて流れが整理できなくなっていました。
家の環境ではすぐに試せないのですが皆さんいろいろアドバイスありがとうございます。
010699
2005/10/20(木) 01:20:15ID:???0107nobodyさん
2005/10/20(木) 01:46:11ID:???my @data;
open(IN, $file) or die $!;
(my $key = <IN>) =~ s/^#\s*|\n//g;
my @keys = split(/,/, $key);
for (<IN>) {
chomp;
local %_;
@_{@keys} = split(/,/);
push( @data, { %_ } );
}
close(IN);
---
結果、以下のように代入される。
@data = (
{ 'ID' => '0', 'NAME' => 'yamada', 'TEL' => '333', 'ADDRESS' => 'A32' },
{ 'ID' => '1', 'NAME' => 'tanaka', 'TEL' => '555', 'ADDRESS' => 'B22' }
);
アクセスは、
print $data[0]{NAME}; # yamada
print $data[1]{TEL}; # 555
0108nobodyさん
2005/10/20(木) 02:51:02ID:???と書いてあるのは分かってるが、あえてCPAN モジュール版を。CSVって、
カンマで区切ってるだけと思ってる人も多いけど、泥くさいフォーマットだよ。
use strict;
use warnings;
use IO::File;
use Text::CSV;
my $parser = Text::CSV->new();
my $in = IO::File->new('test.csv', 'r')
or die('test.csv: ' . $!);
(my $field_names_line = <$in>) =~ s/^#\s*//;
$parser->parse($field_names_line)
or die('field keys are not found');
my @field_names = $parser->fields();
my @list = ();
while (1) {
my $row = $parser->getline($in);
last unless 0 < @$row;
my %hash = ();
@hash{@field_names} = @$row;
push(@list, \%hash);
}
@list = (...>>107 と同じ内容...);
■ このスレッドは過去ログ倉庫に格納されています