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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
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 があるのに、
なぜゆえ・・・
0588nobodyさん2005/09/26(月) 02:59:24ID:???
そこに、ドメインがあるからさ、フフフ・・・ ><
0589nobodyさん2005/09/26(月) 04:43:37ID:???
hogeとfugaも日本人用に予約しておけよな
0590nobodyさん2005/09/26(月) 04:49:01ID:???
>>589
藻前が買ってボランティア汁。
0591nobodyさん2005/09/26(月) 17:53:48ID:???
プログラム板で聞いたら板違いと、言われたので再度ここで質問させてください。

チェックボックスでデータを受け取って
HTMLの確認画面に反映させるプログラムを作っているのですが
行き詰まりました。

例えば、course1,course2,course3とあってcourse1とcourse3がチェックされたら
course2のところが空白で反映されます。

ex.)HTML出力画面
course1

course3

こんな感じになります。

この空白を詰めて

course1
course3
みたいな風に出力したいのですがどのようにすれば良いでしょうか?
05925912005/09/26(月) 17:54:19ID:???
ちなみにソースはこんな感じです。汚くてごめん・・。

if($FORM{'course1'} ne "on"){
print "<TR><TH ALIGN=\"right\" VALIGN=\"top\">希望コース:</TH><TD>\n";
print "$HTML{'course1'}\n";
print "<INPUT TYPE=\"hidden\" NAME=\"course1\" VALUE=\"$FORM{'course1'}\">\n";
print "</TD></TR>\n";
}


if($FORM{'course2'} ne "on"){
print "<TR><TH ALIGN=\"right\" VALIGN=\"top\"></TH><TD>\n";
print "$HTML{'course2'}\n";
print "<br>";
print "<INPUT TYPE=\"hidden\" NAME=\"course2\" VALUE=\"$FORM{'course2'}\">\n";
print "</TD></TR>\n";
}
0593nobodyさん2005/09/26(月) 18:03:42ID:???
>>591
>>592も質問するには情報足らないので、エスパーのフリをしてみる。
foerach ('course1','course2','course3') {
if ($FORM{$_} eq "on") { next; }
print "<TR><TH ALIGN=\"right\" VALIGN=\"top\">希望コース:</TH><TD>\n";
print "$HTML{$_}\n";
print "<INPUT TYPE=\"hidden\" NAME=\"$_\" VALUE=\"$FORM{$_}\">\n";
print "</TD></TR>\n";
}
これでまず問題点を切り分けてくれ。
0594nobodyさん2005/09/26(月) 18:16:11ID:???
>>591
思うにそれは空白をつめて表示させるためにはどのようなHTMLであるべきか
という問題であって、それさえわかってしまえばその通り出力するプログラムを
書けばいいだけだから、まずHTMLに詳しい人がいるところで質問するのが
スジってもんじゃないだろうか。ここにもいるかもしれないけどさ。

05955912005/09/26(月) 18:19:54ID:???
>>593
ありがとうございます、無事に動きましたw
エスパーですね!
すみません、情報不足で・・。>>594さんが書いた通りです。

>>594
すみませんでした。 orz
0596nobodyさん2005/09/26(月) 18:27:36ID:???
どうやらエスパーになれたらしい。
変数以外で同じ文字を出力する場合とかは、とりあえずループにかければ問題点は見つかる。
コピペしたつもりでも、うっかりで変わってたりするから。
05975912005/09/26(月) 18:30:46ID:???
>>596
勉強になりました。ありがとうございました。
0598nobodyさん2005/09/26(月) 21:18:44ID:Q7jBJFo3
$FORM{$_} eq "on" and print <<"END" foerach qw( course1 course2 course3 );
<TR>
 <TH ALIGN="right" VALIGN="top">希望コース:</TH>
 <TD>
  $HTML{$_}
  <INPUT TYPE="hidden" NAME="$_" VALUE="$FORM{$_}">
 </TD>
</TR>
END

エスケープとかprint連記とかキモイからこれぐらいスッキリしてもらえる?

いや、オナニーだけどさ。
0599nobodyさん2005/09/26(月) 21:48:52ID:fXbmUf3O
foerach
0600nobodyさん2005/09/26(月) 22:27:10ID:???

ヒントをいただきたく思っております。

cgiで書き出すhtmlページ page1 → page2 に進んで、 page1に戻ったときに 「あんたpage2に進んだからもう戻れないよ!!」

ってやりたいのですが、

集めた情報では cookieでセッション管理して、page1でcookie → page2でcookieになんか値を持たせる。
でもってpage1に戻ったら値違うからダメよ!みたいなことをしろ!! 

とあったのですが、どんなソースなのかさっぱりです。。

どなたか道しるべいただけませんでしょうか?所謂ブラウザの戻る制御みたいなことなのですが、
phpではなく perlでやりたいです。


