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

Perlコーディング初心者質問スレ Part 43

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/08/12(金) 01:26:47ID:mHnZWvqz
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0488nobodyさん2005/09/18(日) 17:12:59ID:???
>>485
DBD::MySQL とかは入ってる?
04894802005/09/18(日) 17:18:21ID:???
>>487
有り難うございますー 勉強してきます。

その他の回答してくださった皆さんも有り難うございました。
04904852005/09/18(日) 17:29:40ID:???
>>488
libの中に DBD/mysql.pm があります
0491nobodyさん2005/09/18(日) 17:30:34ID:???
>>490
それって、単体では動かないのだけど、バイナリとかは入ってる?
04924852005/09/18(日) 17:39:42ID:???
CPANから落としてきたものを解凍して丸々放り込んでます。
0493nobodyさん2005/09/18(日) 17:42:06ID:???
>>492
なんで、それだけで動くと思う?

http://perldoc.jp/docs/modules/DBD-mysql-2.1026/DBD/mysql/INSTALL.pod
04944852005/09/18(日) 17:57:30ID:???
ppmがエラー出すので、代替方法のつもりで手動インストールをやって行き詰まってました。

Perlモジュールスレがあったみたいなので、そちらで勉強してきます。
0495nobodyさん2005/09/19(月) 19:07:11ID:beipsuRn
require で宣言した変数値が、取れたり取れなかったりで困っております。
共通の設定定義ファイルを読み込み、それがシステムで使いまわされる感じを
考えています。

*パス構成*

cgi-bin/
| settings.pl   … (x)変数に設定を代入している、定義ファイル
-log
| |counter.cgi  … (a)アクセスカウンター ( settings.pl で設定した変数が生きている )
|
-bbs
 .|index.cgi    … (b)掲示板トップ ( settings.pl で設定した変数が消えている )

(a)にて、require '../settings.pl' を行うと、(x)で宣言した変数は生きているのですが
(b)にて、require '../settings.pl' を行っても、(x)の宣言が反映されません。

どなたか、お知恵をお貸しいただければ幸いです。
0496nobodyさん2005/09/19(月) 21:04:41ID:???
>>495
それだけだと
どこかで変数が干渉してんじゃない?
って事しか・・・
0497nobodyさん2005/09/19(月) 21:36:55ID:???
>>495

問題が発生する最も短いソースを作ってみることが大切だね。
そうすると、質問しなくても自分で解る場合も多い。

一番ありそうなのは、変数のスコープが違っているということだろうけど。
0498nobodyさん2005/09/19(月) 21:45:40ID:uGVzhqRv
TXTファイルを、何行目か指定して読み込む方法がありましたら、教えてください。
0499nobodyさん2005/09/19(月) 21:49:45ID:???
>>498
全然試してないけど
my $file = 'hoge.txt';
my $line = 12;

open(FH, $file) || die "$file : $!\n";
while (<FH>) {
next if ($. < $line || $line < $.); # skip
print $_; # 目的の行
}
close(FH);
05004952005/09/19(月) 21:55:20ID:???
>>496-497
レスありがとうございます。
二重require(use) して、干渉しているようです。??(?Д?)

cgi-bin/
| settings.pl   … (x)変数に設定を代入している、定義ファイル
-log
| |counter.cgi  … (a)アクセスカウンター
|
-bbs
 .|index.cgi    … (b)掲示板トップ
 .|BBSthread.pm … (c)スレッド制御モジュール


(b)の index.cgi では、 use BBSthread.pm を宣言していて、
さらに (c) の BBSthread.pm で require '../settings.pl' 宣言していました。

試験的に use BBSthread をコメント化したところ、
settings.pl で設定した値が取得できました。

counter.cgi ではこのような二重require を行っていません。
これが原因っぽいです。
今回は、二重require されないようコーディングすることによって回避します。

ありがとうございました。
0501nobodyさん2005/09/19(月) 22:03:07ID:???
あーあ、解決に必要な情報も示さず自己解決かよ。

