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

【Perl】初心者コーナー Part13

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/05/30 13:06ID:R2kt1mTx
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

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

CGIの質問は【CGIだけど、なんか質問ある? part 6】
http://pc.2ch.net/test/read.cgi/php/1019561283/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0797nobodyさん02/07/13 22:35ID:xEQW3A4y
名前:年齢
A  :22
B  :31
C  :13

上記のような二次配列を連想配列をつかって作成したのですが、
これをソートするのはどのようにすればいいのでしょう・・?
知人の考えで、年齢をハッシュのキーにしてソートすると言う案があったのですが、
同じ年齢の場合には、上書きされてしまうのでその案は使えませんでした。
どのようにすればいいでしょう・・?
0798nobodyさん02/07/13 22:49ID:???
foreach(sort {$hash{$a} <=> $has{$b}} keys %hash){
print qq($_ : $hash{$_}\n);
}
0799nobodyさん02/07/13 22:49ID:???
タイプミススマソ。
適宜修正して。
0800nobodyさん02/07/13 23:28ID:???
795>>796さん、お答えありがとうございます。
今、ラクダ本で、コンパイルについて見ています。

しかし、use Protect ;とファイルにはあるのですが、
この Protectの部分について書かれていません。

use Protect ; は、どうやればできるのでしょうか。

0801 ◆JAPH9PWA 02/07/14 00:45ID:???
>>800
ラクダ本のどこだかわからないが、
それは「自分でプロテクトモジュールを作成してね」という意味だと思う。
とりあえずそれを実装するには、
・Perlに構文の理解
・CPANのFilterライブラリの使用法
・暗号化ライブラリの使用法
が最低限必要だと思うよ。
0802お酢カル ◆myMazZ7Y 02/07/14 01:07ID:???
>>801
説明できないオナニー野郎は(・∀・)ウセロ!!

まぁ>>800は馬鹿だからこれでいいかと
------------encode-------------------
while(<>){
$n= unpack "h*", "$_";
$n=~y/123456789fedcba/abcdef987654321/;
$e= pack "h*" , "$n";
print $e;
}
0803nobodyさん02/07/14 01:08ID:???
800>>801さん、ありがとうございます。

googleで、検索していたのですが、use MD5; というのは、
見つけました。
私には、まだ敷居が高そうです。

e-shoppyというSHOPスクリプトの試用版にバイナリエディタを
使うようにあったので、試用版って、こんな感じで配布しているんだと
思い、気になるので調べていました。

スクリプトを売る前に、試用版として、こんな感じで配布すれば、
ソースがプロテクトできるので、有用だなと興味を持ちました。

0804nobodyさん02/07/14 02:43ID:vNhQYRiQ
質問させてください。
今、perlでBBSを書いているのですが、
大体できて知り合いの所に入れてもらったりして
動作確認しました。

色んな環境の人のところで正しく動作したのですが、
(perlのバージョンが5.5or5.6,実行権限がnobody,オーナー等)
一人だけ動作がおかしい人がいるんです。

何がおかしいのか調べてみたら、
サブルーチンでseekさせてメインのルーチンに戻ってくると
seekさせたのが無かったことに?なってるんです。
サブルーチンでどんなにseekさせても
メインのルーチンで続行するとなぜか次の一行は空行、
その次の一行はファイルの一行目を読み込みます。

そのおかしくなる人の環境は
OS NAME = freebsd
PROCESS ID = 5854
PERL EXECUTABLE = /usr/local/bin/perl
PERL VERSION = 5.00503
ってな感じです。権限はオーナー権限です。
他の、perlのバージョンが5.5の人のところではちゃんと動いてます。
この人の環境になにか特別なものがあるとは思えないので、、、
ただ、他の人はみんなlinuxなんですけどそれって関係ありますか?