野暮な質問ですいません。何卒宜しくお願いいたします。
0601nobodyさん2005/09/26(月) 22:38:13ID:???
>>600
その集めた情報の意味がわからないなら、ここで聞いても意味がないと思います。
クッキーの保存と呼び出しの勉強をしてきてください。
ついでに、ブラウザの戻る進むでは意味がないのであしからず。
0602nobodyさん2005/09/26(月) 22:44:25ID:???
>>601
ブラウザのバックはjavascriptで消せる。

Cookieの送り方が分からないんじゃどうしようも無いがな。
0603nobodyさん2005/09/26(月) 23:05:12ID:???
このサイトはもちろん見ましたよね?

http://www.google.com/search?num=50&hl=ja&q=perl+%E3%82%AF%E3%83%83%E3%82%AD%E3%83%BC&lr=lang_ja
0604nobodyさん2005/09/26(月) 23:07:24ID:???
>>601さん
レスありがとうございます。

最近cookieの勉強を始めたばかりなので、ほんとに基本しか知らないのですが、
この場合は、NAME= 値(たとえば1)、 print "path=", "/page2 ";  でpage2に値を持たせて。。
戻ったときにエラーを出す方法がよくわからないのですが。。。勉強不足ですいません。

0605nobodyさん2005/09/26(月) 23:29:13ID:???
>>602
ブラウザはIEだけじゃないですよ。
>>604
検索の方法から勉強してください。
0606nobodyさん2005/09/26(月) 23:45:44ID:???
>>604
いやいや、俺始めてクッキーを知った日に応用は出来なかったけどそれぐらいの事は出来たが・・・・

