Perlコーディング初心者質問スレ Part 43
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/08/12(金) 01:26:47ID:mHnZWvqz【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0538531
2005/09/21(水) 15:58:18ID:AdBzR2Q9ひとつだけだったら
http://web.archive.org/web/20010210200144/wakusei.cplaza.ne.jp/twn/cgi-bin/wwwupl2.txt
で取れるとわかったのですが。
0541531
2005/09/21(水) 17:13:23ID:AdBzR2Q9えーっとそのCGIモジュールを使用した際の
取得方法をお教えいただきたいのです。
わがままなのは十分承知しておりますが
ヒントではなくズバリッお教えいただけますと幸いです。
0542nobodyさん
2005/09/21(水) 17:21:41ID:???CGIモジュールの使い方をどうやって調べるか?
下記の順序でお試しください。
1.マニュアルを読む
2.和訳がないかググる
3.分かりやすく説明したサイトがないかググる
4.使っている他のスクリプトがないかググる
5.開き直ってにちゃんねるで聞く
0543531
2005/09/21(水) 17:36:51ID:AdBzR2Q9use 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:???0545nobodyさん
2005/09/21(水) 23:07:53ID:???0546nobodyさん
2005/09/22(木) 02:02:03ID:???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:???↓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さん
NGNGPerl5.8以降のサーバーで動作しなくなったのですが
使えなくなった関数などがあるのでしょうか?
わかる方いましたら教えてください。
0557nobodyさん
2005/09/22(木) 20:37:31ID:???0559nobodyさん
2005/09/22(木) 20:56:13ID:???そのやり方ではだめ。const.pmが最初にuseされるときにカレントの
パッケージでFOOが定義されて、それ以後のuseでは既に読み込まれている
ので無視されている。test.plのuseをコメントアウトすると動くのは
それによってfunc.pmでのuseが最初になるからだ。
で、こういう用途には定数をexportするモジュールにするのが普通。
perlmod読んでパッケージとモジュールについて勉強するのがいいだろう。
0560nobodyさん
2005/09/22(木) 21:04:17ID:???なら関数とかいうんじゃなくて鯖独自の問題のような希ガス
0561556
NGNGsub NewsChange {
for ($NC = $NewsMax; $NC >= 2; $NC--) {
$News[$NC] = $News[$NC - 1];
}
$News[1] = $_[0];
$GFyear++;
}
ここらへんが誤動作してそうです・・・。
0562556
NGNGsub NewsChange {
for ($NC = $NewsMax; $NC >= 2; $NC--) {
$News[$NC] = $News[$NC - 1];
}
$News[1] = $_[0];
$GFyear++;
}
ここらへんが誤動作してそうです・・・。
0566556
NGNGまったく別なんですが3つのサーバーで試してずっと前から使ってた1つ目のサーバーは大丈夫で
2つ目、3つ目の新しいサーバーが同じようなバグが出て使い物にならなかったので
新しい仕様だから使えないのではないかと思いました。
0567nobodyさん
2005/09/22(木) 22:54:51ID:???0568556
NGNGエラーメッセージは出ません。
まったく同じスクリプトをまったく同じ手順で設置しているんですが
正常にゲームができるサーバーと、ゲーム開始直後に
同じログがずらりと並んでゲームができなくなるサーバーがあります。
0569nobodyさん
2005/09/22(木) 23:15:47ID:???願うしかないような希ガス。
0571nobodyさん
2005/09/23(金) 00:46:02ID:???ログってあんたが勝手に考えた仕組みだろう。
そのログを取る部分、そしてログの意味とか晒してもらわにゃ何とも言えん。
ていうか、変数の流れを追えばちゃんとエラーを特定できるはずだから。
0573エスパー回答者
2005/09/23(金) 01:51:44ID:???FORTRAN に対する郷愁が無いのなら、@Newsは0番目の要素から使うようにすべきだろう。
unshift @News, $new_element;
splice @News, $NewsMax-1;
$GFyear++;
とすれば、誤動作していたサブルーチンNewsChange を削除することができる。
これで問題は全て解決する(......はずだよな)。
0574nobodyさん
2005/09/23(金) 10:48:25ID:???0575nobodyさん
2005/09/23(金) 11:41:48ID:???とか、言ってみたりする。
0576nobodyさん
2005/09/23(金) 11:47:00ID:???JavaScript にしとけ。
0577nobodyさん
2005/09/23(金) 12:07:02ID:???0579nobodyさん
2005/09/23(金) 16:12:52ID:NELxQvyQここのアクセスカウンターって改造されてね?
0580nobodyさん
2005/09/23(金) 16:20:20ID:???0582nobodyさん
2005/09/23(金) 20:49:12ID:???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");
みたいな事です。
0587nobodyさん
2005/09/26(月) 02:22:09ID:???なぜゆえ・・・
0588nobodyさん
2005/09/26(月) 02:59:24ID:???0589nobodyさん
2005/09/26(月) 04:43:37ID:???0591nobodyさん
2005/09/26(月) 17:53:48ID:???チェックボックスでデータを受け取って
HTMLの確認画面に反映させるプログラムを作っているのですが
行き詰まりました。
例えば、course1,course2,course3とあってcourse1とcourse3がチェックされたら
course2のところが空白で反映されます。
ex.)HTML出力画面
course1
course3
こんな感じになります。
この空白を詰めて
course1
course3
みたいな風に出力したいのですがどのようにすれば良いでしょうか?
0592591
2005/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:???>>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:???思うにそれは空白をつめて表示させるためにはどのようなHTMLであるべきか
という問題であって、それさえわかってしまえばその通り出力するプログラムを
書けばいいだけだから、まずHTMLに詳しい人がいるところで質問するのが
スジってもんじゃないだろうか。ここにもいるかもしれないけどさ。
0595591
2005/09/26(月) 18:19:54ID:???ありがとうございます、無事に動きましたw
エスパーですね!
すみません、情報不足で・・。>>594さんが書いた通りです。
>>594
すみませんでした。 orz
0596nobodyさん
2005/09/26(月) 18:27:36ID:???変数以外で同じ文字を出力する場合とかは、とりあえずループにかければ問題点は見つかる。
コピペしたつもりでも、うっかりで変わってたりするから。
0598nobodyさん
2005/09/26(月) 21:18:44ID:Q7jBJFo3<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:fXbmUf3O0600nobodyさん
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:???その集めた情報の意味がわからないなら、ここで聞いても意味がないと思います。
クッキーの保存と呼び出しの勉強をしてきてください。
ついでに、ブラウザの戻る進むでは意味がないのであしからず。
0602nobodyさん
2005/09/26(月) 22:44:25ID:???ブラウザのバックは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:???レスありがとうございます。
最近cookieの勉強を始めたばかりなので、ほんとに基本しか知らないのですが、
この場合は、NAME= 値(たとえば1)、 print "path=", "/page2 "; でpage2に値を持たせて。。
戻ったときにエラーを出す方法がよくわからないのですが。。。勉強不足ですいません。
0606nobodyさん
2005/09/26(月) 23:45:44ID:???いやいや、俺始めてクッキーを知った日に応用は出来なかったけどそれぐらいの事は出来たが・・・・
まぁ>>601氏の言うようにブラウザの戻るはキャッシュがほとんどなので(略
0607nobodyさん
2005/09/27(火) 09:58:18ID:???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;
こうした場合、「%」1つの入力であれば正常にエスケープされるように
なってのですが、「%%」と入力するとなぜか\\%%になってしまいます。
ご教示いただけますと非常に助かります。
0609nobodyさん
2005/09/27(火) 23:41:28ID:???$sql =~ tr/\'%,/\\\'\%\,/;
それと安易にエスケープするな\Q使え
0610nobodyさん
2005/09/27(火) 23:56:08ID:???早速のご返答有難うございます。
しかし、「\\\\\'''''%%%%%」と入力したところ、
「\\\\\\\\\\'''''%%%%%」となりました。
前の\のみエスケープされているみたいです。
0611nobodyさん
2005/09/28(水) 00:02:13ID:???$sql =~ s/\Q(\\|'|%|,)\E/\\$1/g;
これですと
「\\\\\'''''%%%%%」は「\\'''%%%%%,,,,,」になってしまいました。。
0612nobodyさん
2005/09/28(水) 00:07:50ID:???0613584
2005/09/28(水) 00:12:25ID:???LWP・・・。
プロレス団体みたいですね。
0614nobodyさん
2005/09/28(水) 00:14:48ID:???0615nobodyさん
2005/09/28(水) 00:46:08ID:???よくわかりませんが、
$sql =~ s/(\\|\'|\\%|\,)/\\$1/g;
にすることによって解決しました。
お騒がせしました。
0616nobodyさん
2005/09/28(水) 00:47:05ID:???0617nobodyさん
2005/09/28(水) 01:02:47ID:MTwQib0M15桁(1÷3の場合は小数第14位)までしか計算出来ないようです。
例えば、1 / 3 を計算すると、
0.33333333333333 となってしまいます。
例えば、1 / 3 の結果を 100桁で出力させたい場合は、
小数第5000位で割り切れる割り算の答えを正確に (= 小数弟5000位まで) 出力したい場合には
どのようなコードにすれば良いでしょうか?
ご教示お願いします。
0618nobodyさん
2005/09/28(水) 01:03:41ID:???正) 例えば、1 / 3 の結果を 100桁で出力させたい場合や、
間違えました。申し訳ありません。
0620nobodyさん
2005/09/28(水) 08:23:08ID:???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";
0621617
2005/09/28(水) 17:07:26ID:???ご教示ありがとうございます。
実際にやってみたら正常に動作しました。
div_scale(); で無限に計算を続けるようになるとおもったら
数百桁までしか計算されていないようなので、
div_scale(1000000000000000000) みたいに馬鹿でかい数をいれたら
期待通りに動作しました。
0622nobodyさん
2005/09/29(木) 09:36:51ID:???<head><title>test</title></head>
<body>test</body>
</html>
上のようなHTMLファイルを読み込んで、
gzip圧縮してブラウザにかえすCGIを作っています。
gzip圧縮する部分はネットの記事を参考に出来たのですが
HTMLを読み込んでCGIに出力させるにはどうすればよいでしょうか。
0624nobodyさん
2005/09/29(木) 10:05:50ID:???質問の意味がよく分からんが、
print <<END;
<html>
<head><title>test</title></head>
<body>test</body>
</html>
END
でいいのでは?
0625nobodyさん
2005/09/29(木) 10:16:37ID:???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:???http の レスポンスヘッダを返さないと。
>>622
print "\n", `cat hoge.html`;
0628nobodyさん
2005/09/29(木) 13:45:10ID:???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 でソース丸見えです。
他も同じように作ってるつもりなのに、なぜこれだけ失敗するのかわかりません。
何か勘所ありましたらお教えくださいませ。 よろしくお願いします。
0634nobodyさん
2005/09/29(木) 14:20:46ID:???HTMLがテキストで見えるのなら、Content-typeが上手く出力されてないと思われ。
出力されてるヘッダを確認。
0635nobodyさん
2005/09/29(木) 14:21:56ID:???その次に、確認方法きぼんぬ。とかね。
0636nobodyさん
2005/09/29(木) 14:49:09ID:???perlをローカルにインスコしてるなら、lwp-requestコマンドが使えるので、コマンドラインから
lwp-request -e -d http://example.net/
という感じでアクセス。
0637nobodyさん
2005/09/29(木) 14:50:07ID:???演算部分をカットしても表示変わらず。
もっかいよく見てみます どうもありがとうございました。
0638nobodyさん
2005/09/29(木) 15:14:00ID:???■ このスレッドは過去ログ倉庫に格納されています