トップページ⇒php
1001コメント313KB

【Perl】初心者コーナー Part19

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/02/09 00:24ID:s0tpWWxg
初めに→「perl」その物のスレです。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。


CGIだけど、なんか質問ある? Part 9
http://pc.2ch.net/test/read.cgi/php/1041530204/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/

あとは>>2-10。
023723303/02/17 21:24ID:???
>>236
あ、ありがとうございました!
教えて頂いたところは見つけていたのですが、
回答にあるdecode.plを探さずに「だめか…」とへこんでいました。
探してみたらありましたので、もうちょっと調査してみます。
023823603/02/17 21:36ID:???
>>237
じゃーフォーマットは判っていたのだから、
自前でデコードしても良かったのではないかと...
応用力なさすぎでつ。
0239nobodyさん03/02/17 21:44ID:???
ここは初心者スレです。
応用力無くても別にかまわないかと。
0240nobodyさん03/02/17 21:51ID:4gk/zjjH
最新版のActivePerlで DB_File を入れようと PPM で install しようとすると見つかりません。
どうも最新版のモジュールリポジトリに DB_File がないようなのですが、何か理由でもあるのでしょうか。
古い方のActivePerlのリポジトリにはあるようです。
024123603/02/17 21:53ID:???
応用力という言葉のみに反応すんなって。
0242nobodyさん03/02/17 22:33ID:1e74kzGJ
お勧めのエディタとかありますか?
0243nobodyさん03/02/17 22:43ID:???
PerlEditor
0244nobodyさん03/02/17 22:46ID:???
>>243
即レスサンクス!と思ったんだけどそれ以外で何かあります?(^^;

PerlEditorよりも使いやすいやつないかなって…
0245nobodyさん03/02/17 22:47ID:???
Perl書くのにどんなエディタ使ってる?
http://pc2.2ch.net/test/read.cgi/php/1014357485/l50
0246nobodyさん03/02/17 22:53ID:???
>>245
激しくすれ違いでしたね…
スマソ

逝てくる…
0247nobodyさん03/02/17 23:17ID:???
>>246
道中険しいのでお気をつけて。
0248nobodyさん03/02/17 23:37ID:EIQogyxL
CGIに対して、mp3を素で返すプログラムを作ってみたんですが
mp3ファイルをopenしてprintしたら
バイナリがそのまんま文字化けしてブラウザに表示されてしまいました。
一応"Content-Type: audio/mpeg"は送っているのですが
やはり拡張子がmp3でないファイルは音声として扱ってもらえないのでしょうか?

やりたいのは、cgi要求に対してmp3のバイナリを返して
それをブラウザがmp3プレイヤーに渡して音楽を鳴らす。
というのを考えているのですが・・・・
0249nobodyさん03/02/18 00:03ID:EDQzMDCw
ずれてたらすみません。
APACHEのホームディレクトリにてCGIスクリプト置いたのですが、
属性を、711にしています

たとえばWWWダウンローダソフトで根こそぎもってかれると、このCGIも
もってかれるのでしょうか?
(CGIの中身はDBIにてPASSを入れちゃっていて思いました)

0250nobodyさん03/02/18 00:05ID:???
>>249
基礎からやり直せ。
025124903/02/18 00:14ID:EDQzMDCw
>>250
基礎的なものが無知ですいませんでした。。
(;´Д`)もうちょっと勉強して自分で調べてみまつ
0252nobodyさん03/02/18 00:51ID:???
>>248
audio/mp3
ってのはどぉよ?
しれでもダメなら、ちゃんとMP3ファイルを吐き出しているサイトへtelnetで接続してみて、
レスポンスのエンティティヘッダ「Content-type:」を調べてみる。
それでもダメなら、ブラウザが対応していないだけ。ファイルヘルパーの対応を設定してみる。
0253nobodyさん03/02/18 02:31ID:GFaap2mW
>>252
んー、某所でtelnetで試してみたら
apacheがaudio/mpegって吐いたんで
(もちろんCGIじゃなくてMP3直指定ですが)
それを真似してみたんですけどね。
ブラウザはIE6SP1です。
audio/mp3はまた試してみます。
0254nobodyさん03/02/18 03:18ID:???
>>253
IEは基本的に拡張子しか見てない。
0255nobodyさん03/02/18 05:04ID:Dcv1K+PR
ちょっと皆様にお聞きしたい事があります。

if ($count =~ /\n$/) { chop($count); }
$count++;

上のカウントアップ処理は1カウントずつアップしますよね?
これを2カウントずつアップするようにしたいのですがどう書き換えれば
いいでしょうか?
0256nobodyさん03/02/18 05:24ID:???
>>255
$count++;
  ↓
$count += 2;
0257nobodyさん03/02/18 07:09ID:MmRlkG1z
それ、漏れもマジにビビッタよ。
本当に凄い奴だと思った。
http://homepage3.nifty.com/digikei/ten.html
0258nobodyさん03/02/18 07:22ID:Dcv1K+PR
>>256
天才!!!
0259nobodyさん03/02/18 07:26ID:???
>>258
ハァ?
0260nobodyさん03/02/18 07:34ID:???
>>258
プッ
0261マリモーマ ◆r6PDGT6Xd2 03/02/18 08:06ID:2FacSekM
>257
エロサイト
0262nobodyさん03/02/18 08:36ID:???
chomp($count);
++$count;
++$count;
0263nobodyさん03/02/18 15:05ID:???
ちなみに数字として評価してるから chomp も chop もいらん
0264nobodyさん03/02/19 00:14ID:???
グーグルで「(my|ローカル) 速度 Perl」と調べてもわからなかったので質問します。

変数名が重複しない場合でも、サブルーチン内ではmy宣言したほうが
スクリプトの実行速度は速くなるのでしょうか?

換言すると、(1)サブルーチンにグローバル変数を渡し、受け取った変数はmy宣言し、
処理したのちにreturnで返すのと、
(2)サブルーチン内でもグローバル変数のまま扱って処理するのとでは、
どちらが速いのか、ということです。
0265nobodyさん03/02/19 00:15ID:P468uHQ8
sageてしまいました。
0266nobodyさん03/02/19 00:28ID:5breTLee
初心者の非常にDQNな質問ですが、
下記程度のコードがInternal Server Errorになって動きません。
ローカルの環境設定の問題かと思って、パスを変えてサーバーにあげて動かそうとしましたがやはりエラーになります。
何故でしょうか?

#!c:/perl/bin/perl

require 'cgi-lib.pl';
&ReadParse(*input_data);

print "Content-type: text/html\n\n";
print "<html>\n";
print "<body>\n";
print "value1 = $input_data{'value1'}<br>\n";
print "value2 = $input_data{'value2'}<br>\n";
print "</body>\n";
print "</html>\n";
exit;
0267nobodyさん03/02/19 00:42ID:???
>>264
変数自体にかかるコストは、シンボルテーブルに入らない分、myの方が速い。
でも、コピーにはコストがかかる。だから、遅くなる、だと思う。

遅くなる以上にメリットがあると思うんだけど・・・
それに、巨大なものを扱うなら、上手にリファレンスを使ったら、
コピーしなくてもよくなって、速くなるかも。。
0268nobodyさん03/02/19 00:48ID:???
>>266
まず、ローカルでテストされてはどうですか?
0269nobodyさん03/02/19 00:51ID:???
>>268
文盲かい?
0270nobodyさん03/02/19 00:55ID:???
>>269
みたいだな。

あの素人の処理は君に任せるよ。頼んだよ。
0271nobodyさん03/02/19 00:56ID:???
>>269
>>268は、STDERRに答えが出てるから、それをローカルで見ればいい。と言った。
0272nobodyさん03/02/19 00:58ID:???
>>266
パスが通ったところにcgi-lib.plがあるのか?
0273nobodyさん03/02/19 01:01ID:???
>>272
エラーメッセージもソースも聞かずに原因を追及するのはあまりに無謀だと思うぞ。
0274nobodyさん03/02/19 01:03ID:???
>>273
それができるならあんな質問はしないと思う(^_^;)
0275nobodyさん03/02/19 01:03ID:???
>>274
>>272は自問自答ってことか?お前は文盲なのか?
0276nobodyさん03/02/19 01:06ID:???
>>275
ハァ?
ありそうな間違いをあげただけ。
自分で間違いを発見できるのならこんなところで質問しないでしょ。
0277nobodyさん03/02/19 01:08ID:???
なに白熱してんのー?
0278nobodyさん03/02/19 01:16ID:???
>>266へのレスがなぜ自問自答になるのかさっぱりわからん
0279nobodyさん03/02/19 01:18ID:???
オマイラおちけつ。

>>266
273に同意。で、エラーメッセージを書けぃ
0280 03/02/19 01:18ID:???
>>266
PERLがローカルに入っているなら、
それ使った時に出たもっと具体的な
エラーメッセージは?
0281nobodyさん03/02/19 01:26ID:???
次の質問は「エラーメッセージってどうやって見るんですかぁ?」。
0282nobodyさん03/02/19 01:58ID:???
>>264
use Benchmark qw(cmpthese);
$b = '';
cmpthese(-5, {A=>sub{&a(1); sub a{my $a = shift;}}, B=>sub{&b(1); sub b{local $b = shift;}}});
--
ここまでこだわる前にアルゴリズムを見直す方がいいに一票。
0283nobodyさん03/02/19 02:00ID:???
>>282はバージョン5.6以降のコマンドラインで動かしてください。
028426403/02/19 02:47ID:???
>>267さん>>282さん
レスありがとうございます。

>>282を実行したところ、Aのほうが早かったです。
>ここまでこだわる前にアルゴリズムを見直す方がいいに一票。
単なる素朴な疑問だったもので、おっしゃるとおりです。
効率的なアルゴリズムのなんたるかを勉強してきます。
0285nobodyさん03/02/19 03:20ID:IJ5Nv9d6
とりあいずCGIファイル(カウンタ)を作ってみたんですが、
「ファイルを開くアプリケーションを選んでください」
になってしまいます、どのアプリケーションで開けば良いのでしょうか?
0286nobodyさん03/02/19 03:39ID:???
>>285
編集したいならメモ帳あたりで。
テキストが読み書きできればなんでもいいです。
0287nobodyさん03/02/19 03:44ID:IJ5Nv9d6
>>256
編集するんじゃなくて、カウンタとして表示させたいのですが。
0288 03/02/19 04:02ID:???
>>287
cgi設置法の基礎なんて、PERL以前の話。
スレ違いだよ。
0289nobodyさん03/02/19 04:04ID:???
>>287
http://tohoho.wakusei.ne.jp/wwwcgi6.htm
http://homepage1.nifty.com/glass/tom_neko/web/web_cgi_osx.html

(・∀・)カエレ!!!!
0290nobodyさん03/02/19 05:59ID:???
>>285
おまいにひとつ聞きたい
なんでこのスレで聞いた?
CGIスレが他にあるのになんでこのスレで聞いた?
0291マリモーマ ◆r6PDGT6Xd2 03/02/19 06:49ID:tT+FI6u3
>266
これだと思うだけど
#!c:/perl/bin/perl →#!/usr/bin/perl
0292nobodyさん03/02/19 06:55ID:V0z+N0Sl
あゆのパンチラ動画です
http://homepage3.nifty.com/digikei/ten.html
0293nobodyさん03/02/19 15:12ID:CC31r6wC
PHPとPerlだとどっちが偉いんですか?
0294 ◆s/jp/vus/g 03/02/19 15:31ID:???
Assembla>>FORTRAN=LISP>>COBOL>BASIC>(超えられない時代の壁)>>>Perl>>PHP
0295nobodyさん03/02/19 16:14ID:???
高級か低級かの話かね?
0296nobodyさん03/02/19 17:11ID:???
>>295
>Assembla

せっかくボケてんだから突っ込んでやれよ・・・。
0297 ◆s/jp/vus/g 03/02/19 18:31ID:???
(´-`).。oO(sageにassemblerって書けばよかった。)
0298nobodyさん03/02/19 18:47ID:???
$ENV{'TZ'} = "JST-9";
$times = time;
($sec,$min,$hour,$mday,$mon) = localtime($times);
$mon++;
if ($hour < 10) { $hour = "0$hour";}
if ($min < 10) { $min = "0$min"; }
if ($sec < 10) { $sec = "0$sec"; }

英国の鯖に置いているのですが、時差を日本標準時間に修正するには
どのように設定すれば良いでしょうか。
0299nobodyさん03/02/19 19:32ID:???
>>298
$time に 9*60*60 を足すなり引くなりすれば?
030029803/02/19 19:47ID:???
>>299
有難う御座います。
試してみます。
0301 ◆nBdXIOeCFk 03/02/19 22:02ID:qxP6cynE
すいませんたす例ってきます
0302nobodyさん03/02/19 22:05ID:???
TZを直すだけでいいのでは?

もしかしたらそのコードは、悪評高きCGIレ○キューのもののような気が..
配布する方も無責任だよな。少し勉強すればわかるはずなんだから。

0を前に付ける正しい方法は、sprintfで整形する。だ。
0303nobodyさん03/02/19 22:29ID:???
>正しい
0304nobodyさん03/02/19 23:25ID:a2cu6yGF
データの入力フォームからのデータは
 例えば、
read.cgi?key=96477&st=40&keywd=%A5%C6%A5%B9%A5%C8
と言うふうになり、変換する途中、
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg
 を使いますが、
この
~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/egと
全く逆の動作をする式…文字から16進へ変換する式 
を教えて下さい。

 お願いします。m(_ _)m
0305nobodyさん03/02/19 23:26ID:???
>>298のような書き方意外によくみかけるな。
かくいう漏れも昔は>>298のように書いてたし。

そんなわけで
($sec,$min,$hour,$mday,$mon) = gmtime(time+9*60*60);
でどうよ?
0306nobodyさん03/02/19 23:26ID:???
>>304
unpack
0307nobodyさん03/02/19 23:36ID:???
>>304
>>4 のperlメモに書いてある。
0308nobodyさん03/02/19 23:37ID:???
>305
いや、タイムゾーンを直そうよ。。。
030926603/02/19 23:48ID:r5CAiNQE
お返事遅れて申し訳ないです。
>>273,279,280.281
エラーメッセージというのはデバッグで確認できるものとは違うのでしょうか?
ちなみに自分の思っているデバッグとはdosプロンプトでperl -cwでやる文法チェックのことです。
それではエラーもアラートも出ません。
フォームから起動するとプレーンテキストのままcgiファイルが表示されるだけです。
ローカルでもサーバーでも起動しないということはやはりどこか文法がおかしいのでしょうか?
ちなみにパスはローカルとサーバーとで当然変えてテストしています。
0310nobodyさん03/02/19 23:55ID:???
>>308
最初のソース見る限り、一応タイムゾーンはいじってあるみたいなんだけども。
それで変わらないんだから、変わらない理由は他にありそう。

だったら、次善の策でもいいんじゃないか?

本当にタイムゾーンが変わらないんだったら、鯖缶の怠慢かも知れんけど。
0311nobodyさん03/02/19 23:58ID:???
>>266
>>272の質問にこたえろヴォケ!
理解できない or 都合の悪い質問を無視するのは厨房のやることだ。
……あれ? 厨房だったか?
0312 ◆s/jp/vus/g 03/02/20 00:03ID:???
>>309
使ってるのはActiveperlだと思うけど、
完璧なチェックでは無いので過信しないように。
それより、291がいいこと言ってるぞ。
先頭行が違う=>cgiと認識していないのでそのまま吐く。
0313nobodyさん03/02/20 00:14ID:???
$ENV{'TZ'} = "GMT-9";
$ENV{'TZ'} = "Japan";

とかでもやってみるとか。
0314nobodyさん03/02/20 00:16ID:???
>>311
お前も>>273の忠告をことごとく無視してるが。
031526603/02/20 00:21ID:Hhj+m+Kj
>>311
あるよ
0316nobodyさん03/02/20 00:24ID:???
>>309

perl -cでチェックできるのは、コンパイルエラーのみだから、
実行したときに発生するエラー(require失敗、関数が見つからない)は、
存在するかしないかは分からない。
0317nobodyさん03/02/20 00:25ID:???
「は」、と、「が」、を間違えました。
031826603/02/20 00:32ID:Hhj+m+Kj
>>291,312
どうもありがとうございます。
もう一度先頭行を確認してみます。
0319nobodyさん03/02/20 01:06ID:???
>>266
http://www.harukaze.net/~mishima/perl/cgi-debug-env/deb-tech.html
0320マリモーマ ◆r6PDGT6Xd2 03/02/20 08:45ID:ZbzyrSlf
ローカルテストで 無限ループになったら
windowsタスクマネージャーで perl.exeを 終了させると
いいらしい
0321nobodyさん03/02/20 09:04ID:hpPhmqwv
>>320
初心者らしい意見を有り難う。
032230403/02/20 09:05ID:Am46dVIU
ありがとうございました。
URLエンコードというのですか。
勉強になりました
0323nobodyさん03/02/20 09:25ID:???
>>309
Syntax checkがOKならperl filenameでコマンドラインから実行しろ。
0324nobodyさん03/02/20 09:50ID:???
perl filename > test.html

って具合のが見易くて良いかもね。
0325nobodyさん03/02/20 09:57ID:???
すいません、正規表現なのですが
一行内に特定文字列(>>\d+)がいくつあるか
数える方法というのはありますでしょうか?

現在、代案として下記のように>>\dで
splitし配列を数えているのですが
いかんせん正攻法じゃないので...


local @tmp = split(/>>\d+/,$_);
print $#tmp;
0326nobodyさん03/02/20 10:15ID:???
>325
適当な配列にコピーしてs//gして帰ってくる数値を見ればいいんでない?
もしくはwhile(/>>\d+/g)ってやってカウンタを増やすとか…
0327nobodyさん03/02/20 10:29ID:???
>>325
print (@tmp =~ s/(>>\d+)/$1/gs);
0328nobodyさん03/02/20 10:51ID:???
>>327
> 一行内に特定文字列(>>\d+)がいくつあるか
これを読んでいなかったスマソ

my $count = 0;
foreach(split(/\n/,$_)){
print sprintf(qq{">>\\d+"の数:%0d 行目 %0d 個},++$count,(s/(>>\d+)/$1/g));
}
0329nobodyさん03/02/20 10:58ID:???
>>326>>327
置換処理をすると処理した数が返ってくるのですね
勉強になりました
これで万事解決です
ありがとうございました!
0330nobodyさん03/02/20 20:18ID:ve8bV8Zf

「このまま一生彼女ができないのでは…」

 私は社会学を専攻している者です。社会学や周辺の学問を利用し、実践的な
恋愛理論を開発しております。机上の空論に終わらず、あくまで実践的。効果
は絶大です。この理論は私自身の苦悩から生まれました。モテないことに深く
悩んでいた私は社会学部に入り、恋愛をはじめとするコミュニケーションにつ
いて考察することを決意。開発期間およそ6年。やっと研究が実を結びました。
ルックスなんて恋愛に関係ないということを自ら証明したのです。今回はその
集大成を公開しようと、メールマガジン発行を決めました。すでに数回発行し
ておりますが、購読者にはバックナンバーが閲覧できますのでご安心を!

 今ならまだ間に合います。春、出会いの季節に幸せが訪れるかどうかは、あな
たの選択次第です。絶対に後悔はさせません。「90日彼女ゲットプログラム」
もちろん購読は無料! → → http://www.h5.dion.ne.jp/~psysys/index.html
0331nobodyさん03/02/21 01:07ID:f3aIdgTv
質問です。
RaQ3で正常に動いていた画像掲示板が、RaQ550にサーバーを変えてから
エラーが出て動かなくなってしまいました。

エラーログを見ると
「Premature end of script hedders : /usr/cgiwrap/cgiwrap」
となっています。
これはどういう意味のエラーなのでしょうか?いろいろ調べたのですが
わからずほとほと困っています。

perlのバージョンが上がったのが原因なのかとも思いましたが、
なにぶん初心者なのでよくわかりません。
もしよろしければ教えていただければありがたいのですが。
よろしくお願いします!
0332nobodyさん03/02/21 01:40ID:???
>>331
・1行目の Shebang が違う。
・require の該当するファイルがパスの通ったところにない。
・適切な Content-type: エンティティを吐き出していない。
・外部ファイルへのアクセス時に、該当ファイルのパーミッションが不適切であった。
・長いので省略。全部見るには >>1
0333nobodyさん03/02/21 01:50ID:???
>>331
umaskかも。
0334nobodyさん03/02/21 02:12ID:???
だからCGIの質問はCGIのスレでしろと(略
0335nobodyさん03/02/21 02:46ID:p5R52YmN
質問させてください。
Perlモジュールを作ってるのですが、
拡張子.pmだと、ブラウザでアクセスされると中が見えてしまいます。
で、拡張子.cgiでモジュール使おうと思ったのですが、
それだと、useで呼び出せません。
拡張子.pm以外は、useで呼び出せないのでしょうか?
また、.pmファイルの中が見えないようにするにはどうすればいいでしょうか?
0336nobodyさん03/02/21 03:13ID:???
>>335
perldoc -f useを参照。.cgiでも使えるかも。
通常は鯖側で見えないように設定かと。

.htaccessの偉い人 Part3
http://pc2.2ch.net/test/read.cgi/php/1019888234/l50
■ このスレッドは過去ログ倉庫に格納されています