まぁ>>601氏の言うようにブラウザの戻るはキャッシュがほとんどなので(略
0607nobodyさん2005/09/27(火) 09:58:18ID:???
>>600
http://perldoc.jp/docs/modules/CGI-Session-3.11/Tutorial.pod
http://perldoc.jp/docs/modules/CGI-Session-3.11/Session.pod
これでセッションは、だいたい分かると思うけど。
0608nobodyさん2005/09/27(火) 23:34:13ID:1E14u9Km
$sql =~ s/(\\|\'|\%|\,)/\\$1/g;

これがおかしな挙動を見せるのでググってみたところ、
%は%%でエスケープすることを学習したのですが、

$sql =~ s/(\\|\'|%%|\,)/\\$1/g;
こうした場合、「%」1つの入力であれば正常にエスケープされるように
なってのですが、「%%」と入力するとなぜか\\%%になってしまいます。

ご教示いただけますと非常に助かります。
0609nobodyさん2005/09/27(火) 23:41:28ID:???
おまいがしたいのはこれではないのか?
$sql =~ tr/\'%,/\\\'\%\,/;

それと安易にエスケープするな\Q使え
0610nobodyさん2005/09/27(火) 23:56:08ID:???
>>609
早速のご返答有難うございます。

しかし、「\\\\\'''''%%%%%」と入力したところ、
「\\\\\\\\\\'''''%%%%%」となりました。

前の\のみエスケープされているみたいです。
0611nobodyさん2005/09/28(水) 00:02:13ID:???
別の方法も試してみましたが、だめでした。

$sql =~ s/\Q(\\|'|%|,)\E/\\$1/g;

これですと
「\\\\\'''''%%%%%」は「\\'''%%%%%,,,,,」になってしまいました。。
0612nobodyさん2005/09/28(水) 00:07:50ID:???
何をしたいんだっけ?
06135842005/09/28(水) 00:12:25ID:???
ありがとうございます。
LWP・・・。

プロレス団体みたいですね。

0614nobodyさん2005/09/28(水) 00:14:48ID:???
lib-www-perl すごいプロレス団体でつね。
0615nobodyさん2005/09/28(水) 00:46:08ID:???
解決しました。

よくわかりませんが、
$sql =~ s/(\\|\'|\\%|\,)/\\$1/g;
にすることによって解決しました。

お騒がせしました。
0616nobodyさん2005/09/28(水) 00:47:05ID:???
Larry Wall Prowrestling
0617nobodyさん2005/09/28(水) 01:02:47ID:MTwQib0M
Perlで数学的な演算をやろうと思っているのですが、
15桁(1÷3の場合は小数第14位)までしか計算出来ないようです。

例えば、1 / 3 を計算すると、
0.33333333333333 となってしまいます。


例えば、1 / 3 の結果を 100桁で出力させたい場合は、
小数第5000位で割り切れる割り算の答えを正確に (= 小数弟5000位まで) 出力したい場合には
どのようなコードにすれば良いでしょうか?

ご教示お願いします。
0618nobodyさん2005/09/28(水) 01:03:41ID:???
誤) 例えば、1 / 3 の結果を 100桁で出力させたい場合は、
正) 例えば、1 / 3 の結果を 100桁で出力させたい場合や、


間違えました。申し訳ありません。
0619nobodyさん2005/09/28(水) 01:34:06ID:???
>>617

Math::BigFloat
0620nobodyさん2005/09/28(水) 08:23:08ID:???
>>617
use bignum;

bignum->div_scale(100);
my $x = 1.0;
print $x/3, "\n";

bignum->div_scale(5000);
my $y = 1.0;
print $y/7, "\n";
06216172005/09/28(水) 17:07:26ID:???
>>619-620
ご教示ありがとうございます。
実際にやってみたら正常に動作しました。

div_scale(); で無限に計算を続けるようになるとおもったら
数百桁までしか計算されていないようなので、
div_scale(1000000000000000000) みたいに馬鹿でかい数をいれたら
期待通りに動作しました。
0622nobodyさん2005/09/29(木) 09:36:51ID:???
 <html>
 <head><title>test</title></head>
 <body>test</body>
 </html>
上のようなHTMLファイルを読み込んで、
gzip圧縮してブラウザにかえすCGIを作っています。

gzip圧縮する部分はネットの記事を参考に出来たのですが
HTMLを読み込んでCGIに出力させるにはどうすればよいでしょうか。
0623nobodyさん2005/09/29(木) 09:53:31ID:???
>>622
そういうことしたいときは、mod_gzip ってものを使うんですが。
0624nobodyさん2005/09/29(木) 10:05:50ID:???
>>622
質問の意味がよく分からんが、

print <<END;

<html>
<head><title>test</title></head>
<body>test</body>
</html>
END

でいいのでは?
0625nobodyさん2005/09/29(木) 10:16:37ID:???
sub fuck {
local $/;
open(F, "fuckyou.html") || die "why don't you fuck?"
my $buf = <F>;
close(F);
return $buf;
}

こーゆーことをしたいとかじゃなくて?
こんな基本すら書けない人間が gzip とか言ってるのってありえんとおもた。
0626nobodyさん2005/09/29(木) 10:26:27ID:???
>>625
http の レスポンスヘッダを返さないと。

>>622
print "\n", `cat hoge.html`;
0627nobodyさん2005/09/29(木) 10:27:10ID:???
>>626
IIS な鯖だったら cat できんわけだが。
0628nobodyさん2005/09/29(木) 13:45:10ID:???
#!/usr/local/bin/perl

use CGI
cgi = new CGI

(formの値をどうたらこうたら)

(メイン演算)



print "Content-type: text/html\n\n";

print "<html>\n";

(演算結果をprint)

print "</html>";


という感じのPerlのCGIがたくさんあるのですが、
一つだけHTMLソースがベタ書きで出てしまいます。
Win IE ではちゃんと見えるのですが、Mozilla でソース丸見えです。
他も同じように作ってるつもりなのに、なぜこれだけ失敗するのかわかりません。
何か勘所ありましたらお教えくださいませ。 よろしくお願いします。
0629nobodyさん2005/09/29(木) 13:59:24ID:???
>>628
たくさん cgi ファイルがある設計がどうかしていると思われ。
0630nobodyさん2005/09/29(木) 14:05:41ID:???
>>629  ? なんで?
演算ごとに作っておいた方がラク。
0631nobodyさん2005/09/29(木) 14:09:41ID:???
>>628
問題が再現する最小のソースを書くべし。
0632nobodyさん2005/09/29(木) 14:11:47ID:???
>>628
ソースって中濃?とんかつ?
どのソースが見えてる?
0633nobodyさん2005/09/29(木) 14:13:15ID:???
>>630
何をもってラクとするかだよね。
MVC フレームワークとか勉強してみてください。
0634nobodyさん2005/09/29(木) 14:20:46ID:???
>>628
HTMLがテキストで見えるのなら、Content-typeが上手く出力されてないと思われ。
出力されてるヘッダを確認。
0635nobodyさん2005/09/29(木) 14:21:56ID:???
ヘッダって何ですか?とか聞かれる悪寒。
その次に、確認方法きぼんぬ。とかね。
0636nobodyさん2005/09/29(木) 14:49:09ID:???
>>635
perlをローカルにインスコしてるなら、lwp-requestコマンドが使えるので、コマンドラインから
lwp-request -e -d http://example.net/
という感じでアクセス。
0637nobodyさん2005/09/29(木) 14:50:07ID:???
>>634 ちゃんと text/html と思われているもようでつ。
演算部分をカットしても表示変わらず。 
もっかいよく見てみます  どうもありがとうございました。
0638nobodyさん2005/09/29(木) 15:14:00ID:???
こういうのを見てると、どーかんがえても何らかのフレームワークに乗ったほうが楽だね。
■ このスレッドは過去ログ倉庫に格納されています