くだすれPerl(超初心者用)

このエントリーをはてなブックマークに追加
952nobodyさん:2008/02/26(火) 22:28:43 ID:TAx5gJzC
ファイルのMIME-Typeってどうやって取得するの?

PHPではmime_content_type()という関数があるみたいなんだけど、
Perlではどうやるの?
953nobodyさん:2008/02/27(水) 00:36:15 ID:NLm3jzH+
掲示板で仮にログファイルを@LOGと置いて、それの最新の投稿を取り出すにはどうすれば良いの?
@LOG[0]でやったんですがどうも違ったみたいで
954nobodyさん:2008/02/27(水) 02:31:06 ID:???
>>952
use CGI;
my $q = new CGI;
$q->uploadInfo($filename)->{'Content-Type'};

>>953
@LOG[@LOG-1]
955954:2008/02/27(水) 02:37:08 ID:???
>>954
use CGI;
my $q = new CGI;
my $filename = $q->param('uploaded_file');
$q->uploadInfo($filename)->{'Content-Type'};

1行書き忘れた。
956952,953:2008/02/27(水) 03:43:32 ID:???
馬鹿は無理に回答しなくていいよ
957nobodyさん:2008/02/27(水) 07:27:20 ID:???
最新って・・・
一番最後の要素ってことなら
$LOG[$#LOG]
958nobodyさん:2008/02/27(水) 11:51:23 ID:???
$LOG[-1]でよくね?
959nobodyさん:2008/02/27(水) 18:16:19 ID:???
>>956
こういう質問するでも無く答えるでも無いゴミは何がしたいんだろうね?
960nobodyさん:2008/02/28(木) 04:40:38 ID:???
君みたいな馬鹿を釣って遊ぶ
961952:2008/02/28(木) 08:35:02 ID:5gTQ/iME
>>954-955
レスありがとう

それはロダとかでファイルをアップロードした時の判別方法だよね?
書き忘れたんだけど、LWP::Simpleで外部画像を取得した時に判別する方法を教えてほしいです。

お願いします。
962nobodyさん:2008/02/28(木) 11:37:27 ID:???
>>961
LWP::Simple はシンプル故に、レスポンスヘッダと
コンテントボディを同時には取得できない。
http://search.cpan.org/dist/libwww-perl/lib/LWP/Simple.pm

普通に LWP でリクエストを送って得たレスポンスからなら
同時に取得できる。
http://search.cpan.org/dist/libwww-perl/lwpcook.pod
http://search.cpan.org/dist/libwww-per/lib/HTTP/Headers.pm

PHP の Fileinfo() 相当のモジュールはこれ。
http://search.cpan.org/dist/File-MMagic-1.27/
963nobodyさん:2008/02/28(木) 17:15:11 ID:TKGGhpyN
formが
<FORM ACTION="test.cgi" METHOD="POST"><INPUT TYPE="TEXT" NAME="f" cols="10"><INPUT TYPE="TEXT" NAME="id" cols="10"><INPUT TYPE="SUBMIT" VALUE="GO">
でtest.cgiが
#!/usr/local/bin/perl
use strict;
use CGI;
require"jcode.pl";
my $cgi=CGI::new();
my $f=$cgi->param('f');
my $id=$cgi->param('id');
@test = ($f,$id);
$role = int(rand 6);
my $html=<<"EOM";
<HTML>
<HEAD>
<TITLE>test</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=Shift-JIS">
</HEAD>
<BODY>
$test[$role]
EOM
print<<"EOM";
Content-type:text/html
$html
EOM
exit;
1;
という様に、formで受けた$fと$idをランダムで表示させたいのですがerror500
となってしまいます。パーミッションは合ってると思います。なぜなのでしょうか?
964nobodyさん:2008/02/28(木) 17:16:30 ID:TKGGhpyN
すいません
$role = int(rand 2);
です
965nobodyさん:2008/02/28(木) 17:52:02 ID:???
>>963-964
print<<"EOM";
Content-type:text/html

$html
EOM
966nobodyさん:2008/02/28(木) 17:58:13 ID:TKGGhpyN
>>965
改行が多いと認識されたため、空行は省いて書き込みしました
ですので
print<<"EOM";
Content-type:text/html

$html
EOM
で書いてもerror500となります
967nobodyさん:2008/02/28(木) 18:11:34 ID:???
>>966
#!/usr/local/bin/perl
use CGI::Carp qw(fatalsToBrowser);
use strict;
968nobodyさん:2008/02/28(木) 18:13:24 ID:???
>>967 いい人だ
969nobodyさん:2008/02/28(木) 18:18:37 ID:???
「くだすれ」の由来を教えてください
970nobodyさん:2008/02/28(木) 18:21:36 ID:???
CGI::newってつい最近知り合いも書いてたんだけど
どっかのサイトか本でそんな紹介されてるのかな?

CGI.pmは問題ないんだけど、new CGI;かCGI->new;て書く癖つけとかないと
他のモジュールでクラスが渡らなくて泣きそうでない?
971nobodyさん:2008/02/28(木) 18:31:10 ID:???
うむ。
972nobodyさん:2008/02/28(木) 18:56:16 ID:TKGGhpyN
>>967でやって、KENTの文法チェッカー使ったら
[Thu Feb 28 18:54:48 2008] new.cgi: Global symbol "$cgi" requires explicit package name at new.cgi line 6.
[Thu Feb 28 18:54:48 2008] new.cgi: Global symbol "$cgi" requires explicit package name at new.cgi line 7.
[Thu Feb 28 18:54:48 2008] new.cgi: Global symbol "@test" requires explicit package name at new.cgi line 8.
[Thu Feb 28 18:54:48 2008] new.cgi: Global symbol "$role" requires explicit package name at new.cgi line 9.
[Thu Feb 28 18:54:48 2008] new.cgi: Global symbol "@test" requires explicit package name at new.cgi line 10.
[Thu Feb 28 18:54:48 2008] new.cgi: Global symbol "$role" requires explicit package name at new.cgi line 10.
[Thu Feb 28 18:54:48 2008] new.cgi: new.cgi had compilation errors.
Content-type: text/html

Software error:
Global symbol "$cgi" requires explicit package name at new.cgi line 6.
Global symbol "$cgi" requires explicit package name at new.cgi line 7.
Global symbol "@test" requires explicit package name at new.cgi line 8.
Global symbol "$role" requires explicit package name at new.cgi line 9.
Global symbol "@test" requires explicit package name at new.cgi line 10.
Global symbol "$role" requires explicit package name at new.cgi line 10.
new.cgi had compilation errors.
こんなのになってしまいました
973nobodyさん:2008/02/28(木) 21:44:31 ID:???
974nobodyさん:2008/02/28(木) 22:18:10 ID:???
975nobodyさん:2008/02/29(金) 00:44:42 ID:tgKz69bW
>>967さんのご指摘通り下記のようにやったのにうまくできません
#!/usr/local/bin/perl
use CGI::Carp qw(fatalsToBrowser);
use strict;

my $f=$cgi->param('f');
my $id=$cgi->param('id');
@test = ($f,$id);
$role = int(rand 6);
my $html=<<"EOM";
<HTML>
<HEAD>
<TITLE>test</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=Shift-JIS">
</HEAD>
<BODY>
$test[$role]
EOM
print<<"EOM";
Content-type:text/html
$html
EOM
exit;
1;
なぜでしょうか?ググりようもどのようにしたらいいかわかりません
976nobodyさん:2008/02/29(金) 01:10:23 ID:???
977nobodyさん:2008/02/29(金) 01:24:08 ID:QE3b1PuS
>>976
質問すれなんだから結論くらい言ってやれよ
978nobodyさん:2008/02/29(金) 02:27:29 ID:???
>>975
#!/usr/local/bin/perl
use strict;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
my $cgi = new CGI;
my @test = ($cgi->param('f'),$cgi->param('id'));
my $role = int(rand(1)*2);
print $cgi->header,$cgi->start_html(-title=>"test"),$cgi->p($test[$role]),$cgi->end_html;
979nobodyさん:2008/02/29(金) 05:09:59 ID:???
>>975
>>967をしっかり見直せ2/3に近い回答がある。
980nobodyさん:2008/02/29(金) 17:26:45 ID:tgKz69bW
>>978
文字化けします・・・
981nobodyさん:2008/03/01(土) 00:12:05 ID:???
パッと見、適当ですまんが

$test[$role] の下にBODY閉じタグやHTML閉じタグが無いけどなんか理由はあるの?

あとEOM2回使ってるけどおかしくならない?
print <<"EOF";
Content-type: text/html;CHARSET=Shift_JIS;

$html
EOF
とか
982978:2008/03/01(土) 07:06:34 ID:???
>>980
「my $cgi = new CGI」の下に以下を挿入。
$cgi->charset('Shift-JIS');
983nobodyさん:2008/03/01(土) 13:10:20 ID:P2PC8CXR
use DBI;
DBI -> connect( 'DBI:mysql:database=hogedb;host=localhost', 'user', 'pass' );

ってやるとコマンドライン上では何も言わずにスンナリ通るのに、
Apache経由でブラウザからアクセスすると下記のようなエラーが出ます。

[error] Uncaught exception from user code:, referer: http://localhost:8008/
[error] \tinstall_driver(mysql) failed: Can't load 'C:/usr/local/site/lib/auto/DBD/mysql/mysql.dll' for module DBD::mysql:
load_file:\x8ew\x92\xe8\x82\xb3\x82\xea\x82\xbd\x83\x82\x83W\x83\x85\x81[\x83\x8b\x82\xaa\x8c\xa9\x82\xc2\x82\xa9\
x82\xe8\x82\xdc\x82\xb9\x82\xf1\x81B at C:/usr/local/lib/DynaLoader.pm line 201., referer: http://localhost:8008/
[error] at (eval 20) line 3, referer: http://localhost:8008/
[error] Compilation failed in require at (eval 20) line 3., referer: http://localhost:8008/
[error] Perhaps a required shared library or dll isn't installed where expected, referer: http://localhost:8008/
[error] at lib/Hoge.pm line 116, referer: http://localhost:8008/
[error] at C:/usr/local/site/lib/DBI.pm line 772, referer: http://localhost:8008/
[error] \tDBI::install_driver('DBI', 'mysql') called at C:/usr/local/site/lib/DBI.pm line 618, referer: http://localhost:8008/
[error] \tDBI::connect('DBI', 'DBI:mysql:database=hogedb;host=localhost', 'user', 'pass')
called at lib/Hoge.pm line 116, referer: http://localhost:8008/

この場合、どうすれば正常に動くのでしょうか?
984983:2008/03/01(土) 14:46:55 ID:???
>>983 自己レス。
解決しました。

'C:/usr/local/site/lib/auto/DBD/mysql/mysql.dll'が無いと怒っているようですが
実際にはその場所にdllが存在するので、このDLLを"MySQL本体のフォルダ/lib/opt/"に
コピペしたところ無事動作しました。
全うな解決方法なのか謎ですが…お騒がせいたしました。
985nobodyさん:2008/03/01(土) 14:49:37 ID:lvarZcaZ
二重投稿を禁止したい(textを)のですが
if{FORM('text') eq @LOG[-1]}(&error('二重投稿です');)

@LOG[-1]で最後の要素を取り出してフォームの内容とかぶってたらエラーにしようとしたのですが
うまくいきません。なぜでしょうか?考えられる理由とか教えてください
986nobodyさん:2008/03/01(土) 14:53:09 ID:nNUS9Qi3
if ($FORM{'text'} eq $LOG[-1]) {
 &error('二重投稿です');
)
987nobodyさん:2008/03/01(土) 14:56:55 ID:nNUS9Qi3
途中で送信してもうた…

if ($FORM{'text'} eq $LOG[-1]) {
 &error('二重投稿です');
}
この&errorを例えば
 &error('二重投稿です:' . $FORM{'text'} . ':' . $LOG[-1]);
として内容を確かめてみれば
988nobodyさん:2008/03/01(土) 14:57:55 ID:lvarZcaZ
>>986
できないです。。
989nobodyさん:2008/03/01(土) 15:02:11 ID:lvarZcaZ
>>987
if ($FORM{'text'} eq $LOG[-1]) {
 &error('二重投稿です');
}
この時点で二重投稿にならないので、確かめようがないのですが・・
990nobodyさん:2008/03/01(土) 15:05:10 ID:nNUS9Qi3
ああごめんeq じゃなくてneで
991nobodyさん:2008/03/01(土) 15:07:19 ID:???
>>989
if文無しでエラーに飛ばせばいい。
992nobodyさん:2008/03/01(土) 15:17:00 ID:lvarZcaZ
DATA[-1]をしたら一番古い?投稿文が表示されてしまいましたw
>>942さんのを加えたスクリプトなんですが・・・
993nobodyさん:2008/03/01(土) 21:47:33 ID:???
今更だけど、$LOG[n]の末尾の改行取り忘れたりしてないよね?
994nobodyさん:2008/03/02(日) 02:26:33 ID:???
>>992
お前何か勘違いしてないか?知識なんて使って減るもんじゃないから只だと思ってんだろ?
人に物を訊くってのがどういう事だか、自覚してる?
知識ってのはな、社会人に取って金と同じく貴重な財産なんだよ。使っても減らないけど、教えたら広まった分だけ価値が下がる。それを分けてくれって言ってんの自分でわかってる?
社会で必要とされる知識ってのはな、本になんか載ってない事ばかりなんだよ。全部人から人へ、直接のコミュニケーションを介して伝わって来たモンなんだ。
そういうノウハウを分けてもらう申し訳無さみたいな物が、伝わって来ないんだよ。お前の態度からは。
猿だって仲間から餌を分けてもらう時は申し訳無さそうな顔するんだよ。ヘラヘラ笑いながら近づいてったら殴り殺されんぞ。
猿だったら今頃とっくに死んでんだよお前。そんな態度で今まで。研修で散々言われたよな。謝る時は申し訳無さそうな顔をしろって。
そういう学校じゃ受けられない教育を受けておきながら、社会人を経験しなきゃ得られない知識を貰っておきながら、
何にも生かせてないんだよ今のお前は。学生のサークルごっこじゃないんだから。もっと四六時中危機感を持って生きてなきゃ駄目だよ。いい加減いつまで学生気分じゃ。
995nobodyさん:2008/03/02(日) 03:52:46 ID:???
>>992
ためしに$LOG[1]を表示してみ。
996nobodyさん:2008/03/02(日) 07:56:37 ID:UDBaDi65
>>994
>知識ってのはな、社会人に取って金と同じく貴重な財産なんだよ。
それを超初心者に教えてくれるのがこのスレッドの意義ですよね?
>社会で必要とされる知識ってのはな、本になんか載ってない事ばかりなんだよ。全部人から人へ、直接のコミュニケーションを介して伝わって来たモンなんだ。
掲示板というコミュニケーションを介して聞いてますし、この内容は僕の持ってる2つのPerlに関する書籍にはありませんでした。
>猿だったら今頃とっくに死んでんだよお前。
猿じゃないです。人間です。人間と猿のDNAはたかが2%の違いといわれてますが、それは大きな差です。猿=人間という発想はおかしいかと。
>いい加減いつまで学生気分じゃ。
当て水量でモノを言わないでください。あなたの投稿からは僕があたかも社会人であるかのように見えますけど、僕まだ中学3年生です。
まあ態度という点では気をつけなきゃならないのかなとは思いましたが、あなたには>>1に書かれているような優しさや、このスレッドの意義を良く理解してもらいたいものです。

>>995
ありがとうございます!できました!
ただDATA[1]だけでは、すべてのフォームの内容が取り出されて、うまく$FORM{'comment'}の部分だけを抽出できません。。

997942=995 :2008/03/02(日) 16:20:53 ID:???
>>996
なあ、ガキならガキらしく、オッサンには敬意を払えよ。
あと、試行錯誤の形跡が見れないと誰も相手してくれないぞ。
悩めるだけ悩め。そしてどう悩んだか見せろ。話はそれからだ。

ヒントは、元ソースの94行目 for から99行目 }まで。
ここで、$dateには日付、$textには内容が入ってるって事。
そっから先は自分で少し考えてみろ。

分からなくなったら、自分でどう考えてどこが分からないかを書けよ。
自分じゃ何も試さないようじゃ、漏れも付き合いきれない。

いい加減甘やかしすぎだと思えてきた。
998nobodyさん:2008/03/02(日) 16:39:55 ID:???
>>997
お前、甘すぎ。バカガキは放置が基本。
999nobodyさん:2008/03/02(日) 17:44:58 ID:eMvpxgfI
>>999
お前糞すぎワロタwww
>>998
神様すぎワロタwww
1000nobodyさん:2008/03/02(日) 17:48:04 ID:???
人類に平和が訪れますように
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。