コーディングの問題かとも思っていろいろ試行錯誤してるのですけど
もう分からないんです・・・
0805nobodyさん02/07/14 02:51ID:CbCEC3kH
>>804
ソースもどこかにアップしてみてよ。
0806nobodyさん02/07/14 03:15ID:???
804です。
UPしてみました。なにぶん、perlでの初めてまともな作成物なので
見るのも辛いところもあると思いますが、よろしくお願いします。
ttp://naha.cool.ne.jp/b3b3b/styx.zip
0807 02/07/14 03:23ID:???
アーカイブじゃなくtxtだとすぐ見られるのだが・・・
0808nobodyさん02/07/14 03:25ID:???
ライブラリに分割してあって txt だときっついです。。。
もうしわけないです;;
0809nobodyさん02/07/14 03:42ID:CbCEC3kH
1つおもいあったったのが、たとえばサブルーチン delete_art などにおいて、
sysread関数と他の方法による読み込みの混用が存在しています。

これは、わたしの手元のラクダ本に書いてあることですが、これらの混用は、
あなたがウィザード級の腕前の持ち主でないかぎり推奨できないとあります。
0810nobodyさん02/07/14 04:04ID:???
804です。アドバイス有難うございます。
どっかのサイトで行数を数える一番効率の良い方法ってのが出ていまして、
sysread使ってましたので、行数を数えるのにsysread使ってます。

sysread使わないで書き直してもみます。
いまおかしくなってる環境の当人に連絡が取れないので
今すぐには無理だと思いますが。

ただ、殆どの人のとこでは正常に動いていて
その人のとこでだけ動かないっていうのが気になります。
環境に依存するような問題があるのでしょうか?
(ファイルを扱う関数の、実装の違いとか)

らくだ本欲しいですけど
貧乏なので本屋で眺めるだけです;;
perl は立ち読みと WEB と皆さんの素晴らしい作品で勉強中です。
0811nobodyさん02/07/14 04:15ID:CbCEC3kH
>>810
恐らくではありますが、FreeBSD環境では sysread関数と他の読み込みの混用の
面倒をみてくれないということでしょう。
sysread関数というのは、直接システムコールを呼び出しているので混用した
場合に処理に見合った動きが期待できなっかったりするようです。
まぁ、単純に sysread関数を read関数に書きかえるだけで恐らくうまくいくで
しょう。

それから、効率よく行数を数えるのなら以下をやってみてはどうでしょう。

while (<FILEHANDLE>){}
print "全行数は: $.\n";
close(FILEHANDLE);
0812nobodyさん02/07/14 04:24ID:???
while (<FILEHANDLE>){}
最初はこういう方法とっていたのですが、速度が良くないようです。
ベンチとりまくってみましたが、
バッファにsysreadで読んでtrするほうが圧倒的に早かったです。
1000レスとかになるログだともろに差が出てきたので、、、

read で書き直して、ベンチマークと相談して
当人にためさせてみますね。

あと、問題の出ている個所の本元は、&std::pick だと思います。
ここでもsysreadで行数数えているので、ご指摘の問題があるのだと思います。

でもおかしいんですよね、、、
このpickルーチンだけ抜き出した簡単なテスト用cgi作って
彼にためさせたらちゃんと動作してたんですよね。
(任意の行にseekちゃんとしてる)

パッケージとか絡むとなんか違うのかなぁ〜
0813nobodyさん02/07/14 04:29ID:CbCEC3kH
>>812
速度の差なんて人間の感覚では気づかない程度のミリ秒単位だからそう
気にすることないと思います。 もしこれが遅いのならC言語などで書く
ようにすることを考えるべきです。
0814nobodyさん02/07/14 04:44ID:???
ミリ秒の差だと思ってベンチとって見たら
0.数秒の差だったです・・・

テストケースのログで、
(BBSのトップに○○スレのそれぞれ最新の○件を表示みたいな)
そのスレが1000レスとかあると、一行目からたとえば950行目を探すのに
while (<FILEHANDLE>)式とtr式で物凄い差が出ました。
それが20スレとかあるともう体感できそうなくらいの差だったので。

ベンチマーク用のルーチン作って2000行のログのうち**行目をサーチする、
というのを1000回まわすのを自宅でやってみたところ
tr式の方が15倍くらい早くて、
従来の方法だと固まったんじゃないかってくらい遅かったです(もう一分位;;)

BBSで使う場合1000回も回さないですけど
それでも標準的表示数で0.15秒くらいの差が出てました。

私はもともと最初にプログラムを触った時
みんなマシンパワーがなくてなんでも高速化高速化があたりまえの頃だったので
なんか貧乏癖がついてるのかもしれません。
perlで久しぶりにプログラミングってのを再開してます。