質問の上手い下手だけでその人の素質が分かりそうな気がする。
0502nobodyさん2005/09/20(火) 00:12:02ID:???
>>500
同じファイルに対してrequire を二重に実行すると、2回目は読み込まれない。
BBSthread.pm とcounter.cgi とで変数のスコープが違っているなら、
先にrequire した方にのみ、settings.plの内容が反映されることになる。

手っ取り早く解決するなら、require を eval に変更すればいいのだが、
このような使い方は感心しないね。
settings.pl の内容を、システムに共通な定数のリストを返す「関数」
にして、各モジュールはこの関数を呼び出すのが常道だと思われるが。
0503nobodyさん2005/09/20(火) 02:27:35ID:jMPX6Q/f
データベースとperlでデータをCSVに書き出すプログラムを書いています。

SQLで取得したデータをHTMLでテーブルにして表示しているのですが、
よくフリーメールであるような各行にチェックボックスがあって、
それにチェックを入れたデータだけCSVに書き出すといったものを作りたいのですが、
ロジック的にはどういったものになるのでしょうか??チェックボックスでCGIに渡せるパラメータは
○○=on とかってなりますよね。どうやって、データを識別したらよいでしょうか???
0504nobodyさん2005/09/20(火) 02:41:10ID:???
>>503
○○=on になっているものだけ取り出せばOKでは?
0505nobodyさん2005/09/20(火) 03:50:56ID:???
>>503
決してバカにするつもりで聞くわけじゃないけど、今までにCGIのプログラムを
書いて、ブラウザからフォームのデータを受け取ってみたことある?

いや、もしかして、そのレベルでつまづいているんじゃないかと思ったんで。
0506nobodyさん2005/09/20(火) 04:20:05ID:???
>>505
そういうひねくれた質問の仕方すると何かいいことある?

いや、もしかして、初心者いじって喜んでるんじゃないかと思ったんで。
0507nobodyさん2005/09/20(火) 06:54:46ID:???
データベース使っててCSVに書き出すプログラムって・・
0508nobodyさん2005/09/20(火) 07:07:20ID:???
データ作ってストリームで吐き出すか何かするだけじゃないのか
0509nobodyさん2005/09/20(火) 07:19:44ID:???
>>503
<input> には name と value に任意の文字列が指定できる。
チェックボックスの場合、チェックがオンになっているときだけ
name=value という形式の文字列が送られてくる。
従って name が同じでも value が違えば識別できる。
順序は保証されないので、順序に依存してはいけない。
0510nobodyさん2005/09/20(火) 08:49:48ID:???
>>503
試してみてから質問してもらえるか。

> 2: それでこんな風にやってみたが・・・
> 3: こんなエラーが出て上手く行かなかった。
05115052005/09/20(火) 11:54:43ID:???
>>506
503の質問って、別の板にもあった。そこでWebProgに行けって言われたから
ここに来たのだろうと思うんだが、質問内容に何も改善がなく、コピペしている
だけなんで、あいかわらず質問者の意図もレベルも分からなかいから、
どこまで分かってる? と、確認しているだけなんだが・・・

何を試したかとか、どこまで分かっているか、とか、情報が一切ないのは困る。
0512nobodyさん2005/09/20(火) 18:16:45ID:???
質問です。
CGI.pmを使ってフォームの値を受け取ろうとしてます。
-----
<form action="hoge.cgi?getval=ggg" method="post">
<input type="hidden" name="postval" value="ppp">
<input type="submit">
</form>
-----
こんな感じのフォームの値を受け取ろうとしているんですが、
GETの引数がCGI.pmに渡されません(この場合getvalが渡されない)
これは仕様でしょうか?何か方法があったりしますか?
0513nobodyさん2005/09/20(火) 18:27:59ID:???
merhodでpost指定してるから
0514nobodyさん2005/09/20(火) 18:28:07ID:???
>>512
> <form action="hoge.cgi?getval=ggg" method="post">

