Perlコーディング初心者質問スレ Part 58
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2008/08/06(水) 22:54:32ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1203935151/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0320nobodyさん
2008/10/08(水) 05:57:55ID:vsHGNNNAスクリプトが大きくなれば大きくなるほどスクリプト自体見づらくなるだろうし、
他人からすると見づらいかもしれませんが、無駄に変数作って無駄にメモリへの書き込み
増やすぐらいならグローバル変数使うほうがいいと思ってました。
変数の中身が同じ内容なら新しく書き込まず同じメモリを参照するということはないですよね?
皆さんが教えてくれた方法をいくつか試してやってみようと思います。
質問に答えてくださった方々ありがとうございました。
0321nobodyさん
2008/10/08(水) 06:58:31ID:???>>296のように、リファレンスで渡せばコピーは発生しないよ。
直接中身を弄れるから、returnで返す事も要らない。
0322nobodyさん
2008/10/08(水) 10:04:27ID:???この考え方のが無駄
0323nobodyさん
2008/10/08(水) 10:25:26ID:???どんなんだろうとは思う。
0324nobodyさん
2008/10/08(水) 10:40:29ID:???0325nobodyさん
2008/10/08(水) 16:11:59ID:KrA4Ywcmそうなんですか。自分はパッケージ?(Data::Dumper)というのは触ったことないので
これを機会に触ってみようと思います。
>>322 >333
仮に完成しても人が来るかもわかりませんが仮に来てくれて書き込みがあった場合
1回の書き込みでテキストから100行ほどの文を3つの配列によみこんでまた書き込みしなければ
いけないので変数受け渡しでやるとすごい負荷になるんですよね。
しっかりした知識があれば1つの配列で収まるかもしれないし
それ以前に配列だけグローバル変数にすれば済む話ですが。
とりあえずできる限りローカル変数にしてみようと思います。
0326296
2008/10/08(水) 17:23:24ID:???掲示板の機能とかには関係ありません。
>>296を全部コピペして、「コマンドラインから実行」してみてください。
%hash の内容が書き換っている事が分ります。
0327nobodyさん
2008/10/08(水) 18:07:19ID:???変数が一部分でしか使われていないなら、その使われている辺りを調べればいいけど、
グローバル変数の場合、最悪、全てのソースコードとにらめっこすることになる。
サブルーチンのテストするにしても、グローバル変数がどこで使われてるのか
分からないから、全ての変数を設定しないといけない。
そんな理由で、グローバル変数は定数ぐらいにして、捨てたほうが楽になるよ。
同じ理由で、一つのハッシュに詰め込みすぎるのにも注意してね。
0328nobodyさん
2008/10/08(水) 18:20:31ID:???掲示板と画像ドラッグを同列に扱うという感覚がよくわからない。
あるページに複数がアクセスしてるとき、誰が画像の主導権を握るの?
リアルタイムで動かすなら、Perlではどうにもならんから、AjaxとかASP.NETスレで訊いてみれば?
0329nobodyさん
2008/10/08(水) 19:13:15ID:Ayb4NO8cいくら変数をローカルにしたところで、無駄な処理やループが大毛りゃ話になりません
0330nobodyさん
2008/10/09(木) 00:02:38ID:???書き込みボタンを押した時点で、ロックをかけようと思ってます
同時に何人かが動かし続けるような状態にはならないと思う
A 画像A
B 画像B
書き込みボタン
Aさんが画像を動かして書き込みボタンを押して変更したとき
Bさんは動かす前の画面のままで、画像を動かし書き込みボタンを押したら、Aさんは無視してBさんが動かした状態に更新されていいです
それか
A 画像A OK Clear
B 画像B OK Clear
こんな風に数行に渡ってかかれたものをOKボタンで座標と名前上書きでもいい
一人の人が一つのボタン、一つの画像と名前用テキストボックスを所有
Aが動かしたとき、Bがアクセスし動かしてても、ページはAが動かす前の状態
Aが動かし終わってAの画像座標を保存したとき、Bが見てるのはまだAが動かす前の状態
Bが動かしてOK押したとき、やっとBが見れるのはAもBも動いた後の状態
こんな風にできたらいいなと思ってます
Javaよりも、ジャバスクリプトとParlでできそうと思って・・・
ジャバスクリプト部分は完成してます
後はOKボタンでどう座標を保存するか・・
説明いまいちですか?
0331nobodyさん
2008/10/09(木) 02:03:13ID:???A,Bはそれぞれ自分専用の画像を動かすってこと?
ま、いいやw
座標をクエリ文字列にしてURLにして送信ってとこまではおk?
JSONにして送信してもいい。
基本的にJavascriptの質問な気がする。。。
0333nobodyさん
2008/10/13(月) 00:56:20ID:Zn63xY/1以下のようにデフォルトキャラセットをUTF8とし、メールを解析しているのですが、
MIME::WordDecoder->default(MIME::WordDecoder->new(['*' => sub {jcode(shift)->utf8},]));
my $body = unmime($entity->bodyhandle->as_string);
文字列「結構色々」の「構色」で文字化けが発生し、以降の文がおそらくアスキー文字の出現まで文字化けが続きます。
結=?'!9FI$・・・・・・・・というような文字列に文字化けしています。
もとの文字列(メールの原文ISO-2022-JP)をJcodeで直接UTF8にコンバートするとこのような文字化けは発生しません。
これは何が原因かわかる方はいらっしゃいますか?
unmimeはbase64エンコードされたメールなども処理するので、できれば使いたいのですが。
0334nobodyさん
2008/10/14(火) 02:12:34ID:7R/mK8k7PerlでApacheのnoteを取りに行くにはどうすればいいでしょうか?
test.cgi
#!/usr/bin/perl
print "Content-type: application/x-httpd-cgi\n\n";
my $r = Apache->request()->main();
my $name = $r->notes('name');
print $name;
exit(0);
参考元:http://jp.php.net/manual/ja/function.apache-note.php
取りに行くのに必要な条件、足りない記述などを教えていただきたいのです。
ファイル内の記述以外に、mod_perlが必要だとかはありませんか?
ご教授、よろしくお願いします。
0335nobodyさん
2008/10/14(火) 10:26:02ID:???0336nobodyさん
2008/10/15(水) 13:00:34ID:???たしかモジュールで提供されてたと思いますが・・・
0337nobodyさん
2008/10/15(水) 18:02:46ID:???use Time::Local;
$time_str = "2008/10/15 17:54:32";
$time = timelocal sub{@_[5,4,3,2],$_[1]-1,$_[0]}->($time_str=~m!^(\d+)/(\d+)/(\d+) (\d+):(\d+):(\d+)$!);
0338nobodyさん
2008/10/15(水) 18:03:45ID:???0341nobodyさん
2008/10/17(金) 17:00:00ID:M5nni1qD変数内の末尾のスペースが全て削られて、
実行されてしまうのですが、同様の事象を経験した人いませんか?
0342nobodyさん
2008/10/18(土) 18:37:34ID:???8年前なので内容が古いのではないかと少し心配です。
この本は、今でも十分実用に耐えうる本でしょうか?
CGIプログラミング 第2版
http://www.oreilly.co.jp/books/4873110440/
0344nobodyさん
2008/10/18(土) 20:18:42ID:???0345nobodyさん
2008/10/19(日) 01:16:41ID:???それで以下のソースのように、「test.mp3」というファイルを「2008.01.01.mp3」という風にリネームしてダウンロードしたいのですが…
#!/usr/local/bin/perl
$fname = "2008.01.01.mp3";
$mime = "Content-type: audio/mpeg\n\n";
print "Content-disposition: attachment; filename=\"$fname\"\n";
open(FILE,"test.mp3");
print $mime;
binmode(FILE);
binmode(STDOUT);
print <FILE>;
close(FILE);
この方法だと、何故か「2008[1].01.01.mp3」という風に、間に[1]という文字が挿入されてしまいます。
ドットが2回続くとこうなるみたいですが…
ちなみにIEだけでこうなるみたいで、OperaやFireFoxでは問題なくダウンロード出来ました。
もしIEで正常にダウンロードする方法があれば、どなたか教えて頂いてもよろしいでしょうか?
よろしくお願い致します。
0346nobodyさん
2008/10/19(日) 02:12:01ID:???0347nobodyさん
2008/10/19(日) 02:14:25ID:???キャッシュは最初の.までしかファイル名としてみてないのか・・・
やっぱりあほだな>IE
0348nobodyさん
2008/10/19(日) 06:32:58ID:???A-Za-z0-9_
な範囲でいこーぜ
0349345
2008/10/19(日) 22:03:33ID:???どうもありがとうございます。
やはりIE特有のバグみたいですね・・・
Content-dispositionを使うと強制的にShift-JISになったりと、IE何か微妙すぎるよorz
今までの書式が2000.01.01のような形だったので、出来ればそのままが良かったのですが・・・
せっかくなんでファイル名を変えるようにしてみます。
皆様、どうもありがとうございました。
0350nobodyさん
2008/10/24(金) 17:38:04ID:gaOQS66Zテンプレ >3 に[Perl5.8Unicodeメモ]がありますが、perl5.6.1ではどうすればよいのでしょうか?
(>3 [Perl5.8Unicodeメモ]の一番上はリンク切れのようです)
やりたいこと:データベース(euc)からデータを読んでutf8に変換してHTMLを出力する
やってみたこと:↓
---------------------
use strict;
use utf8;
use Unicode::Japanese;
use DBI;
(@list にDBからデータ取得)
print "Content-Type: text/html\n\n";
print <<HTML;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>UTF-8 表示テスト</title>
</head>
<body>
<h1>UTF-8 表示テスト</h1>
<table border="1">
<tr><th>ID</th><th>データ1</th><th>データ2</th><th>データ3</th></tr>
HTML
(つづく)
0351350
2008/10/24(金) 17:48:16ID:gaOQS66Zmy $jcode = Unicode::Japanese->new();
my($id, $data1, $data2, $data3);
for (0..$#list-1) {
$id = $list[$_]->{id};
$data1 = $jcode->set($list[$_]->{data1}, 'euc')->utf8;
$data2 = $jcode->set($list[$_]->{data2}, 'euc')->utf8;
$data3 = $jcode->set($list[$_]->{data3}, 'euc')->utf8;
print qq|<tr><td>$id</td><td>$data1</td><td>$data2</td><td>$data3</td></tr>\n|;
}
print <<HTML;
</table>
</body>
HTML
exit;
--------------------------------------
これで(私が見る限り)問題なく動作しました。
DBのデータには機種依存文字も含まれているのですが、それも出力されました。
これでいいのでしょうか?
0352350
2008/10/24(金) 17:51:40ID:gaOQS66Z上のソースはutf8で書きました。
0353y
2008/10/26(日) 01:17:05ID:???http://detail.chiebukuro.yahoo.co.jp/qa/question_detail.php?qid=1220150877
506 :目のつけ所が名無しさん:2008/10/26(日) 00:47:20
大手ECサイトで、ここまで派手なリリース失敗は初めて見た。
エンジニア向けIT情報誌や関連サイトは、ぜひ取材して原因を明かして欲し
いは。
0354nobodyさん
2008/10/26(日) 04:20:46ID:???ちゅか、お金を扱うサイト作るの怖い。
0355nobodyさん
2008/10/26(日) 09:49:05ID:???0356nobodyさん
2008/10/27(月) 17:52:44ID:???ページによっては情報を取得できないことがあるようです。調べてみたところ
リクエストの成功判定がおかしいらしく、ページによっては代入したリクエス
ト結果の値が変わってしまう(?)みたいです。原因がよくわからないので
アドバイスをいただけたらと思います。よろしくお願いします。
use HTTP::Request;
use LWP::Parallel;
my $pua = new LWP::Parallel::UserAgent;
$pua->max_hosts(1);
$pua->remember_failures(1);
$pua->agent('HTTP Test Program 0.1');
my $site = {
method => GET,
url => 'http://www.w3.org/MarkUp/Drafts/',
# url => 'http://www.w3.org/',
};
my $req = HTTP::Request->new($site->{method}, $site->{url});
$req->{site} = $site;
print $req->as_string();
if (my $res = $pua->register($req)) {
print STDERR $res->request->url, "\n";
print STDERR $res->error_as_HTML;
}
my $entries = $pua->wait(300);
foreach (keys %$entries) {
my $res = $entries->{$_}->response;
print $res->code.":".$res->message."\n";
$res->request->{site}{response} = $res; # 代入
$res ? print "Success\n" : print "Fail\n"; # 代入元
$site->{response} ? print "Success\n" : print "Fail\n"; # 代入先
}
0357nobodyさん
2008/10/29(水) 10:01:41ID:???下記のように前のページからPOSTデータを取得してTemplateに書き出したいのですが、
POSTのデータが受け取れません。
どう修正すればよいでしょうか?
#! /usr/bin/perl
use strict;
use warnings;
use Tripletail qw(/dev/null);
use CGI;
$TL->startCgi(
-main => \&main,
);
sub main {
my $t = $TL->newTemplate('template.html');
my $cgi = CGI::new();
#前ページからPOSTデータの取得
$a = $cgi->param('a');
$b = $cgi->param('b');
$t->expand(
STR => $a,
NUM => $b,
);
$t->flush;
}
0358nobodyさん
2008/10/29(水) 17:52:23ID:???0359nobodyさん
2008/10/29(水) 18:33:23ID:???0360nobodyさん
2008/10/29(水) 18:43:45ID:???0361nobodyさん
2008/10/30(木) 03:00:37ID:???perlのパスは以下のとおりにするといいよ
#!C:/perl/bin/perl
0362nobodyさん
2008/10/30(木) 09:23:45ID:???Tripletail::Template::Node#expand: the value for key [NUM] is not defined. (key [NUM] の値が指定されていません)
と表示されます。
0363nobodyさん
2008/11/02(日) 21:06:44ID:???datに書き込んだログデータを読み込む場合って
配列、変数、連想配列、
どれに読み込むのが読むのも吐き出すのも早いですか?
0364nobodyさん
2008/11/02(日) 21:14:51ID:???一度の実行で何度も繰り返すわけじゃないからどうでもいいレベル
結論を言うと後で見てもわかりやすいようにバグの入り込む余地がないくらい手堅く書くのがいいかと
0365nobodyさん
2008/11/02(日) 21:30:21ID:Tjmw1r4yスカラー、配列、ハッシュ、
どれが掲示板のログデータを読み出し吐き出しすることに向いてますか?
って質問です。
>>364
なら配列の方が手軽でよさそうですね、ありがと
0366nobodyさん
2008/11/03(月) 11:36:36ID:???0367nobodyさん
2008/11/03(月) 12:00:57ID:???小規模掲示板レベルであればテキストファイルにしてインデックスを用意したようが扱いやすい
DB は確かに扱える人からすりゃ便利すぎて他の考慮の余地ないかもしれないが、全ての環境で DB が動いてる、導入されてると思うな。って思うんです。
0368nobodyさん
2008/11/03(月) 20:35:21ID:???0369nobodyさん
2008/11/04(火) 01:08:37ID:???0370nobodyさん
2008/11/04(火) 01:53:06ID:???data[335]->{'time'}
みたいに扱えるようにしてるからさほど苦労はない
ただ多岐に渡るデータの全文検索とかになると TSV の場合
数千件のデータすらタイムアウトになるから
全データを1つのファイルにまとめた検索用データを作ったりと、ソースがみすぼらしくなるw
0371nobodyさん
2008/11/06(木) 02:33:06ID:???一行目をカラム名にして $index{'カラム名'}=左から何列目 といいきかせ、
次の行からは @hoge に split でそーにゅーして、
$hoge[$index{'カラム名'}] でいぢくれば、
表に変更があっても保守楽かなぁ。
0372nobodyさん
2008/11/06(木) 07:50:45ID:???0374nobodyさん
2008/11/06(木) 09:59:01ID:???0375nobodyさん
2008/11/06(木) 10:23:52ID:???0376nobodyさん
2008/11/06(木) 11:15:22ID:???0377nobodyさん
2008/11/06(木) 12:29:12ID:???今時mysqlとSQLiteくらいは使えるとこ結構あるよ
http://atpages.jp/
てかめんどくさいから好きなの使いなよ
http://atbb.jp/
http://atbbs.jp/
http://atchs.jp/
http://atpaint.jp/
http://rentalbbs.livedoor.com/
0379nobodyさん
2008/11/07(金) 00:27:13ID:???0380nobodyさん
2008/11/07(金) 00:35:54ID:???あとDBD::SQLiteよりDBD::SQLite::Amalgamation使ったほうがよくないか
それにしてもパッチあてないといけなかった気がするけど。
0382nobodyさん
2008/11/07(金) 11:15:39ID:???鯖変更の交渉も含め、金額に見合った仕事をするようにしないとなぁ、と思う。
0383nobodyさん
2008/11/07(金) 23:46:31ID:???0384nobodyさん
2008/11/08(土) 00:04:00ID:???Perlのverが5.6以下だったりするところけっこうあるんだよなぁ。
どちらにしても会社のサイトがロリポはないよね。名前的にw
0385nobodyさん
2008/11/08(土) 00:28:47ID:???まーPerl5ならなんとかなる。5未満は死んでくれ・・・
0386nobodyさん
2008/11/08(土) 00:48:56ID:???WindowsXP, ActivePerl 5.6.1
create table で失敗してるようなんだけど、どうやって調べればいいんだろう?
my $sql = <<'_SQL_';
CREATE TABLE test (
id integer primary key,
name
)
_SQL_
my $sth = $dbh->do($sql);
の実行後に
my $sql = sprintf "INSERT INTO %s (%s) VALUES(%s)", $table, keys %{$hashref}, (join ',', '?' x scalar(values %{$hashref}));
my $sth = $dbh->prepare($sql);
$sth->execute(values %{$hashref});
を実行すると、
DBD::SQLite::db prepare failed: no such column: name(1) at dbdimp.c line 268 at sqlite.pl line 41.
Can't call method "execute" on an undefined value at sqlite.pl line 42.
ってエラーがでる。
$hashref = {id => 1, name => "hoge"};
です。
0387nobodyさん
2008/11/08(土) 00:56:12ID:???0388386
2008/11/08(土) 01:05:43ID:???keys %{$hashref} と (join ',', '?' x scalar(values %{$hashref})) は間違い。
0389386
2008/11/08(土) 01:22:05ID:???my $sql = sprintf "INSERT INTO %s (%s) VALUES(%s)",
$table, join(',', keys %{$hashref}) ,join(',', ('?') x scalar(values %{$hashref}));
ところで、データベースはどこに作成されるのですか?
スクリプトのあるディレクトリに dbname というファイルが作成されますが、サイズは 0 バイトです。
0390387
2008/11/08(土) 01:28:36ID:???0391386
2008/11/08(土) 01:43:51ID:???keys で返ってくるキーの順番は保証されないけど、keys と values が同じ順番で返ってくるのことは保証されているのでは?
0392nobodyさん
2008/11/08(土) 01:56:38ID:???0394386
2008/11/08(土) 16:02:05ID:???↓のやり方で扱ってます。
my @column = qw(id name);
my %data;
@data{@column} = split /\t/;
my $id = $data{id};
0396nobodyさん
2008/11/09(日) 01:11:14ID:tiuPBzgUこれはどうやったらできるのでしょうか?
mailaddressとパスワードが20セットあり、それのアドレス帳をPGで自動取得したいんです。
同じ事を経験された方いらっしゃいますか?
0398386
2008/11/11(火) 11:21:11ID:???よろしくお願いします。
0399nobodyさん
2008/11/11(火) 12:05:41ID:???0400386
2008/11/11(火) 12:18:50ID:???PATHがどこか聞いているのだよ
0401nobodyさん
2008/11/11(火) 12:20:57ID:???書かなきゃカレントだろーが
0402nobodyさん
2008/11/11(火) 12:21:59ID:???0403nobodyさん
2008/11/11(火) 13:37:01ID:???0404386
2008/11/11(火) 14:04:05ID:???それぐらいも書けないなら解答すんなチンカス
0405nobodyさん
2008/11/11(火) 14:27:24ID:???ここで答えたら「チンチン言ってたら答えてもらえた」と思ってまたそうするだろう。
0407386
2008/11/11(火) 14:56:38ID:???0408486
2008/11/11(火) 20:48:30ID:???>> 399 レスありがとうございます。
DB接続時のファイル名指定を間違ってました。
my $dbh = DBI->connect("dbi:SQLite:dbname:$mydb","","");
下のように修正したら、スクリプトと同じディレクトリに指定した名称のファイルが作成されました。
my $dbh = DBI->connect("dbi:SQLite:dbname=$mydb","","");
作成されたファイルをバイナリエディタで見るとテーブルの情報やINSERTしたデータも入ってました。
お騒がせしました。
ただ、最初の方法でもデータをINSERTできるし、SELECTするとそれまで入力したデータ(約10件)を取り出せます。
>>389 で書いたように dbname という名称のファイルが作成されているのですが、あいかわらず 0 バイトです。
このファイルはスクリプトを実行してデータをINSERTするたびにタイムスタンプが更新されます。
これは、どうなっているのでしょうか?
0409V30
2008/11/11(火) 22:03:12ID:???0411nobodyさん
2008/11/12(水) 09:49:46ID:???リンクでもVirtualStoreでもないな。
0412r
2008/11/12(水) 12:10:00ID:DKrfzJ/y0413s
2008/11/12(水) 12:10:26ID:DKrfzJ/y0414k
2008/11/12(水) 12:10:49ID:DKrfzJ/y0415nobodyさん
2008/11/12(水) 12:41:44ID:???Winだと:はドライブ名の指定にしか使えないんじゃなかったっけ。
Eドライブにもファイルできてるかもな
0416nobodyさん
2008/11/12(水) 13:23:26ID:???0417nobodyさん
2008/11/12(水) 14:31:59ID:???0418nobodyさん
2008/11/12(水) 14:51:00ID:???0419Pentium
2008/11/12(水) 21:28:24ID:???ストリームって初めて知りました。
lfnutils というのを使って調べてみたら、確かにストリームにデータが記録されていました。
バイナリデータのため、文字化けしている部分がありますが >>408 と同様のデータでした。
http://www.monyo.com/technical/products/lfnutils/
すっごく、スッキリしました。
みなさん、ありがとうございました。
■ このスレッドは過去ログ倉庫に格納されています