もうちょっとおおらかにプログラミングしてみます。
いろいろ有難うございました。
0815nobodyさん02/07/14 04:48ID:CbCEC3kH
>>814
0.1秒でも速くしたいのなら別ファイルに常に行数のみを保存しておく
などの方法もありますが、そこまでしてもPerlで速く処理させたい?
0816nobodyさん02/07/14 05:02ID:???
別ファイルに行数保存してますよ〜
でも任意の行数にシークするってのはできないですよね。
(関数としてはない)ユーザーが工夫しないと。

書き込みがあったとき、削除のとき、だけは再度行数を取得してます。
もし、別ファイルが不慮の事故でいかれてたら一生ずれたまんまになるので。

perlでそこまでして、とは思ってないです。
生意気そうなこと言って申し訳ありません。
でも出来るだけ早く出来るならそのほうがいいかな〜ってだけです。

c-boardのソースとかみたらなんかすごくてブルーなっちゃって
高速化しないとだれも相手にしてくれないかな、って囚われていました。
早くしなきゃ、早くしなきゃって。
でも殆どの人はそんなこと気にしてないんですよね。

それと単純にベンチで段々確実に改良ごとに早くなってくのが
楽しかった、ってのもあります(笑

まだまだ勉強中の身ですので努力して良い物作れるようにがんばります〜
0817高速化遊戯02/07/14 05:46ID:Iun5VHk7
別ファイルに、行頭のファイルポインタの一覧を保存する
というはダメですかね?
任意の行に飛ぶ時はこっちをループでまわして
得られたファイルポインタの所にseek、と。
余計なデータが無い分、ループまわすのも早そうだし。
試してないからなんとも言えないけど。
0818nobodyさん02/07/14 12:11ID:???
804です。
大して技術も基礎もなってないのに
しかもperlで高速化とか言ってるのは
よく思われないみたいなので、もう言うのやめようと思ったのですが
高速化遊戯さんがレス下さってるので、書きます。

別ファイルだと、結局そのファイルを何らかの形で取り込まないといけないです。
while (<FILEHANDLE>){}が遅いのってベンチとってないから
断言できないですけど、ファイルの大きさうんぬんより
perlの持ってるファイルから一行取り出すための作業が
遅いんじゃないかと思ってます。(憶測で物言ってすみません)

それだったら、もとのファイルの各行にインデックスつけた
データ形式にして、
もしそれが数千行とかあるファイルだったらですけど
いくらかずつseekさせて、インデックスを拾い読みして
目次見たいの作って、任意の行を拾うときは、
その目次見て近そうなとこから探すほうがいいかと思いました。

つづく、、
0819nobodyさん02/07/14 12:19ID:???
俺はデータファイルの頭に、100行毎にファイルポインタ記録してるよ
ここみたいなBBSで、一応10000レスをリミットにしてるから
9桁(ファイルポインタ)×100 = 1KB程度がインデックスに使われてる

その代わり読み込み時の落ち込みは少ない
レス5850を読む、なら5800行目のfpを探してseek
そこから普通に行処理するだけだから。

後はファイルのお尻〜行を読むtailみたいメソッドを書いてる位。
perlで低レベルの関数使うのは面倒だから、どうしても行読み出しで
グルグルしがちだけど
工夫すれば極端なパフォーマンス低下は防げると思うよ
0820nobodyさん02/07/14 12:22ID:???
お、今書いてるのか ⊂(´ー`⊂⌒ヽつ

>perlの持ってるファイルから一行取り出すための作業が
>遅いんじゃないかと思ってます。(憶測で物言ってすみません)

俺もそう思う。テストした訳じゃ無いけど
sysreadでバイト読みする方がずっと早いと思うよ。
だからと言って、Cでもperlでも低レベルの関数はそれなりに
使い辛い訳で・・・
0821nobodyさん02/07/14 12:23ID:vNhQYRiQ
最初、そういうのを考えたのですが
もうログの形式を変えたくなかったのでやめました。

それにせいぜい1000行前後なので直接改行の数を数えることにしました。
それで書いたルーチンが次のようなものです。
(勉強中なのでおかしいとこあると思いますけど、、、)

sub pick {
  my $fh = shift;
  my $hit = shift;
  my $bufsize = 4096;
  my ( $per, $buf, $line, $prev );
  seek( $fh, 0, 0 );
  binmode $fh;
  while ( sysread $fh, $buf, $bufsize ) {
    $prev = $line;
    $line += ( $buf =~ tr/\n// );
    last if $line >= $hit;
    $per++;
  }
  my $over = $hit - $prev;
  $buf =~ /(^([^\x0D\x0A]*\x0D?\x0A?){$over})/;
  seek( $fh, $per * $bufsize + length($1), 0 );
}

これでベンチとってみたらびっくりするくらい早かったです。
一行ずつかぞえるのの、15倍くらいの速さでした。
数千行あるようなファイルをいくつもまわす場合は明らかに
体感できるくらいの差がでました。
それで嬉しくて調子のって使っちゃったです・・・

でも良くないようなので、他の方法探してみます。
(FreeBSDだけなのかな?、ダメなのは)
0822nobodyさん02/07/14 12:32ID:???
>>821
最近コード書いてないんで殆ど忘れちゃったんだけど
俺も>>809さんの言うとおりだと思う
Cで速度を求めてfgetsからreadにした時に、そう言う問題に嵌った事有るよ
良く覚えて無いんだけど、結局は低レベルと高レベルの読み込み関数を
併用したのが間違いだったと思う
0823nobodyさん02/07/14 12:38ID:vNhQYRiQ
>俺はデータファイルの頭に、100行毎にファイルポインタ記録してるよ

うわぁ、それスマートです;;
とても勉強になります。
今作ってるのはもう固まってきちゃってるので
大きいバージョンUPの時にでもそういう手法でやってみます。
いぱーいレスつけられますもんね〜

>perlで低レベルの関数使うのは面倒だから、どうしても行読み出しで
>グルグルしがちだけど

うんうん。地が貧乏性なので、配列にごっそりとかぐるぐるとか
なんか疑問に思っちゃって。

いろんなBBSのスクリプト見たりあさったりしたんですけど
意外と、みんなぐるぐるで、グルグルでいいんかよ〜って思ってたんです。
だからこういう具体的な工夫例聞けてとてもやる気でました。
0824nobodyさん02/07/14 12:40ID:???
と言う訳で819の方法は我ながらお勧めなんだけどなあ(w
ログのコンバータ書いた方が後々苦労しない気もしないでもない。
これだとシステムよりの関数は一切使ってないから
つーか1000行程度ならぶん回しても問題無いんじゃない?
0825nobodyさん02/07/14 12:41ID:???
優良スレ認定
0826nobodyさん02/07/14 12:42ID:vNhQYRiQ
問題の解決の糸口については、皆さんのアドバイスのおかげで
つかめてきたのでこれから色々その線でしらべて見ようと思います。
0827nobodyさん02/07/14 12:45ID:???
わはは頑張って下さい、
〜〜する清原みたいなバカスレが再現出来ると結構嬉しいもんです(・∀・)
0828nobodyさん02/07/14 14:31ID:ZiG6NcZV
perl初心者ですが、よろしくお願いしますです。
現在、赤帽7.2の上にRPMとして乗っかっているPerlのバージョンは、5.6なのですが、
ある既製のPerlスクリプトを使いたいのです。
そのPerlスクリプトは、Linux上でJperlを必要としているのですが、
私が探した範囲では、Linux用のJperlのパッチは、5.005ベースのものしかありません。
パッチをあてようとしてもうまくあたりません。

この、Jperlを必要としているPerlスクリプトをLinux上で動かすには、
どのような解決策があるのでしょうか。どなたか、よろしくお願いしますです。
0829nobodyさん02/07/14 14:33ID:???
なぜjperlが必要なのか調べ、jcode,pl、Jcode.pmにその個所を置き換える。
0830nobodyさん02/07/14 15:00ID:xUfIRkak
>>828
Jperlを必要とする既製スクリプトってたいしたことなさそうだから、
一から自分でコーディングしてみては?
0831nobodyさん02/07/14 15:29ID:ZiG6NcZV
>>829
>>830さん
レスありがとうございます。確かに、その通りなんですが、
1>そのスクリプトが200KBほどある
2>日本語の文章の構造解析のスクリプトなので、日本語処理がチョット複雑
3>あくまでもテストとして、ちょっと動かしてみたいだけなので、できるだけ手間を
かけたくない
という理由で、Perl5.005のソースをDLして、それにパッチを当てようと思っていた
のですが、Perl5.005のソースがなんか見当たらないのです。
0832nobodyさん02/07/14 15:52ID:???
> Perl5.005のソースがなんか見当たらないのです。

簡単に見つかる予感。
083383102/07/14 16:00ID:ZiG6NcZV
>>832
ググルで、"perl5.005 src"で見つけました。
すんませぬ。"perl5.005 source"とか”rpm"とかで検索していたオラが
間抜けでした。逝ってきます。
Perl暦2日なんで、許してやってくだされ。
0834nobodyさん02/07/14 19:04ID:???
sysopenに使うパラメータとかなんだけど、

O_RDONLY = 0
O_WRONLY = 1
O_O_RDWR = 2

とかは分かってるけど

O_APPENDとかは?
検索してもヒットせず…
おしえてくらはい
0835nobodyさん02/07/14 20:53ID:???
>>834 追記以上の説明が必要なん?
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/open.2.html
大体こんな所でしょ
0836nobodyさん02/07/14 21:01ID:???
ああ、割り当てられてる番号か
それって歴史的に環境依存だから0.1位しか信用出来ないよ?
0837二つ目のお気に入りとして使って02/07/14 23:31ID:gWk8eFjt
今までに無かったrink集です。ナビ
ゲーションリンク機能を使って右フ
レームにリンク先をさくさく表示。
今までのリンク集のようにいちいち
戻らなければならないなんてことは
ありません。

http://home9.highway.ne.jp/cym10262/
0838nobodyさん02/07/15 00:06ID:???
ファイルのコピーってどうやれば出来ますか?
元ファイル開いてメモリに読み込んで別ファイルに書き出すじゃメンドイし
どの環境でも使える方法でなんか一発でする方法ないですか?
0839 02/07/15 00:09ID:???
>>838
copy a b
0840nobodyさん02/07/15 00:18ID:???
>>838
Perl5なら以下で出来る。

use File::Copy;
copy("file1", "file2");
084183802/07/15 00:24ID:???
>>840
有難うございます、上手く出来ました。

>>439
やってないけどそれだと多分エラーです。
0842 02/07/15 00:25ID:???
>>841は>>439のなにがエラーなんだ?
084383802/07/15 00:32ID:???
>>842
やってみたらやっぱりエラーが出ました。

String found where operator expected at test.cgi line 1, near
(Do you need to predeclare copy?)
syntax error at test.cgi line 1, near "copy "a.txt""
String found where operator expected at test.cgi line 1, near
(Missing operator before "b.txt"?)
Execution of test.cgi aborted due to compilation errors.
0844 02/07/15 00:36ID:???
>>843

>>439は絶対やっちゃダメだぞ。
犯罪だからな。エラー云々以前の話だ。
がんがれよ。
0845nobodyさん02/07/15 00:41ID:???
>>843 通報すますた
084683802/07/15 00:54ID:???
>>844
マジですか、っても明らかにおかしいのでローカルでしかやってませんが。
今後気をつけます。
0847nobodyさん02/07/15 07:25ID:???
もし$dataに&もしくは=のどちらか一方でも含まれていなかった場合は終了する
という場合は

if(($data !~ /&/) || ($data !~ /=/)) {exit;}

こうでいいんでしょうか?
0848nobodyさん02/07/15 07:59ID:Gdw1y7VE
exit unless $data =~ /[&=]/;

私も初心者だから違うかもしれないけど
0849nobodyさん02/07/15 09:00ID:AMXAGLXX
>>847
聞くより試した方が早いだろうに。

exit if(index($data,'&') == -1 || index($data,'=') == -1);
こっちのが数倍軽い。美しくは無いが。
0850nobodyさん02/07/15 09:42ID:???
>>847
exit unless $data =~ tr/&=//;

0851nobodyさん02/07/15 12:21ID:???
Active Perl 5.6.1.633 きたね。
0852nobodyさん02/07/15 12:44ID:???
htmlファイル上のフォームからCGIへ値を送信して、その結果を新しいウィンドウを開いて表示させたいんですが、
全くもってうまく動きません。
具体的にもうしますと、最近サイトのトップページでよく見かけるようなミニアンケートを作りたいんですが、
ラジオボタンで選択した値などが、まったく送信されてないみたいなんですが、
htmlファイル上のフォームから、別ファイルのCGIへ値を送信する場合なにか特別なことが必要なのでしょうか?
0853nobodyさん02/07/15 13:03ID:???
フォーム の html : これに送信するパラメータの名前や値がかいてある
↓
送信ボタン押す
↓
ブラウザが、指定されたメソッドに従ってパラメータの名前や値をまとめる
そして cgi に送信
↓
cgi でそれを受け取る
↓
受け取ったのはまとまらさってるので
パラメータの名前や値に分解しなければなりません
↓
分解した
↓
色んな処理
↓
処理が終わったから新しい画面を表示させよう、
表示させるにはブラウザにhtmlを送ります(正確には他にも必要)
↓
cgi からおくらさってきた〜〜
↓
ブラウザに表示

どこでコケてる?
0854nobodyさん02/07/15 13:18ID:???
>>853
たぶん、

ブラウザが、指定されたメソッドに従ってパラメータの名前や値をまとめる
そして cgi に送信
↓
cgi でそれを受け取る

あたりでこけてる気がするのですが、
<input type="hidden" name="mode" value="vote">
をフォーム内に記述して、
if($param{mode} eq 'vote'){
 簡単な処理
}
としてみても、「簡単な処理」を一切してくれないので、値を送信しないでCGIを起動だけしてる感じです。
$param{mode}が空の時は、投票結果表示の処理をさせてるので、新規ウィンドウに投票結果が反映されていない
グラフがむなしく表示されています。

なにがいけないんだろ。。。。。。
0855nobodyさん02/07/15 13:29ID:???
データ受け取ってねーよ(^^;
この処理がやってないぞ。定型。

local($pair,$buffer);
if($ENV{'REQUEST_METHOD'} eq 'POST'){
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}elsif($ENV{'REQUEST_METHOD'} eq 'GET'){
$buffer = $ENV{'QUERY_STRING'};
}
local(@pairs) = split(/&/,$buffer);
foreach $pair(@pairs){
local($name,$value) = split(/=/,$pair);
$FORM{$name} = $value;
}
0856nobodyさん02/07/15 13:30ID:???
その $param{mode} はどやって取得してるんです?
0857nobodyさん02/07/15 13:50ID:???
>>855
すいません、書き忘れてましたが、データを受け取る処理も書き記しております。
頂いたレスを見ますかぎり、CGI→同じCGIのデータの受け渡しと、特に変わらない処理でデータを受け取れる
ということなのでしょうか。
0858nobodyさん02/07/15 14:02ID:???
データ受け取りはPOSTかGETが主流だから特に変わりはないはずだよ。
0859nobodyさん02/07/15 14:25ID:???
>854
$param{'mode'}にしたら直ったりは?
0860nobodyさん02/07/15 14:31ID:???
>>859
俺もいつも ' とか省いてるけど性情に動く
0861nobodyさん02/07/15 14:33ID:???
$param{mode}
$param{'mode'}
$param{"mode"}

どれでも変わらんよ。
0862nobodyさん02/07/15 14:51ID:???
>860-861
Perlのバージョンに影響されない?
0863 ◆JAPH9PWA 02/07/15 15:29ID:???
>>862
Perl4ならクォートは必須だけど、今更4との互換性を考える必要は無いと思う。

0864nobodyさん02/07/15 15:59ID:???
>863
悪かったな!
漏れのプロバのスペースがPerl4なんだYo!(涙ッシュ
0865nobodyさん02/07/15 17:20ID:???
Tripodでエンドレスバトルやりたいんだけど設置した後404エラーが出てできない・・・
設置方法が悪いのかな?それとも対応してないとか?
0866nobodyさん02/07/15 17:20ID:???
URL間違えているだけ。
086786502/07/15 17:21ID:XqyW9sRL
>>866
俺?
086886502/07/15 17:22ID:XqyW9sRL
404じゃなかった403だ
086986502/07/15 17:27ID:XqyW9sRL
URLは間違えてないと思うんだけど
0870nobodyさん02/07/15 17:29ID:???
403 アクセス不可
0871nobodyさん02/07/15 17:30ID:Zf9qVko0
>>865
http://cgi.tripod.co.jp/
087286502/07/15 17:59ID:XqyW9sRL
indexけしてからcgi-binはいってみたけどそれすら403ではいれん
0873nobodyさん02/07/15 18:13ID:???
Perlスクリプ�dをEXEに変換する、Perl2EXEっての落としたけどどうやって使うの?
0874すいません。。。02/07/15 19:01ID:GXUWDI7H
自作Perlのテストをローカルでやるために
Quid Pro Quo 2.1.2が欲しいんです。
http://www.socialeng.com/html/download.html
で落とせると聞いたのですが、一向につながらない・・・
ここ以外では配付とかされていないんでしょうか??
よろしくおながいします。
ちなみにMacintosh用です。 
0875nobodyさん02/07/15 19:06ID:???
Mac板のこんなソフト探してます、
とかのスレの方がふさわしくない?
0876nobodyさん02/07/15 19:25ID:/pkMmlTE
クエリーで送信された値が、エレメントの順番どおりに
配列に入らないのですけれど、どこが変か教えて下さい。
htmlの部分↓
ーーーーーーーーーーーーーーーーーー
<form method="get" action="hoge.cgi">
<input type="text" name="E0" size="4" istyle="4" maxlength="4">年</input><br>
<input type="text" name="E1" size="2" istyle="4" maxlength="2">月</input><br>
<input type="text" name="E2" size="2" istyle="4" maxlength="2">日</input><br>
<input type=radio name="E3" value=1 CHECKED>男<br>
<input type=radio name="E3" value=2>女<br>
<input type="submit" value="押す">
<hr>
</form>

cgiの部分↓
ーーーーーーーーーーーーーーーーーー
$buffer = $ENV{"QUERY_STRING"};
@buf = split( /&/ , $buffer );

foreach $data ( @buf ){
( $name , $value ) = split( /=/ , $data );
$FORM{$name} = $value;
@list = values %FORM;
};

print"list[0] $list[0]<br>\n";
print"list[1] $list[1]<br>\n";
print"list[2] $list[2]<br>\n";
print"list[3] $list[3]<br>\n";

これをやってみるとこんなふう↓になります
ーーーーーーーーーーーーーーーーーーー
list[0] E3の値
list[1] E0の値
list[2] E1の値
list[3] E2の値
0877nobodyさん02/07/15 19:27ID:???
受け取ったデータをなぜ
@list = values %FORM;
するのかわからん。
0878すいません。。。02/07/15 19:43ID:GXUWDI7H
>>875
逝って来ま。
087987602/07/15 19:46ID:???
>>877さん←神
分かりました〜♪ありがとうございます。

$buffer = $ENV{"QUERY_STRING"};
@buf = split( /&/ , $buffer );

foreach $data ( @buf ){
( $name , $value ) = split( /=/ , $data );
$FORM{$name} = $value;
};
print"FORM[0] $FORM{E0}<br>\n";
print"FORM[1] $FORM{E1}<br>\n";
print"EORM[2] $FORM{E2}<br>\n";
print"FORM[3] $FORM{E3}<br>\n";
0880nobodyさん02/07/15 21:25ID:???
見栄えをよくするために行頭にはタブを入れてるんですが

     print <<"HTML"

     <html><body>〜略〜</body></html>

     HTML

とやりたいんですがこれだとエラーになります。
タブを入れたまま動くようにするにはどうしたらいいでしょうか?

あとタブを入れてないと動くのですがその中に<a href="mailto:[email protected]">xxx</a>

があるとエラーになります。どうしてなのでしょうか?
0881nobodyさん02/07/15 21:28ID:???
>print <<"HTML"
 ; が入ってないけど、動くの?

>href="mailto:[email protected]">xxx</a>
\でエスケープしたら?
href=\"mailto:aaaa\@hotmail.com\">xxx</a>
0882 ◆Smt8k/ss 02/07/15 21:29ID:wkNqkF1j
    print <<"    HTML";
    <html><body>〜略〜</body></html>
    HTML
0883nobodyさん02/07/15 22:32ID:h7+zOLje
>>882

一応動いたんですがもうちょっと見栄えがいいやり方無いでしょうか?
0884nobodyさん02/07/16 00:48ID:???
print qq~
<html><body>〜略〜</body></html>
~;

@はエスケープしる
0885nobodyさん02/07/16 02:17ID:???
質問よろしいでしょうか?
ダイス機能付きのチャットを作っているのですが、どうにもrand関数の値が偏ります。
3D6(6面ダイス3個の判定)の場合、1個目の数字が連続で同じ数字になります。
試しにWeb上にアップして試した所、そっちでは3個目の数字が連続で同じ数字になりました。
これはrand関数において仕方のないことなのでしょうか?
もし解決策などがあるのでしたらご教授いただけると嬉しく思います。

以下はダイスロール部分のソースです。

# $in{'dice_any'}にダイスの数、$in{'dice'}に何面ダイスかの情報が入ってくる。

srand(time);
$dice_roll = qq(<br><b><font color=0000FF>$in{'dice_any'}D$in{'dice'} ダイス判定</font></b> <font color=0066FF>);
$dice_all = 0; # ダイスの出目の合計用の変数
$plus = "";
while($in{'dice_any'} > 0){# ダイスの数が尽きるまで
  $dice = int(rand($in{'dice'})) + 1;
  $dice_roll .= qq($plus$dice );
  $dice_all += $dice;
  $in{'dice_any'}--;
  $plus = "+ ";
}
if($dice != $dice_all){# ダイスが2個以上なら
  $dice_roll .= qq( = <b>$dice_all</b>); # 合計値表示
}
$dice_roll .= qq(</font> );

# この後$dice_rollをログに保存

どなたかよろしくお願いします。
0886nobodyさん02/07/16 03:00ID:???
srandするな
088788502/07/16 03:07ID:???
使うサーバーがPerl4なんです・・・。
0888nobodyさん02/07/16 03:09ID:1NQx5kwR
root--test.pl
|
|-folder1
|-main.cgi

このようなファイル構造なんですが
main.cgiからtest.plを参照することは可能なんですか・・?
088988702/07/16 03:13ID:1NQx5kwR
>>888
ずれてる自己レス・・・
root にtest.plが有って
folder1にmain.cgiが有る状態です

つまり下位のファイルに参照できるかどうかと言うのが疑問なのです・・・
0890nobodyさん02/07/16 04:53ID:???
絶対パスで指定しませう。
require '/home/mona/public_html/test.pl';
大体こんな感じ。鯖でちがう。
0891nobodyさん02/07/16 06:01ID:???
PerlとかでWEBページを所得する
ソケットプログラム書くときサーバからのレスポンス(OK 200とか)がうざいんですが
これを消す方法ってないんですか?
089288702/07/16 06:35ID:1NQx5kwR
>>890
winだと相対パス行けるのですが
いざUPするとできません・・・
相対的にはこんな感じで
../member/data/point.pl
絶対的には
/home/as***/public_html/*****/cgi-bin/member/data/point.pl
こんな風なのですが・・・
0893 ◆JAPH9PWA 02/07/16 08:49ID:???
>>891
HTTPを使う限り、それを消す方法は無いよ。
単に無視するだけなら可能だけどね。
その場合は最初の空行までを読み飛ばせば良い。

>>892
パーミッションがあれば、相対でも絶対でもいけると思うけど。
0894nobodyさん02/07/16 08:49ID:???
相対パスのときカレントより上のディレクトリは指定できない設定なんでしょ。
089585202/07/16 09:20ID:mWVjtM4S
未だに同じ問題で悩んでいる852です。

送信ボタンに、onMouseUPで新規ウィンドウを開き、そこにデータを受け取った後の結果を表示させるようにCGIにリンクさせてるんですが、
そのjavascriptをいれてると、データが送信されてないみたいです。

試しに投票フォームと同じウィンドウ上で結果を表示させると、うまくいきました。

submitボタンにビヘイビアを仕込むとダメなんでしょうか?
0896ぽよぽようんこ(本物)02/07/16 13:47ID:???
悩んでる内容も内容なら、説明も下手、キミには向いてないそれだけのこと。
■ このスレッドは過去ログ倉庫に格納されています