自分で method="post" て書いてるじゃないですか…。GET引数は渡りません。
hiddenで渡してください。
05155122005/09/20(火) 18:42:00ID:???
>513
>514
故意にPOSTを指定してるんです。
actionに「acton=hoge.cgi?getval=ggg」としてるんで、GETの値も渡るかなと思ったんですが、
ダメなんですかね?
そういうものなんでしょうか?
0516nobodyさん2005/09/20(火) 18:53:02ID:???
>>515
それでは、なぜGETとPOSTがあるのかを説明してください。
また、メソッドになぜ両方指定するものがないのかも考えてください。
0517nobodyさん2005/09/20(火) 18:53:22ID:???
>>515
(undef, $getval) = split /=/, $ENV{QUERY_STRING};

でOK。
0518nobodyさん2005/09/20(火) 18:56:07ID:???
>>516
いやいや、量の多い投稿をしたいが、同時に query により
URI も用意したい
という用途はあるぞ。
0519nobodyさん2005/09/20(火) 19:06:19ID:???
> CGI.pmを使ってフォームの値を受け取ろうとしてます。
05205122005/09/20(火) 19:12:18ID:???
>516
えっと、分かりません(汗
なんでなんでしょう?
私の中では、ブックマーク可能なページはGETにしとく、、くらいの認識しかないです。
あと、URL直接叩かれるとまずいページはPOST、、とか。そんな認識でごめんなさい。

>517
CGI.pmに頼らず、自分でパースしなくてはならない、ということですね。
これならできそうです。

で、
POSTのときってURLでパラメータ渡しちゃダメなんでしょうか?それが普通?
php書くときは結構普通にやってたけど、これって考えを改めたほうが良いですか?
0521nobodyさん2005/09/20(火) 19:15:09ID:???
>>520
> POSTのときってURLでパラメータ渡しちゃダメなんでしょうか?それが普通?
お行儀は良くない程度と思っておけばいいんじゃない?
CGI.pmはmethodを見るから受け取れなかっただけ
0522nobodyさん2005/09/20(火) 19:22:09ID:???
>>520
> POSTのときってURLでパラメータ渡しちゃダメなんでしょうか?それが普通?

問題ないと思うよ。
おれもよく使ってる。
0523nobodyさん2005/09/20(火) 21:01:01ID:???
絵文字除去ルーチンを各所サイトを参考に作ったのですが、
もしも下記に間違い等ございましたらご教示いただきたい
次第です。
宜しくお願いいたします。


sub remove_emoji{
my $str = $_[0];

# i-mode, EZweb
my $sjis = '[\x81-\x9F\xE0-\xF7\xFA-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF]';
my $emoji = '[\xF8\xF9][\x40-\x7E\x80-\xFC]';
$str =~ s/\G((?:$sjis)*)(?:$emoji)/$1/go;

# vodafone
$str =~ s/\x1B\$[\x21-\x7A]+\x0F//g;

return $str;
}
0524nobodyさん2005/09/20(火) 22:01:11ID:???
>>523
試してみて不具合がでたら聞きに来い
0525nobodyさん2005/09/20(火) 22:08:21ID:???
>>523
人を Lint 代わりに使わないでくれ
0526nobodyさん2005/09/20(火) 22:23:57ID:???
>>524-525
不愉快な思いをさせてしまい、本当に申し訳ありませんでした。
今のところ不具合はないのですが、もしもアドバイス等いただ
ければと思い書かせていただいた次第です。

悪気はありませんのでお許しください。
すみませんでした。
0527nobodyさん2005/09/20(火) 22:29:15ID:???
>>520
CGIモジュールではPOSTメソッドのときにurlのquery stringで渡した
パラメタはurl_paramっていう別のインタフェースでとるようになって
いるのよ。詳しくはCGIモジュールのマニュアル嫁。特にMIXING POST
AND URL PARAMETERSという見出しのところ。

05285122005/09/21(水) 00:16:24ID:???
>521 >522
なるほど、安心しました。

>527
ごめんなさい。おもいっきり書いてましたね。
どうもありがとうございます。ものすごく助かりました。
精進します。
0529nobodyさん2005/09/21(水) 02:03:43ID:???
このスレって、Lint 代わりに使ってもいい?
0530nobodyさん2005/09/21(水) 11:00:47ID:???
>>529
自作CGIを評価するスレ
http://pc8.2ch.net/test/read.cgi/php/1049514428/
0531nobodyさん2005/09/21(水) 11:41:12ID:AdBzR2Q9
すいません
perlで作成したcgiの質問があります。

HTML側で
<input type=file name="aaa">
<input type=file name="bbb">
とファイルを指定して
perlのcgi側で受け取りたいのですが
やり方がわかりません。

色々ネット上を調べたり「とほほ」を見ていたけど
二つ以上ファイルを受け取る方法がわかりません。

なにか情報をいただけますと幸いです。
0532nobodyさん2005/09/21(水) 13:00:42ID:???
>>531
アップロード以前に、GETやPOSTの受け取り方分かってるの?
まだなら先にそっちから勉強してくれ。
05335312005/09/21(水) 13:22:54ID:AdBzR2Q9
う、、、大変申し訳ありません。
今の所
use CGI;
my $cgi = new CGI;
my $comment = $cgi->param('comment');
上記のようにして取得しています。

だたファイルの場合はどうすれば取得できるのか不明だったため
質問させていただきました。
0534nobodyさん2005/09/21(水) 13:51:44ID:???
送信側は ENCTYPE="multipart/form-data" になってる?
これが原因じゃなかったら他の回答者のレスに期待してくれ。
05355312005/09/21(水) 15:03:05ID:AdBzR2Q9
送信側は↓のようにしているんでなってます、、、
<FORM METHOD=POST ENCTYPE="multipart/form-data" ACTION="test02.cgi">
<INPUT TYPE=file NAME="AAA"><BR>
<INPUT TYPE=file NAME="BBB"><BR>
<INPUT TYPE=submit VALUE="送信">
うーむ 助けて偉い人ー
0536nobodyさん2005/09/21(水) 15:37:57ID:???
>>531
1つも2つも同じことを繰り返すだけだろ
05375312005/09/21(水) 15:56:07ID:AdBzR2Q9
えーっと
INPUT TYPE=file
のデータの取得方法が分からないのです、、、

説明不足で申し訳ありません
05385312005/09/21(水) 15:58:18ID:AdBzR2Q9
(追記)
ひとつだけだったら
http://web.archive.org/web/20010210200144/wakusei.cplaza.ne.jp/twn/cgi-bin/wwwupl2.txt
で取れるとわかったのですが。
0539nobodyさん2005/09/21(水) 16:40:09ID:???
>>531
ヒント:>>403
0540nobodyさん2005/09/21(水) 17:10:37ID:???
>>538
うへ、スクラッチで書いてるのか。悪いことは言わないから
CGIモジュール使うことをオススメするね。
05415312005/09/21(水) 17:13:23ID:AdBzR2Q9
はいー
えーっとそのCGIモジュールを使用した際の
取得方法をお教えいただきたいのです。

わがままなのは十分承知しておりますが
ヒントではなくズバリッお教えいただけますと幸いです。
0542nobodyさん2005/09/21(水) 17:21:41ID:???
>>541
CGIモジュールの使い方をどうやって調べるか?
下記の順序でお試しください。

1.マニュアルを読む
2.和訳がないかググる
3.分かりやすく説明したサイトがないかググる
4.使っている他のスクリプトがないかググる
5.開き直ってにちゃんねるで聞く

05435312005/09/21(水) 17:36:51ID:AdBzR2Q9
ぐぐりまくって以下のようにし解決しました。
use CGI;
my $buffer;
my $query = CGI->new;
my $file = $query->param('BBB');
#my $file_name = ($file =~ /([^\\\/:]+)$/) ? $1 : 'uploadedd.bin';
my $file_name = 'aaa.jpg';
open(OUT, ">$file_name") or die(qq(Can't open "$file_name".));
binmode OUT;
while (read($file, $buffer, 1024)) {
print OUT $buffer;
}
close OUT;

どうもお騒がせいたしましたっ
0544nobodyさん2005/09/21(水) 22:30:20ID:???
1行例書いてあげればいいだけなのに、不親切だなあ。 いいけど。
0545nobodyさん2005/09/21(水) 23:07:53ID:???
不親切だなぁとか書かれて親切になったスレでもあるわけ?いいけど。
0546nobodyさん2005/09/22(木) 02:02:03ID:???
言い出しっぺの法則
0547nobodyさん2005/09/22(木) 05:13:05ID:???
>>544
自分は書いてあげる気はないけど、他人には書けばいいのにと言うわけね。
0548nobodyさん2005/09/22(木) 09:00:24ID:???
もう自己解決したみただしいいじゃないか
0549nobodyさん2005/09/22(木) 10:10:21ID:???
自己解決しました
0550nobodyさん2005/09/22(木) 17:44:54ID:???
自己発電しました
0551nobodyさん2005/09/22(木) 17:46:12ID:???
自己誘電しました
0552nobodyさん2005/09/22(木) 18:00:03ID:???
自己陶酔しました
0553nobodyさん2005/09/22(木) 18:34:37ID:???
自己破産しました
0554nobodyさん2005/09/22(木) 19:49:05ID:???
自己弁護しました
0555nobodyさん2005/09/22(木) 19:57:59ID:???
各ソースに共通で使える定数を用意したくて、以下の3つのソースを用意しました。
↓test.pl
-----
#!/usr/bin/perl
use strict;
use const; # この行をコメントアウトすると動く
use func;
my $obj = func->new();
$obj->print_var();
-----
↓func.pm
-----
package func;
use const;
sub new() {
my $class = shift;
my $self = {@_};
bless $self, $class;
}
sub print_var() {
printf('[%s]', FOO);
}
1;
-----
↓const.pm
-----
use constant FOO => 'aaa';
1;
-----
tesp.plを実行しても、const.pmの中のFOOの値が表示されずに、そのまま"[FOO]"が表示されます。
でも、test.plの中の「use const;」をコメントアウトすると、きちんと"[aaa]"が表示されます。
各ページで共通の定数を用意したいときは、違う方法が必要なのでしょうか?
0556nobodyさんNGNG
Perl5.8以前のサーバー環境で使っていたCGIが
Perl5.8以降のサーバーで動作しなくなったのですが
使えなくなった関数などがあるのでしょうか?
わかる方いましたら教えてください。
0557nobodyさん2005/09/22(木) 20:37:31ID:???
適当だけど、内部で扱うコードがutf-8になったぐらいしか
0558nobodyさん2005/09/22(木) 20:45:04ID:???
>>556
問題が再現する最小のソースを書くべし。
書く過程で解決することも多々。
0559nobodyさん2005/09/22(木) 20:56:13ID:???
>>555
そのやり方ではだめ。const.pmが最初にuseされるときにカレントの
パッケージでFOOが定義されて、それ以後のuseでは既に読み込まれている
ので無視されている。test.plのuseをコメントアウトすると動くのは
それによってfunc.pmでのuseが最初になるからだ。

で、こういう用途には定数をexportするモジュールにするのが普通。
perlmod読んでパッケージとモジュールについて勉強するのがいいだろう。
0560nobodyさん2005/09/22(木) 21:04:17ID:???
Perl5.8以前のサーバーとPerl5.8以降のサーバーってまったく別の鯖かな?
なら関数とかいうんじゃなくて鯖独自の問題のような希ガス
0561556NGNG
CGIゲームなのですが同じログが何個も何個も表示されます。

sub NewsChange {
for ($NC = $NewsMax; $NC >= 2; $NC--) {
$News[$NC] = $News[$NC - 1];
}
$News[1] = $_[0];

$GFyear++;
}

ここらへんが誤動作してそうです・・・。
0562556NGNG
CGIゲームなのですが同じログが何個も何個も表示されます。

sub NewsChange {
for ($NC = $NewsMax; $NC >= 2; $NC--) {
$News[$NC] = $News[$NC - 1];
}
$News[1] = $_[0];

$GFyear++;
}

ここらへんが誤動作してそうです・・・。
0563nobodyさん2005/09/22(木) 21:13:13ID:???
>>556
perl58delta
0564nobodyさん2005/09/22(木) 21:15:48ID:???
>>561
そんな基本的なことしかしてないコードの動作が
かわるとはまず思えないので、問題はその範囲
にはないな。
0565nobodyさん2005/09/22(木) 22:08:46ID:???
>>561-562
> 同じログが何個も何個も表示されます。

何個も書いているのだと思われ。
0566556NGNG
>>560
まったく別なんですが3つのサーバーで試してずっと前から使ってた1つ目のサーバーは大丈夫で
2つ目、3つ目の新しいサーバーが同じようなバグが出て使い物にならなかったので
新しい仕様だから使えないのではないかと思いました。
0567nobodyさん2005/09/22(木) 22:54:51ID:???
エラーメッセージを書いてくれ
0568556NGNG
>>567
エラーメッセージは出ません。
まったく同じスクリプトをまったく同じ手順で設置しているんですが
正常にゲームができるサーバーと、ゲーム開始直後に
同じログがずらりと並んでゲームができなくなるサーバーがあります。
0569nobodyさん2005/09/22(木) 23:15:47ID:???
それしか情報がないんじゃエスパー回答者のお出ましを
願うしかないような希ガス。
0570nobodyさん2005/09/22(木) 23:28:38ID:???
>>556
ソース晒せないならこの話題は終わり。
0571nobodyさん2005/09/23(金) 00:46:02ID:???
>>556
ログってあんたが勝手に考えた仕組みだろう。
そのログを取る部分、そしてログの意味とか晒してもらわにゃ何とも言えん。

ていうか、変数の流れを追えばちゃんとエラーを特定できるはずだから。
0572nobodyさん2005/09/23(金) 01:02:22ID:???
>>556
ブラックボックスを提示して「動きが変です、助けて下さい」って言って、
まともな回答が帰ってくると思うか?
0573エスパー回答者2005/09/23(金) 01:51:44ID:???
>>561
FORTRAN に対する郷愁が無いのなら、@Newsは0番目の要素から使うようにすべきだろう。
unshift @News, $new_element;
splice @News, $NewsMax-1;
$GFyear++;

とすれば、誤動作していたサブルーチンNewsChange を削除することができる。
これで問題は全て解決する(......はずだよな)。
0574nobodyさん2005/09/23(金) 10:48:25ID:???
CGIゲームは専鯖か自鯖でやれよ
0575nobodyさん2005/09/23(金) 11:41:48ID:???
そこでAjaxですよ。

とか、言ってみたりする。
0576nobodyさん2005/09/23(金) 11:47:00ID:???
Ajax の方が負荷かけるのは簡単だけどな。
JavaScript にしとけ。
0577nobodyさん2005/09/23(金) 12:07:02ID:???
Flashも、通信クライアントになれるんだっけ?
0578nobodyさん2005/09/23(金) 15:02:27ID:???
>>577
なれるけどスレ違い。
0579nobodyさん2005/09/23(金) 16:12:52ID:NELxQvyQ
http://psmk2.net/


ここのアクセスカウンターって改造されてね?
0580nobodyさん2005/09/23(金) 16:20:20ID:???
スレ違い
0581nobodyさん2005/09/23(金) 16:35:54ID:???
>>579
全然改造されて無いじゃん
氏ね
0582nobodyさん2005/09/23(金) 20:49:12ID:???
ageてるんだから宣伝だろ。
0583nobodyさん2005/09/23(金) 21:32:21ID:???
お気に入りにいれてやろうかゴラァ!!
0584nobodyさん2005/09/26(月) 01:11:42ID:???
質問です。
Perl内で、他のURLにあるデータを参照することはできますか?
具体的には、
open(WORK,"http://www.hogehoge.net/foo/baa.txt");
みたいな事です。
0585nobodyさん2005/09/26(月) 01:32:11ID:???
>>584
LWP
0586nobodyさん2005/09/26(月) 01:47:23ID:???
>>584
実在するドメインを例示に使うなとあれほど(ry
0587nobodyさん2005/09/26(月) 02:22:09ID:???
ちゃんと例示用に予約された example.jp とか、 example.com があるのに、
なぜゆえ・・・
■ このスレッドは過去ログ倉庫に格納されています