1 :
nobodyさん :
03/02/09 00:24 ID:s0tpWWxg
2 :
nobodyさん :03/02/09 00:25 ID:s0tpWWxg
3 :
nobodyさん :03/02/09 00:25 ID:BxWrsuOv
4!
6 :
1 :03/02/09 00:26 ID:???
うげ part20 だった・・・
荒らしみたい・・・
前スレの
>>992 lynx -sourceとかwget -q0をパイプしてopenして、
目的地までseekして、必要分read。
スレ建て乙
Perlのプログラムで、何かのデータを書き出したい時に、 テンポラリファイルを作ってそこにデータを書き込んでからrenameして、実際のデータファイルとする、 という作業がありますが、 この作業はSDBMなどのデータベースを扱っている場合でもすべきでしょうか?
これは間違ってる?? if unless while foreach for は制御構文 my our local return use require sub はキーワード time localtime substr split join は関数
あ、よく考えたらuse requireは、普通に関数だな。
next lastは、キーワード? 困った。わけわからん。
前スレ
>>994 それでOKだよ。
my宣言する変数は基本的にすべて () でくくっておけば問題ない。
(ただし初期化したいときだけは注意)
<input type="file"> で送ってもらったテキストデータの中身を 変数に代入したいんですがどうすればいいですか? アップローダーとか参考にしたら、保存してしまうので あまり参考にはならないのですが… よろしくお願いします。
悪いこと言わないからやめときなさい。
23 :
nobodyさん :03/02/09 08:59 ID:BDYUFdWT
カート作ってるんですが、
<FORM METHOD="POST" ACTION="./cart.cgi" target="top">
てな感じでフレームで分割してかごの中身を表示したいのですが、
単体だとうまく動くのに、フレーム内だと、データを渡せないのか
確認画面でかごの中身が空になってしまいます。
ttp://openlab.ring.gr.jp/k16/htmllint/htmllintl.html ↑では、
<FORM> の属性 `TARGET` はあまり薦められない属性です。
と言われてしまいました。なんとかフレーム分割したいのですが・・・。
よろしくお願いします。
>>23 JavaScriptを併用する
と言ってみる
>>23 フレームセットのファイルをA、フレーム内のファイルをB,Cとすると、
action="A" target="_top" として、まずAが変数を受け取って
B,Cに変数を渡す下準備をする。もちろんAはCGIでなくてはならない。
Aは、B,Cを frame src="B?変数名=変数" てな感じで呼び出す。
B,Cはそれぞれ渡された変数を元に画面表示する。
>>24 がいうようにJavaScriptやcookie使った方がいいだろうなぁ・・・
>25 トリップ機能のある掲示板のソース研究すれば? 配布してるのでもあるよ。検索してみれ。
29 :
23 :03/02/09 17:10 ID:XYLtLJwJ
ありがとうございます。 cookie使ってるんで、そのへんかなぁ・・・?
>>23 スレ違いっぽいけど、、
どんな形でデータの受け渡しが行われるかの
情報が無いのでなんとも言えません。
another-htmllintのあまり薦められない属性は、
loose.dtdで書いている限り無視で構いません。
>>25 トリップなんて好きな所に埋め込めばいい。
どうしてもというなら、キャップ処理の前後。
>>30 トリップ処理の方の$inを$FORMに変えて入れてみたらざなぜかエラーに
ブラウザにエラー行返して見たらトリップ機能の2行目でエラーらしいんですよ。
なぜでしょうか?
>>31 「エラーになった」だけじゃ分からんよ。
エラーの内容を一字一句もらさず書いてくれ。
34 :
nobodyさん :03/02/09 18:18 ID:+X3kwgjb
日本語検索は()←半角括弧が使えないのでしょうか? $TEST = '(テスト)'; これをeucに変換して検索してもうまくいきません。
>>34 日本語検索って、具体的にどうやったの?
eucへの変換はどうやったの?
どううまくいかないの?エラーが出る?結果が変?
>>33 それは謎。とりあえず、
397行 my $trip;
406行 foreach my $key ('FROM', 'MESSAGE', 'mail') {
に変更。
>>33 398行 $FORM{'FROM'} =~ s/\◆/\◇/g;
もしかして、これで回避できるかも。
>>37 うちでその行だけテストしてみたけど、普通に置換できるんだよね。
なんでだろう。ソースの文字コードが違うのかな。
もしだめなら、これでどうだ。やってることは一緒。
$FORM{'FROM'} =~ s/\x81\x9f/\x81\x9e/g;
おかげさまでなんとかトリップ機能が動きました。
でもまだ問題があってindexを開いた際にクッキー情報の名前もトリップ変換してしまい名前欄を
はみだしてしまいます。
396行の名無しさん処理のunless()のあとelse{}で398行〜425行のトリップ処理を加えました。
これを何行目あたりに入れることでこのバグを回避できますか?
自分でも悩んでるんですどうも全体の流れがつかめないもので・・
こちらでソースは更新しました。
http://hon7.hp.infoseek.co.jp/cgi-bin/test/bbs3.txt よろしくお願いします
あれ?誤爆ですた。すんません
2chのようなID制を作成したいんですが、どういった仕組みで動かせばいいんでしょうか? 自分なりに 1、 210.135.129.41 を点ごとに4つに分解 2、分解した後ろ3つと日付を掛ける [135] * [129] * [41] * [day] 3、数字からひたすらアルファベットに置き換える としているんですが、全くランダム制がなく困っています
>>42 2chだってランダム性は少なくてクラウンで同一の串なら同じIDだったような
>>42 IPを8ケタの16進数にして、日付を種(SALT)にしてcrypt、ってのはどうか。
>>43 あのね、クラウンは日付を種にしてないだけなの。
他の鯖は日付ごとに変わるでしょう?
crypt試してみました どうやら先頭2文字がsaltそのままみたいですね とりあえず、先頭の文字だけ切って表示するようにしときます
掲示板を作ってるんですが質問があります。 書き込みボタン押して本文が無かったらリロードというのをしたいです。 どうもうまくいかないみたいで・・・ ご教授お願いします。
>>47 どううまくいかないの?
上のほうにもあるけど、「うまくいかない」だけじゃわかんないよ。
どうなるか必ず書くこと。エラーメッセージもあれば書くこと。
if ($honbun eq "" ) { print "リロードタグ"}
しかし、データベースファイルに テンポラリファイルを使うのはいかがなものかと。
53 :
50 :03/02/10 04:35 ID:lunjJQvX
>>51 さんのように
SDBMをファイルロックで包む例はよくあるんだけど、
>>52 さんの言うように
テンポラリファイルを使う例があまりないみたいなので質問してみたんですが、
どうなんでしょうかね?
ファイルロックが完璧ならばテンポラリファイルを使う必要もないと思うんですが。
テンポラリファイル必要なしに同意です。 flockが不安定または使えない場合は、 symlinkとかmkdirの擬似的なロックでもいいと思います。 DBM処理系によっては複数のファイルを作成したりしますので、 テンポラリは結構面倒かもしれません。
55 :
超初心者 :03/02/10 11:47 ID:MIMhYBnE
カウンターを作っていますがうまく行きません。 トータル・今日・昨日をカウントさせたいのですが、 昨日・今日が上手くカウントしてくれないです。
56 :
超初心者 :03/02/10 11:48 ID:MIMhYBnE
#!/usr/bin/perl print "Content-type: text/html\n\n"; $logfile = './1.txt'; $ENV{'TZ'} = "JST-9"; $mday = (localtime(time))[3]; open(IN,"$logfile"); $coall =<IN>; $cotod =<IN>; $coyes =<IN>; $day =<IN>; close(IN); chop $coall; $coall++; if($mday != $day){ $coyes = $cotod; $cotod = "0"; $day = $mday; } chop $cotod; $cotod++; open(OUT,">$logfile"); print OUT "$coall\n"; print OUT "$cotod\n"; print OUT "$coyes\n"; print OUT "$day\n"; close(OUT); print <<"HTML"; 累計$coall人<BR>今日$cotod人<BR>昨日$coyes人 HTML
>>56 改行の扱い方が悪し。
とりあえず下記の変更でも動くけれど、良くないね。全体的に見直すべし。
close(IN);
chop $coall;
chop $cotod;
chop $coyes;
chop $day;
$coall++;
if($mday != $day){
$coyes = $cotod;
$cotod = "0";
$day = $mday;
}
#chop $cotod;
58 :
超初心者 :03/02/10 14:42 ID:MIMhYBnE
>>57 さん
有難う御座いました。勉強になりました。
遅レスだしもう解決したみたいだけど、
>>33 Unrecognized character \x81 と来たときには全角スペースがないか疑え。
(全角スペースはシフトJISで\x81\x40)
60 :
nobodyさん :03/02/10 22:57 ID:0mJjU+k6
61 :
↓新語 :03/02/10 22:59 ID:???
”Webフォルダ”
彼方此方カキコするのはヤメレ
Webフォルダってのはアレですか? 自分のパソコンの中に作った「Web」っていう名前のフォルダですか?
>>64 なるほど。勉強になった。サンクスコ
Perlと何の関係が……
67 :
:03/02/11 04:31 ID:???
68 :
nobodyさん :03/02/11 12:23 ID:1RQcCB3w
クッキーについて質問です。
掲示板を作っていて、
名前とメール部分のクッキーの設定は上手く行ったんですけど、
URL欄のクッキー情報が上手く保存されません。
調べてみたら、
http:のコロンが原因だとかなんとか ・・・?
どう対処したら良いのか教えて下さい。。
適当にエンコードしてみる。
www.2ch.net/hoge::hoge.html
ぜんぜんperlと関係ないし。
テキストファイルに ------------- aaa,bbb,ccc ddd,eee,fff ggg,hhh,iii ------------- とあったとして、真ん中の行のみ書き換えるにはどうしたらいいんでしょう? 私のIQでは思いつきません
IQのことを考えるからできないのです。 こころの眼でみるのです。
75 :
行頭じゃなくてもソートできるの? :03/02/11 15:22 ID:QuXhKMT3
ふりがな,名前,郵便番号,住所 の列からなるCSVファイルを読み込んで 2番目以降の列(例えば名前の列)でSortしなおすことはできますか? もしかして順番変えたテンポラリファイルを作らないとダメですか?
76 :
nobodyさん :03/02/11 15:27 ID:mp4tOM/v
cgiなどのファイルの記述で自分で初期設定する変数を $set{top_path} = '../'; のように%setのハッシュにしてるのですが こういうのって格好悪いですか?
>>73 一度全て読み込み、書き換えてから書き戻すしかないね。
>>75 テンポラリファイルなんて使わなくてもできるよ。
データが巨大ならデータベースを使った方がいいと思うけどね。
>>76 格好はどうでもいいけど、
要素名のタイプミスをするとすぐ発見できないのが面倒かもね。
あと、若干だけど効率も悪いかな。
>>75 名前の列でソートするならこんな感じ。
データが多いとちょっと重いかもしれないが。
@hoge = sort { (split(/,/, $a))[1] cmp (split(/,/, $b))[1] } @hoge;
>>76 自分は最近それと似た方法で定数を記述してる。
my %const = {
HOGE => '../',
HUGA => 100
};
こんな感じで。
まあ、確かに効率は悪いけど、見た目がきれいだし、定数だというのが
はっきり分かるから。
>>78 どのバージョンにもつかえるわけないけど、
use constant {
HOGE => ’../’,
HUGA => 100,
};
とか書くのが美しくて速いと思う(インライン化されるから)
{} ではなくて ()
>>79 use constant は便利なんだけど、文字列の中では展開されないよね。
これさえなければもっと積極的に使いたいのだけど。
ファイルを読み書きするときのflockに関する記述として以下は正しいでしょうか? open(OUT, "+<aaa.txt"); flock(OUT, 2); print OUT "略"; close(OUT);
seekでファイルの末尾に移動してから書き込む。
84 :
75 :03/02/11 20:10 ID:???
>>81 use constant PI => 4 * atan2 (1, 1);
print "The value of PI is @{[ PI ]}.\n";
>>85 おお、そんな使い方ができたなんて初めて知ったYO!
今までconstantはコンパイル時に展開されるもんだと思い込んでた。
こんどから積極的に使ってみます。マリガトー
ちなみに、 use constant NOBODY => 774; は sub NOBODY { 774 } ってするのと同じ。(constant.pm 参照)
88 :
nobodyさん :03/02/12 00:34 ID:9lI7mE1F
質問です。 $a = "aaaaaabababanfjfggkrwaafrwnlwa"; 例えば$aの中に「a」と言う文字が何回現れるか数えられる関数はありますか?
$count = $str =~ tr/a//;
>>89 その回答からすると関数は無さそうですね。
>>85 print "The value of PI is ${\PI}.\n";
これじゃだめ?
>>86 print "The value of PI is @{[ PI ]}.\n";はconstant.pmの
中に書いてあるのをコピペしただけ。まあ、ドキュメントを
読みましょ!って事ッス。何故そうなるか?はperlrefを
見ましょ。これも、constant.pmの中に書いてある(藁
>>92 はその応用形ってことっしょ。
echo や print で生成したフォームからは値を受け取ることは出来ないですか?
すまん perlじゃなかった
97 :
nobodyさん :03/02/12 18:49 ID:60fo1D0F
($a,$b,$c) = (0,2,0) だとそれぞれの変数に代入できるのに @{[($a,$b,$c)]}[0..2] = @{[(0,3,0)]}[0..2] だと無理なのはなぜですか? ↓みたいな感じです。 DB<10> ($a,$b,$c) = (0,2,0) DB<11> print "($a,$b,$c)" (0,2,0) DB<12> @{[($a,$b,$c)]}[0..2] = @{[(0,3,0)]}[0..2] DB<13> print "($a,$b,$c)" (0,2,0) DB<14> print @{[(0,3,0)]}[0..2] 030 DB<15> print @{[($a,$b,$c)]}[0..2] 020
($a,$b,$c) = (1,2,3); print (@{[($a,$b,$c)]}[0..2] = @{[7,8,9]}[0..2]),"\n";
>>97 []演算子は引数のコピーによる配列リファレンスを作るからだよ。
つまり
@{[ $a, $b, $c ]} = (...)
は
my @tmp = ($a, $b, $c);
@tmp = (...);
と同じことになる。
100 :
92 :03/02/12 21:34 ID:???
>>93-94 ありがとん。perlrefに
>Here's a trick for interpolating a subroutine call into a string:
> print "My sub returned @{[mysub(1,2,3)]} that time.\n";
を見つけました。
constant.pmのコードからすると、
>>87 さんの言うと通りなので、
配列にするのが礼儀正しい方法みたいですね。
@{[]}は実行効率悪いよ 普通に、 print "My sub returned" . mysub(1,2,3) . "that time.\n"; の方がいいと思う
102 :
nobodyさん :03/02/13 16:37 ID:/En01Oe5
$moji1 = '111'; $moji2 = '110'; 〜〜〜〜〜〜〜←ここの部分 $moji1 - $moji2 == 1 という風に文字列を数字に変換するにはどうしたらよいでしょうか?
質問です。 carrysun という携帯対応の掲示板(現在公開されていません)を使っています。 最近気づいたのですが、analogの結果を見ると 403エラーがたくさんでています。 access_logを見てみると、該当ディレクトリを GETしていてエラーがでています。 "GET /cgi-bin/csun/ HTTP/1.1" 403 xxx このようなエラーです。 これがちょっとうざったいので、直したいのですが、csun.cgiを見てもどこで そんなリクエストを出しているのかが掴めませんでした。 画像とかの指定かなと思ったんですが、何か調べる良い方法はありますでしょうか? #ちなみにlocalのlinuxでテストできます。 何か簡単なアドバイスでも良いのでよろしくお願いします。
>>403 /cgi-bin/csun/を代入している変数を探す。
その変数を探す。
>>103 ブラウザが勝手にルートたどったりするんじゃねーかな
関係ないかも知れんが、IEとかだとお気に入りアイコン探しまくってうざい
109 :
107 :03/02/13 16:59 ID:???
110 :
104 :03/02/13 17:03 ID:???
ワリィワリィ
>>102 何もしなくてよい。
$moji1 = '111';
$moji2 = '110';
printf("\$moji1 - \$moji2 = %d\n", $moji1 - $moji2);
>>107 設定ファイル csun2.cgi を見るとサーバのディレクトリの設定は、
$server=qq|
http://$ENV{ 'SERVER_NAME'}$ENV{'SCRIPT_NAME'}|;
これしかありません。
なので、ディレクトリを見に行くことはないはずなんですが...
画像ファイルの設定も
$pc_title_img='';
になってますが、ちゃんと処理してあって、空の場合はテキストのタイトルを
表示するようになっています。
あとは、どんな理由があるのか???
116 :
104 :03/02/13 17:31 ID:???
>>115 そのエラーがさ、cgiに原因があるとする理由は何?
>>115 # 戻り先URLを設定 --------------------------------------------------------------------- #
$pc_home ='../pc/index.html';# パソコン 用
$ez_home ='../ezweb/index.hdml';# EZweb 用
$i_home ='../imode/index.html';# i-Mode 用
$j_home ='../jsky/index.html';# J-SKY 用
$astel_home='../imode/index.html';# ドットi 用
はどうなってる。
>>116 サイトアクセス数(200 OK)の1/4が403エラー
access_logを見ると前後に必ずそのスクリプトの名前が出てくる。
/cgi-bin/csun/csun.cgi 200
/cgi-bin/csun/ 403
/cgi-bin/csun/csun.cgi 200
のような感じです。
同じ掲示板を4つ位使ってますが、どの掲示板でもエラーが出ます。
スクリプトの問題以外だとブラウザから直接ディレクトリを指定する
というのが考えられますが、それ以外に403エラーがでる理由はありますか?
>>118 多分出力されたHTMLを見ればわかる。
csun/index.htmlでも置いとけば。
cgi-binはScriptAliasされているんじゃ・・・
>>119 前に調べたのですが、異常はありませんでした。
>>120 これが一番いいかも知れません。ちょっと試してみます。
>>121 すみません。ちょっと意味がわかりません。
123 :
104 :03/02/13 17:46 ID:???
>>118 なるほど。
そういった根拠があれば何も言うことはないっす。
例えばどっかからリンクミスなURLが貼られてしまったとかだと、
バンバンリクエストが来る可能性があるもんで。
>>122 ところで、あんたはどうしたいんだ?
403でなくなればそれでいいのか? /cgi-bin/csunへのアクセスがなくなってほしいわけじゃないのか?
ところでスレ違いだぞ。CGIスレでやれよ
>>124 すみません、説明不足で。はじめに言うべきだったのかもしれません。
csun.cgiは、掲示板として正常に動いています。
ただ、analogのレポートを見たときに、あまりに403エラーが多いので、
(先ほど書いたようにサイトのアクセスの1/4)なくしたいだけです。
多分、csun.cgiにアクセスするたびにほぼ毎回403エラーが出ていると
思います。
実害が出ているというより、ただうざったいから、というのと色々スクリプト
を見てもわからないので、知的好奇心から原因を知りたくなったから、という
理由からです。
perlと全然関係ないじゃん
perlでデバッグする方法はないのでしょうか? どの行がこのGETのリクエストを出しているのかを調べる方法があるのかと思ったの ですがないですかね?
ステータスコード403はHTTP_FROBIDDEN。 アクセスログのリファラでも調べろ。 以上終了。
131 :
:03/02/14 12:58 ID:mtrOCq/2
色々アドバイスありがとうございました。 access_log の リファラをonにして調べていたところやっとわかりました。 csun2.cgi にて $background ='.'; となっており、 csun.cgi にて <BODY BGCOLOR="$bgcolor" BACKGROUND="$background" TEXT="$text" LINK="$link " VLINK="$vlink" ALINK="$alink"> となっていたためでした。 こんなことで本当に申し訳ありませんでした。 色々ありがとうございました。
やっぱり出力されたHTMLを見ればわかる事柄だったんじゃないか・・・人騒がせな。
134 :
nobodyさん :03/02/14 17:09 ID:aS0shCzv
ええと、Perlからwindowsのパス付きの共有フォルダにアクセスしたいんですが、、、 パス付きでも、実行マシンから既にアクセスしていたり(パスワードを入力済み) 実行マシンと同じID/PASSだったりすると特別めんどくさいことはないんでsuga open FILE,"\\IPアドレスとかマシン名\xxxxx"; で開けますよね。 ただ、上記の条件をみたなさな、単純にパスワードが付いてるマシンの共有フォルダに アクセスする場合、スクリプト側では、ID/PASSはもちろんしってるんですが どうすれば開けるんでしょうか?
>>134 WNetAddConnection2を叩く。これ以上は板違いだから適切な板に移ってくれ。
136 :
134 :03/02/14 19:54 ID:aS0shCzv
>>135 そのヒントから
Win32::NetResource
にたどりつきました。。。ありがとうございます。
137 :
nobodyさん :03/02/14 21:52 ID:nq8/avY5
ページ内でパスワードを入力して、 正しいパスワードが入力されたら別のURLにジャンプしたいのですが どうすればよいのでしょうか? 指定のURLにジャンプできるコマンドとかありますか?
>>137 えーっと、ここPerlスレだよね。
……そんなコマンドはない。
ムキー!!!
goto LABEL
142 :
137 :03/02/14 23:33 ID:nq8/avY5
え〜と、locationってJavascriptですよね?
ですが、Perlのなかに具体的にどのようにlocationを組みこむかが分からないです。
ちなみに、下のHTMLから入力されたものをsample.cgiでチェックして、正しい名前とパスワード
だったら別のページ(仮にwww.sample.ne.jp/ok.htm)にジャンプしたいのです。
<HTML>
<HEAD><TITLE>サンプル</TITLE></HEAD>
<FORM ACTION='
http://www.sample.ne.jp/test.cgi ' METHOD='POST'>
名前<INPUT TYPE='text' NAME='NameBox' VALUE='' SIZE='50' MAXLENGTH='50'><BR>
パスワード<INPUT TYPE='text' NAME='PassWordBox' VALUE='' SIZE='50' MAXLENGTH='50'><BR>
<INPUT TYPE='submit' NAME='write' VALUE='送信'>
<INPUT TYPE='reset' NAME='cls' VALUE='消去'>
</FORM>
</BODY>
</HTML>
>>142 HTTPヘッダーを勉強してみてください。
スレ違いなので、これくらいで。
まぁそう言わずに纏めて置こう。 他スレの皆さんにも迷惑になるので。 HTTP : header location HTML : meta refresh JavaScript : location.href こんなもんでいい?
あぁ。両方かも。HTTPとCGI
148 :
137 :03/02/15 00:00 ID:6NeqGII/
<META Http-Equiv='refresh' Content='0;URL=
http://www~ '>
で解決できました。
>>148 人の話聞けよボケ!
こういうのが一番イライラする。
このスレは以前からCGI質問にもそれなりに回答してきてたもんだから、 いまだにPerlと無関係な質問が絶えないんだよな。 まさに厨が厨を呼ぶ厨スパイラル状態。何とかならんのか。 せめて回答する側は、スレ違い質問への無視&誘導を徹底してほしいよ。
ここで取り扱う話題 1.perlのコードに関する話題 2.perlのインストールに関する話題 3.モジュール、ライブラリの話題 1はOKとして、2、3は駄目?
152 :
nobodyさん :03/02/15 01:08 ID:gnW2vWOc
最近perlを始めた超初心者なので、もしかしたら厨な質問かもしれませんがよろしくお願いします。 現在、へぼいゲームを作成していまして、その際にユーザのパラメータ(例えばHP,MP)を、 すでにあるuser[ユーザのID].datというファイルからget_userdata()で取り出したいと考えています。 その際に引数として($ユーザのID,$ユーザのパス)を渡して、それに応じて各ユーザのdatファイルから 値を取り出そうと考えているのですが、この「$ユーザのID,$ユーザのパス」をクッキーとして保存して おいて、毎回get_userdata()を使用するときにクッキー情報を読むというのは、ゲームという観点からは どうなのでしょうか?(セキュリティ面、改造など) ユーザ登録でidとpassを取得しても、次のCGIに行くとその情報が消えてしまうので 他に方法があればご教授お願いします。
っていうかよ。初心者はperlとcgiの区別つかないよ。
156 :
152 :03/02/15 01:59 ID:???
159 :
nobodyさん :03/02/15 12:51 ID:FZQxbA/5
joyful.cgiにNGキーワード制限を追加しようと思って改造してみたんだけど、エラーが出ます。 local($flags)=0;# NGキーワード追加 $s_mes = $in{'comment'}; foreach (split(/\s+/, $ng_word)) { s/\*/\.\*/g; if ($s_mes =~ /$_/i) { $flags=1; last;} } if ($flags) { &error("投稿エラーです。"); }# ここまで なにか間違ってる記述がありますか?
エラーが出ます。
>>159 文法的にはその記述は通る。みっともないけれど(w
あと、
>>160 の意味が分かるか?
ようするに何のエラーなんだよ。
で、「500 Internal Server Error と出ます」って応えたらそれ以降は放置だからな。
162 :
nobodyさん :03/02/15 16:59 ID:FZQxbA/5
>>161 どのようにエラー出ているか調べるにはどうすればいいのでしょうか。
Web上で実行させると500 ......と出る。これじゃ手かがりにはならないと言うのは分かるんですよ。
で、どのようにやれば詳細なエラーが出るのか分かれば・・・・・
164 :
nobodyさん :03/02/15 17:36 ID:FZQxbA/5
あれこれ悩んだんだけど、どうやら if ($s_mes =~ /$_/i) で、 =~ で右の方で変数を使ったらだめっぽいんですが、そうなんでしょうか? 試しに =~ /NGキー/ と文字そのままやったら行けるんですが、 =~ /$ng_word/ だと駄目と言う事はわかりました。 変数を使うにはどうすればいいのでしょうか?
166 :
nobodyさん :03/02/15 18:38 ID:nMMOQiZ6
掲示板を作っているのですが、 タグが使える 改行はbrをしなくても自動で認識 携帯対応のほうはすべて無効 同じログを取得 このような掲示板はどのようにすれば作れるのでしょうか? 考え方だけでも良いのでアドバイスお願いします。
>>166 タグをそのままに
改行コードを<BR>に置換
携帯対応の何を無効にしたいのか書かないとわからない
何と同じログを取得したいのか書かないとわからない
168 :
167 :03/02/15 18:44 ID:???
ちなみにここはPerlそのもののスレッドなんで勘違いしないように
169 :
nobodyさん :03/02/15 20:42 ID:FZQxbA/5
>>165 ご丁寧にありがとうございます。
ですが、解決しました・・・
index($in{'comment'},$ng_word).....と書く事で動きました。
質問です。 1行につき50個の数値が,で区切られてい記録されているファイルが複数あります。 中身を読み込んで100個の数値(array1,array2それぞれ50要素)配列を返すsub read を利用して数値を読み込みたいのですが、返ってくる数値のスマートな受け取り表記がわかりません。 どなたかご教授下さらないでしょうか。 ($data[0],$data[1]....$data[99]) = &read("filename"); ↑現状ではこのように書いています。 sub read{ open (IN,"<$_"); my @array1 = split(/,/,<IN>); my @array2 = split(/,/,<IN>); close (IN); return (@array1,@array2) } なお、数値はそれぞれ10回程度計算で変更されたあとファイル再び書き込まれます。
>>170 > &read("filename");
ってエラーにはならないのか。
my @data = &read_file('filename');
sub read_file{
open (IN,'<$_');
my @array = split(/,/,<IN>);
close(IN);
return (@array,@array);
}
・・・参照で返した方がいいかなぁ。
それ以前に日本語が判らんなぁ(w
172 :
169 :03/02/15 21:27 ID:???
>>171 ありがとうございました。
文字数制限に引っかかったので、文削っていくうちに
わかりづらくなってましたね。
すみません。
173 :
172 :03/02/15 21:28 ID:???
名前が169になってた…。 170です。
shift-jisだから、1024文字だね。
>175 それも違う。2048byteだ。
177 :
nobodyさん :03/02/16 01:27 ID:IEb+jUgz
もしかしたら言語の問題ではないかもしれないのですが、ここで質問させていただきます。 htmlからフォームの値をpostで送信して表示させたいのですが、 ローカル(ActivePerl、アパッチ使用)でやると対象CGIがテキストで表示され、 実際にサーバーにUPするとInternal Server Errorになります。 対象ソースの該当部分は以下のとおりです。 #!c:/perl/bin/perl require'./cgi-lib.pl'; &ReadParse(*input_data); $a = $input_data{'a'}; $b = $input_data{'b'}; $c = $input_data{'c'}; スレ違いでしたらすいません。
>>177 ローカル環境のActivePerlは使ったことないんで分からんが、
リモートサーバで、そのperlのパスではまず動かないね。
permissionも確認しれ。
あとprint "Content-type: text/html?n?n";などのヘッダの記述がない。
後は他でやれ。
#! /usr/bin/perl print "Content-type: text/html\n\n"; require './cgi-lib.pl'; &ReadParse(*input_data);
すんません、177さんと似てる問題なんで、便乗させて下さい、、、。 外のサーバで動かしてたCGIをローカルにもってきました。 ローカル環境はWin2K+Apache2+ActivePeal5.8です。 Peal自体は実行できているんですが、(カウンターや掲示版の表示) 書き込みをしようとすると、反応しなくなってしまいます。 どうもPOSTのアクションをさせようとするとこうなってしまう 様なのですが、どうにも分からなくて、、、。 考えられる原因などお分かりの方いらっしゃったら 御指導ください。 タスクマネージャーでプロセスの確認をするとperlの占有率が98% とかになってしまってるし、killしようとすると拒否されてしまいます。
181 :
177 :03/02/16 02:06 ID:IEb+jUgz
>>178 さっきのは一部なので当然下のほうにはヘッダ記述等あります。
もちろんサーバーにあげる際はperlのパスは変えてます。
以下、さっきの残りです。
$c = $input_data{'c'};(ここまでは177の分)
print "Content-type: text/html\n\n";
print "<html>\n";
print "<body>\n";
print "$a&$b&$c<br>\n";
print "</body>\n";
print "</html>\n";
>>181 小出しすんなや、ヴォケ
じゃーコードには問題無いつーことで、スレ違い。
エラーログでも見るんだな。
184 :
nobodyさん :03/02/16 02:31 ID:0jPHodHR
mailto:のbodyの中で+を書いてもメーラーでは に置き換えられてしまいます。 どうすればよいでつか?
>>180 取りあえず
sudo kill -9
winで使えない関数とかなかったけ?flockとか...
perl5.8で動くように書かれてるの?
自分で書いたのじゃなければ、作者にフィードバックすれ。
んで、スレ違い。
186 :
:03/02/16 02:43 ID:ah8+t8Vm
>>177 cgi自体ちゃんと動いてるの?
#! /usr/bin/perl
print "Content-type: text/html\n\n";
print "ok \n";
は表示される?
これは
>>185 少なくともwindows2000ならサポートしている。
Linuxなんかのflockとは挙動が違うみたいだけど
それにしてもPerlをPealと書くやつが多いな
189 :
180 :03/02/16 02:59 ID:???
早速のレス感謝です。
>Peal
逝ってきます。
>>185 たしかに自分でかいたものではないので(書けません、、、泣)
ひとます、perlのヴァージョンの線で考えてみる事にします。
>>187 他のflock使っているcgiが動いているので、
ご指摘のとおりやはり違う問題のようです。
flockのような関数が他にあるといった事はないでしょうか?
winNT系はflock大丈夫だけど、symlinkがだめ。 ファイルロックで使われてる。
191 :
180 :03/02/16 03:30 ID:???
今、別のCGIでPOSTするものを実行してみた所 先程質問させてもらったループのような症状にはならないものの やはり書き込みが出来なかったので、もしかしたら ApacheやWin2Kの設定の可能性もあると思うので、 そこらへんの板にも逝ってきます。 ありがとうございました。
193 :
177 :03/02/16 12:34 ID:e43KuLNC
>>186 CGI自体は動いてます。
書いていただいたソースも問題なく表示されました。
ソートについて質問です。 @fname,@scorea,@average@scorej,@scoremにデータを入れた後、averageで 降順にソートしようと考えています。 下のようなソースで、エラーは出ないのですが、ソートしても順番が変わりません。 @fnameは文字列、それ以外は整数です。 Webなどを参考に独学でやっているので、基本的なはずかしいミスなのかも しれないのですが、よろしくお願いします。forとかもうまく使えないし・・・ @results = ( [$fname[0],$scorea[0],$average[0],$scorej[0],$scorem[0]], [$fname[1],$scorea[1],$average[1],$scorej[1],$scorem[1]], [$fname[2],$scorea[2],$average[2],$scorej[2],$scorem[2]], [$fname[3],$scorea[3],$average[3],$scorej[3],$scorem[3]] ) @sortresults = map {$_->[0]} sort {$b->[2] <=> $a->[2]} map {[$_, split /,/]} @results; その他、 @sortresults = sort { (split(/\,/,$b))[2] <=> (split(/\,/,$a))[2] } @results; やreverse sortも試したのですが、結果は同じ(@resultsのまま)でした。
split が全然必要ない。@results の中身を print してみろ
print @results; ってことね
splitも必要ないけれど、それよりもmapの方から必要ないYO @sortresults = sort { $a->[2] <=> $b->[2] } @results;
198 :
194 :03/02/16 16:23 ID:???
>>195-197 できました!ありがとうございます。
昨日1日悩み続けて無駄にしてしまったのに、こんなに簡単なこととは・・・
あとは複数キーのソートにするだけなので大丈夫そうです!
本当に助かりました。
$|=1; my $pid = fork; die $@ unless defined $pid; if($pid){ print "Content-type: text/html\n\n"; print "$pid:処理中です<br>"; local $eop = wait; print "$eop:処理が終わりました<br>"; exit(0); } close STDOUT; while(1){ last if $tmp > 10; sleep(1); $tmp++; } exit(0); 上記は、forkのテストコードで ブラウザへの吐き出しを先に行い 後ろで重い処理というものを狙っているのですが 子供の処理が終わるまで、一切の吐き出しが行われません… コード自体はこれで合っていますでしょうか? 環境はWin32上のApache1.3.27と ActivePerl5.6.1build633です。
#close STDOUT;
>>199 バングパスが無いとか言ってみる。
コマンドラインから実行してみれば分かりますよん。
202 :
nobodyさん :03/02/16 20:05 ID:6e2uXHNP
グワバババ
203 :
199 :03/02/16 21:09 ID:???
>>200-201 レスありがとうございます。
コマンドラインから実行してみるとうまくいくのですが、
ブラウザだと10秒後にやはりprintが実行されてしまいます。
close STDOUTをコメントアウトして実行してみたのですが
コマンドライン(成功)、ブラウザ(失敗)で
コメントアウト前と変わらずでした。
ちなみにperlへのパスは下記でしっかり通っております。
上記のソースからは抜いておきました。
#!c:\perl\bin\perl.exe
コードに問題がない場合、mod_perlやサーバの
バッファ関係の扱いの問題というのが想像できるのですが
この可能性はありますでしょうか?
204 :
200 :03/02/16 22:30 ID:???
んと、お役に立てず・・・・・・であります。 おっしゃる通り、バッファ関係と思われますが、サーバではなくクライアントサイドのブラウザの問題でしょう。 蛇足でした。。
205 :
200 :03/02/16 22:45 ID:???
あーうー、上記レスは無視してくださいませ。。sorry
206 :
199 :03/02/16 22:45 ID:???
>>204 細かいヒントが検索の糧にもなりますし
レスありがたい限りです。
環境周りをもう一度見直してみます。
ありがとうございました。
207 :
201 :03/02/16 23:27 ID:???
>>199 いろいろ実験しましたが、windowsのApacheではなぜかバッファされるようです。
SendBufferSizeディレクティブもうまくいきませんでした。
LAN上のFreeBSD 4.6+Apache1.3.27で試してみた結果、
直接出力されました。Unixに移行する事で回避できそうです。
208 :
201 :03/02/17 00:02 ID:???
>>202 頭がぼけて変な言葉つかってたYo!
逝って来る。
nph-hoge.cgiやtelnetからGETリクエストしてみても反応は同じなの?
210 :
199 :03/02/17 01:28 ID:???
>>207 なにやら手数をおかけしてしまったようで…
やっぱり環境上の問題なのですね。
生憎UNIXへ移行できるだけ環境にないのであきらめます。
でもコーディング自体、簡単なものですが
勉強になったので結果オーライです。
>>209 ためしにtelnetからGETしてみたら
変わらず同じ結果でした。
211 :
201 :03/02/17 03:26 ID:???
212 :
nobodyさん :03/02/17 05:09 ID:SDV2BVg0
perlで作ったプログラムをexeで起動したいのですが、 どうやって拡張子を変更すれば良いのでしょうか? ただリネームするだけでは無理だったのでお願いします。
無理
214 :
nobodyさん :03/02/17 05:36 ID:SDV2BVg0
無理なのですか? perlで作成したexeを改造したいのですが…。
>>212 で言ってることと
>>214 で言ってることが違うのだが.....
perlのプログラムをWindowsの実行ファイルにする方法ならある。
シェアウェアだがperl2exeってのがその1つ。検索してみ。
217 :
nobodyさん :03/02/17 06:04 ID:SDV2BVg0
見つかりました。 ありがとうございました。 perlで作成されたexeの改造はどのようにして行うのでしょうか?
ショートカット作ってwperlを起動するようにするんじゃダメなのか? あとリネームして拡張子を変えても、周り(Windowsとか)の挙動が変わるだけで 中身は一緒でしょ。
220 :
nobodyさん :03/02/17 06:15 ID:SDV2BVg0
ごめんなさい。 初心者なのでよくわからないです。 .plは.txtにリネームしたら改造できますよね? perlで作成されたexeをplに戻してtxtで改造、再度txtからpl、exeとするのはできないのでしょうか?
221 :
nobodyさん :03/02/17 06:54 ID:SDV2BVg0
ごめんなさい。 exeは改造できないみたいですね。 ありがとうございました。
( ゚д゚)ポカーン もう少し勉強してから来て下さい
223 :
nobodyさん :03/02/17 11:56 ID:80mgjnJ4
( ゚д゚)ポカーン
224 :
nobodyさん :03/02/17 13:32 ID:4sj7P/C2
>>220 exeに書き出す前のPerlスクリプトを改造すればいいじゃない。
w32 には perlcc はないの?
PerlでCGI組んでるんですけど、 たくさんのCGIで共通処理があったので、 init.pl っていうライブラリにその処理を格納しました。 そうすると、 times で得られる実行にかかる時間が 少し大きくなってしまう気がするんですが これは気のせいですか? require すると、時間がかかるのは仕様なんでしょうか よろしくお願いします。
ファイルの読み込みが一つ増えるわけだから、実行時間は増えますね。 共通処理はサブルーチンにして、メインパッケージにのせたらどうでしょうか。
228 :
226 :03/02/17 16:49 ID:???
>>227 やっぱりそうなんですか…
サブルーチンにします
ありがとうございました。
>>228 でもそれだとメンテナンス大変ですよ。
ちょっとの速度と、保守性と、安定性。
バランスをとった方がいいと思います。
保守まで考えてるとは、いやはやさん、ご立派 食い逃げの多い世の中、鏡だね
テレビゲーム以外はきちんと保守のことも考えろよぉ〜
>>225 配布はされてるけど動かないなぁ。
というか、コードを読んだ限りじゃまだまだAlphaの段階で、
真面目にポータビリティを考える段階じゃないらしい。
VCでのコンパイルコードにperl57.libとかハードコーディングしてあるしね。
233 :
nobodyさん :03/02/17 21:03 ID:Fb0RpjXG
質問させてください。 添付ファイル付きメールをフォームから送りたいと思い、 まず、formのENCTYPEを、'multipart/form-data'にしてみました。 こんな感じ <FORM ENCTYPE='multipart/form-data' action='/cgi-bin/tenpumail.cgi' method='POST'> すると、その後のINPUTで指定しているパラメータがわたってこないようなのです。 <inpit type=text name="onamae"> というようなパラメータが、いっこも渡って来ないのです。 ENCTYPE='multipart/form-data' をはずすとちゃんと渡ってきますが、 それではファイル添付ができないし…。 こう言ったことって良くあることなのでしょうか? また、解決方法などありましたら、教えて頂けませんでしょうか。
234 :
203 :03/02/17 21:10 ID:Fb0RpjXG
あっ、 <inpit type=text name="onamae"> は <inpit type="text" name="onamae"> の誤りです。すみません。
237 :
233 :03/02/17 21:24 ID:???
>>236 あ、ありがとうございました!
教えて頂いたところは見つけていたのですが、
回答にあるdecode.plを探さずに「だめか…」とへこんでいました。
探してみたらありましたので、もうちょっと調査してみます。
238 :
236 :03/02/17 21:36 ID:???
>>237 じゃーフォーマットは判っていたのだから、
自前でデコードしても良かったのではないかと...
応用力なさすぎでつ。
ここは初心者スレです。 応用力無くても別にかまわないかと。
240 :
nobodyさん :03/02/17 21:51 ID:4gk/zjjH
最新版のActivePerlで DB_File を入れようと PPM で install しようとすると見つかりません。 どうも最新版のモジュールリポジトリに DB_File がないようなのですが、何か理由でもあるのでしょうか。 古い方のActivePerlのリポジトリにはあるようです。
241 :
236 :03/02/17 21:53 ID:???
応用力という言葉のみに反応すんなって。
242 :
nobodyさん :03/02/17 22:33 ID:1e74kzGJ
お勧めのエディタとかありますか?
PerlEditor
>>243 即レスサンクス!と思ったんだけどそれ以外で何かあります?(^^;
PerlEditorよりも使いやすいやつないかなって…
>>245 激しくすれ違いでしたね…
スマソ
逝てくる…
248 :
nobodyさん :03/02/17 23:37 ID:EIQogyxL
CGIに対して、mp3を素で返すプログラムを作ってみたんですが mp3ファイルをopenしてprintしたら バイナリがそのまんま文字化けしてブラウザに表示されてしまいました。 一応"Content-Type: audio/mpeg"は送っているのですが やはり拡張子がmp3でないファイルは音声として扱ってもらえないのでしょうか? やりたいのは、cgi要求に対してmp3のバイナリを返して それをブラウザがmp3プレイヤーに渡して音楽を鳴らす。 というのを考えているのですが・・・・
249 :
nobodyさん :03/02/18 00:03 ID:EDQzMDCw
ずれてたらすみません。 APACHEのホームディレクトリにてCGIスクリプト置いたのですが、 属性を、711にしています たとえばWWWダウンローダソフトで根こそぎもってかれると、このCGIも もってかれるのでしょうか? (CGIの中身はDBIにてPASSを入れちゃっていて思いました)
251 :
249 :03/02/18 00:14 ID:EDQzMDCw
>>250 基礎的なものが無知ですいませんでした。。
(;´Д`)もうちょっと勉強して自分で調べてみまつ
>>248 audio/mp3
ってのはどぉよ?
しれでもダメなら、ちゃんとMP3ファイルを吐き出しているサイトへtelnetで接続してみて、
レスポンスのエンティティヘッダ「Content-type:」を調べてみる。
それでもダメなら、ブラウザが対応していないだけ。ファイルヘルパーの対応を設定してみる。
253 :
nobodyさん :03/02/18 02:31 ID:GFaap2mW
>>252 んー、某所でtelnetで試してみたら
apacheがaudio/mpegって吐いたんで
(もちろんCGIじゃなくてMP3直指定ですが)
それを真似してみたんですけどね。
ブラウザはIE6SP1です。
audio/mp3はまた試してみます。
255 :
nobodyさん :03/02/18 05:04 ID:Dcv1K+PR
ちょっと皆様にお聞きしたい事があります。 if ($count =~ /\n$/) { chop($count); } $count++; 上のカウントアップ処理は1カウントずつアップしますよね? これを2カウントずつアップするようにしたいのですがどう書き換えれば いいでしょうか?
>>255 $count++;
↓
$count += 2;
257 :
nobodyさん :03/02/18 07:09 ID:MmRlkG1z
258 :
nobodyさん :03/02/18 07:22 ID:Dcv1K+PR
261 :
マリモーマ ◆r6PDGT6Xd2 :03/02/18 08:06 ID:2FacSekM
>257 エロサイト
chomp($count); ++$count; ++$count;
ちなみに数字として評価してるから chomp も chop もいらん
グーグルで「(my|ローカル) 速度 Perl」と調べてもわからなかったので質問します。 変数名が重複しない場合でも、サブルーチン内ではmy宣言したほうが スクリプトの実行速度は速くなるのでしょうか? 換言すると、(1)サブルーチンにグローバル変数を渡し、受け取った変数はmy宣言し、 処理したのちにreturnで返すのと、 (2)サブルーチン内でもグローバル変数のまま扱って処理するのとでは、 どちらが速いのか、ということです。
265 :
nobodyさん :03/02/19 00:15 ID:P468uHQ8
sageてしまいました。
266 :
nobodyさん :03/02/19 00:28 ID: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;
>>264 変数自体にかかるコストは、シンボルテーブルに入らない分、myの方が速い。
でも、コピーにはコストがかかる。だから、遅くなる、だと思う。
遅くなる以上にメリットがあると思うんだけど・・・
それに、巨大なものを扱うなら、上手にリファレンスを使ったら、
コピーしなくてもよくなって、速くなるかも。。
>>266 まず、ローカルでテストされてはどうですか?
>>269 みたいだな。
あの素人の処理は君に任せるよ。頼んだよ。
>>266 パスが通ったところにcgi-lib.plがあるのか?
>>272 エラーメッセージもソースも聞かずに原因を追及するのはあまりに無謀だと思うぞ。
>>273 それができるならあんな質問はしないと思う(^_^;)
>>275 ハァ?
ありそうな間違いをあげただけ。
自分で間違いを発見できるのならこんなところで質問しないでしょ。
なに白熱してんのー?
>>266 へのレスがなぜ自問自答になるのかさっぱりわからん
オマイラおちけつ。
>>266 273に同意。で、エラーメッセージを書けぃ
280 :
:03/02/19 01:18 ID:???
>>266 PERLがローカルに入っているなら、
それ使った時に出たもっと具体的な
エラーメッセージは?
次の質問は「エラーメッセージってどうやって見るんですかぁ?」。
>>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;}}});
--
ここまでこだわる前にアルゴリズムを見直す方がいいに一票。
>>282 はバージョン5.6以降のコマンドラインで動かしてください。
284 :
264 :03/02/19 02:47 ID:???
>>267 さん
>>282 さん
レスありがとうございます。
>>282 を実行したところ、Aのほうが早かったです。
>ここまでこだわる前にアルゴリズムを見直す方がいいに一票。
単なる素朴な疑問だったもので、おっしゃるとおりです。
効率的なアルゴリズムのなんたるかを勉強してきます。
285 :
nobodyさん :03/02/19 03:20 ID:IJ5Nv9d6
とりあいずCGIファイル(カウンタ)を作ってみたんですが、 「ファイルを開くアプリケーションを選んでください」 になってしまいます、どのアプリケーションで開けば良いのでしょうか?
>>285 編集したいならメモ帳あたりで。
テキストが読み書きできればなんでもいいです。
287 :
nobodyさん :03/02/19 03:44 ID:IJ5Nv9d6
>>256 編集するんじゃなくて、カウンタとして表示させたいのですが。
288 :
:03/02/19 04:02 ID:???
>>287 cgi設置法の基礎なんて、PERL以前の話。
スレ違いだよ。
>>285 おまいにひとつ聞きたい
なんでこのスレで聞いた?
CGIスレが他にあるのになんでこのスレで聞いた?
291 :
マリモーマ ◆r6PDGT6Xd2 :03/02/19 06:49 ID:tT+FI6u3
>266 これだと思うだけど #!c:/perl/bin/perl →#!/usr/bin/perl
292 :
nobodyさん :03/02/19 06:55 ID:V0z+N0Sl
293 :
nobodyさん :03/02/19 15:12 ID:CC31r6wC
PHPとPerlだとどっちが偉いんですか?
Assembla>>FORTRAN=LISP>>COBOL>BASIC>(超えられない時代の壁)>>>Perl>>PHP
高級か低級かの話かね?
>>295 >Assembla
せっかくボケてんだから突っ込んでやれよ・・・。
(´-`).。oO(sageにassemblerって書けばよかった。)
$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"; } 英国の鯖に置いているのですが、時差を日本標準時間に修正するには どのように設定すれば良いでしょうか。
>>298 $time に 9*60*60 を足すなり引くなりすれば?
300 :
298 :03/02/19 19:47 ID:???
301 :
◆nBdXIOeCFk :03/02/19 22:02 ID:qxP6cynE
すいませんたす例ってきます
TZを直すだけでいいのでは? もしかしたらそのコードは、悪評高きCGIレ○キューのもののような気が.. 配布する方も無責任だよな。少し勉強すればわかるはずなんだから。 0を前に付ける正しい方法は、sprintfで整形する。だ。
>正しい
304 :
nobodyさん :03/02/19 23:25 ID: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
>>298 のような書き方意外によくみかけるな。
かくいう漏れも昔は
>>298 のように書いてたし。
そんなわけで
($sec,$min,$hour,$mday,$mon) = gmtime(time+9*60*60);
でどうよ?
>305 いや、タイムゾーンを直そうよ。。。
309 :
266 :03/02/19 23:48 ID:r5CAiNQE
お返事遅れて申し訳ないです。
>>273 ,279,280.281
エラーメッセージというのはデバッグで確認できるものとは違うのでしょうか?
ちなみに自分の思っているデバッグとはdosプロンプトでperl -cwでやる文法チェックのことです。
それではエラーもアラートも出ません。
フォームから起動するとプレーンテキストのままcgiファイルが表示されるだけです。
ローカルでもサーバーでも起動しないということはやはりどこか文法がおかしいのでしょうか?
ちなみにパスはローカルとサーバーとで当然変えてテストしています。
>>308 最初のソース見る限り、一応タイムゾーンはいじってあるみたいなんだけども。
それで変わらないんだから、変わらない理由は他にありそう。
だったら、次善の策でもいいんじゃないか?
本当にタイムゾーンが変わらないんだったら、鯖缶の怠慢かも知れんけど。
>>266 >>272 の質問にこたえろヴォケ!
理解できない or 都合の悪い質問を無視するのは厨房のやることだ。
……あれ? 厨房だったか?
>>309 使ってるのはActiveperlだと思うけど、
完璧なチェックでは無いので過信しないように。
それより、291がいいこと言ってるぞ。
先頭行が違う=>cgiと認識していないのでそのまま吐く。
$ENV{'TZ'} = "GMT-9"; $ENV{'TZ'} = "Japan"; とかでもやってみるとか。
315 :
266 :03/02/20 00:21 ID:Hhj+m+Kj
>>309 perl -cでチェックできるのは、コンパイルエラーのみだから、
実行したときに発生するエラー(require失敗、関数が見つからない)は、
存在するかしないかは分からない。
「は」、と、「が」、を間違えました。
318 :
266 :03/02/20 00:32 ID:Hhj+m+Kj
>>291 ,312
どうもありがとうございます。
もう一度先頭行を確認してみます。
320 :
マリモーマ ◆r6PDGT6Xd2 :03/02/20 08:45 ID:ZbzyrSlf
ローカルテストで 無限ループになったら windowsタスクマネージャーで perl.exeを 終了させると いいらしい
321 :
nobodyさん :03/02/20 09:04 ID:hpPhmqwv
322 :
304 :03/02/20 09:05 ID:Am46dVIU
ありがとうございました。 URLエンコードというのですか。 勉強になりました
>>309 Syntax checkがOKならperl filenameでコマンドラインから実行しろ。
perl filename > test.html って具合のが見易くて良いかもね。
すいません、正規表現なのですが 一行内に特定文字列(>>\d+)がいくつあるか 数える方法というのはありますでしょうか? 現在、代案として下記のように>>\dで splitし配列を数えているのですが いかんせん正攻法じゃないので... local @tmp = split(/>>\d+/,$_); print $#tmp;
>325 適当な配列にコピーしてs//gして帰ってくる数値を見ればいいんでない? もしくはwhile(/>>\d+/g)ってやってカウンタを増やすとか…
>>325 print (@tmp =~ s/(>>\d+)/$1/gs);
>>327 > 一行内に特定文字列(>>\d+)がいくつあるか
これを読んでいなかったスマソ
my $count = 0;
foreach(split(/\n/,$_)){
print sprintf(qq{">>\\d+"の数:%0d 行目 %0d 個},++$count,(s/(>>\d+)/$1/g));
}
>>326 >>327 置換処理をすると処理した数が返ってくるのですね
勉強になりました
これで万事解決です
ありがとうございました!
330 :
nobodyさん :03/02/20 20:18 ID:ve8bV8Zf
「このまま一生彼女ができないのでは…」
私は社会学を専攻している者です。社会学や周辺の学問を利用し、実践的な
恋愛理論を開発しております。机上の空論に終わらず、あくまで実践的。効果
は絶大です。この理論は私自身の苦悩から生まれました。モテないことに深く
悩んでいた私は社会学部に入り、恋愛をはじめとするコミュニケーションにつ
いて考察することを決意。開発期間およそ6年。やっと研究が実を結びました。
ルックスなんて恋愛に関係ないということを自ら証明したのです。今回はその
集大成を公開しようと、メールマガジン発行を決めました。すでに数回発行し
ておりますが、購読者にはバックナンバーが閲覧できますのでご安心を!
今ならまだ間に合います。春、出会いの季節に幸せが訪れるかどうかは、あな
たの選択次第です。絶対に後悔はさせません。「90日彼女ゲットプログラム」
もちろん購読は無料! → →
http://www.h5.dion.ne.jp/~psysys/index.html
331 :
nobodyさん :03/02/21 01:07 ID:f3aIdgTv
質問です。 RaQ3で正常に動いていた画像掲示板が、RaQ550にサーバーを変えてから エラーが出て動かなくなってしまいました。 エラーログを見ると 「Premature end of script hedders : /usr/cgiwrap/cgiwrap」 となっています。 これはどういう意味のエラーなのでしょうか?いろいろ調べたのですが わからずほとほと困っています。 perlのバージョンが上がったのが原因なのかとも思いましたが、 なにぶん初心者なのでよくわかりません。 もしよろしければ教えていただければありがたいのですが。 よろしくお願いします!
>>331 ・1行目の Shebang が違う。
・require の該当するファイルがパスの通ったところにない。
・適切な Content-type: エンティティを吐き出していない。
・外部ファイルへのアクセス時に、該当ファイルのパーミッションが不適切であった。
・長いので省略。全部見るには
>>1
だからCGIの質問はCGIのスレでしろと(略
335 :
nobodyさん :03/02/21 02:46 ID:p5R52YmN
質問させてください。 Perlモジュールを作ってるのですが、 拡張子.pmだと、ブラウザでアクセスされると中が見えてしまいます。 で、拡張子.cgiでモジュール使おうと思ったのですが、 それだと、useで呼び出せません。 拡張子.pm以外は、useで呼び出せないのでしょうか? また、.pmファイルの中が見えないようにするにはどうすればいいでしょうか?
337 :
335 :03/02/21 03:22 ID:???
>>336 ありがとうございます!
htaccessの設定を挑戦してみようと思います。
ありがとうございました!
338 :
331 :03/02/21 11:42 ID:???
>>332 >>333 ありがとうございました!
教えてもらったところをチェックしてみます!
前のサーバーで動いていたのに、新しいサーバーでは動かないのが
わからないんですよね・・パスはチェックしたけど
ファイルをopenしてランダムに一行のみ読み込みしたいのですが、 確かwhileを使う方法があったのですが思い出せません。 教えて頂けないでしょうか?
>>335 use 'Some/Module.cgi';
>>342 無理。使えない。require()するしかないね。
345 :
nobodyさん :03/02/22 12:20 ID:00dHJZue
質問です perlから以下のような内容を含むメールを送信したいのですが &jis("この度は〜頂きありがとうございます。\n今回のオーダーは以下の内容で承りました。\nもしこの内容でよろしければこのままメールをご返信ください。〜 で送信後メールの「今回のオーダーは」 の部分が「今回のお錐桙ンは」 のように文字化けを起こします。他の箇所はよいのですが この部分だけ文字化けを起こします。 何か対処法はあるのでしょうか? よろしくですm(__)mペコリ
347 :
あすか :03/02/22 17:29 ID:9iUywjuX
置換演算子に関する初歩的なことなんですが・・ $value =~ s/藁/笑/g; で、藁を「笑」に変換するのはわかるんですが これに「タグ」を利用したい場合どの様にすればよいのでしょうか? つまり、もしも「藁」という文字列があった場合 「<b>笑</b>」と(←実際にはタグは実行されてしまっている) したいんですが、</b>としたときの「/」が置換演算子とかぶって しまいエラーになってしまいます・・・。(泣
\
/が解釈されないように\/にする。 世にこれをエスケープという。 /を置換演算子とやらとして解釈されないようにする。 s#藁#笑#g 世にこれを...知らん
350 :
マリモーマ ◆r6PDGT6Xd2 :03/02/22 18:32 ID:SFcrKMsp
351 :
nobodyさん :03/02/22 18:36 ID:9Q2QNoLV
constant で配列を宣言してそれをforeachなどで回すには どうすれば良いのでしょうか? ↓こんな感じでやりたいんですが、、 use constant HOGE => ['hoge','hoge2','hoge3']; print "$_\n" foreach(HOGE);
>>345 jcode.pl(.pm)を使う。
>>347 s/<b>笑<\/b>/藁/g; # /をエスケープ
s|<b>笑</b>|藁|g; # 区切り(デミリタ)を変える
s{<b>笑</b>}{藁}g; # 同上
>>351 use constant HOGE => ('hoge', 'hoge2', 'hoge3');
353 :
351 :03/02/22 19:09 ID:???
>>352 できました!どうもありがとうございます。
354 :
nobodyさん :03/02/22 21:55 ID:dmtEQjtb
perlでユーザーの大量クリックに耐えれるクリックカウンターcgiを作ろうとしているんですが、 ファイルロックしてもデータが飛んでしまいます。 どうすればデータが飛ばないように出来るんでしょうか?
どんなロックしてるか見せてみそ
356 :
354 :03/02/22 22:14 ID:dmtEQjtb
>>356 実は書き込み先がローカルじゃなかった。とか。
それ、これまでのカウントってどこで読み込んでるの?
>>356 書き込む前にtruncateせず、
書き込み後にtruncate(OUT, tell(OUT));
あと、エラー処理入れれ。
要は、小出しにしたソースでは的確なアドバイスはできないってことだ。
363 :
354 :03/02/22 22:53 ID:dmtEQjtb
if (open(F, "+< count.dat")) { flock(F, 2); $count = <F>; $count++; seek(F, 0, 0); print F $count; close(F); } else { &error(); } いろいろ改良して、こんな感じなったんですけど、やっぱり1000回ぐらい何人かでやるとファイルの中身がおかしくなってしまいます
openのエラー処理しかしてねーじゃねーか。
「おかしくなる」って、どうおかしくなるの? 処理の結果ってのはバグの手がかりを知る大事な情報だから省略しないように。
366 :
354 :03/02/22 23:04 ID:dmtEQjtb
ファイルにアクセスが多くなると、ファイルの中身の値が適切じゃないものになってしまいます。
モロ画像とか?
368 :
354 :03/02/22 23:07 ID:dmtEQjtb
いや。同時に大量実行実験です。 それで、実行された回数を記録したいんです。
>>363 例えば、先行プロセスでflockが失敗したとする。
しかしエラー処理が無いのでそのまま進む。
ここで後続プロセスがロックがかかってないのでファイルをオープンする。
データが壊れる。
カウンターとかのファイルロックって、 限界があると思うけど・・・。 絶対壊れないようにするファイルロックはないです。
371 :
354 :03/02/22 23:30 ID:dmtEQjtb
では、MySQLのデータペースとか使えば壊れないでしょうか?
もし壊れても、可能な限り復旧するっていう形のほうがいいかも。
>>370 でたらめ抜かすな。ロックは2種類しかない。
正しいロックと駄目ロックだ。絶対に壊れないのが正しいロック、それ以外が駄目ロック。
>>374 サイズが増えるだけなら入らないと思われ
376 :
354 :03/02/23 00:04 ID:osZUd/C4
>> 374 truncateって何ですか?
だからエラー処理をしろって
>>363 その方法が最良じゃないかと思いますが。
無駄な処理とかないですし。
あとはflockとseekとcloseにエラー処理加えるくらいですね。
379 :
378 :03/02/23 00:19 ID:???
ちなみにtrancateは入れる必要ないですね。
>>373 そんなことない。
絶対壊れないようにするなんて不可能。
集中同時アクセスがつづけば、どんなロックしてても壊れるだろ。
ムキー!!! なんで354は再三にわたってエラー処理をしろというレスを 無視するんだああああr;かえ;gk’えあ;rlf’あうぇr
>>381 まあおちけつ。
どうせ動かなくて困るのは質問した本人だけだ。
アクセス数を制限してみる。 flockを使わない。
>>380 それはチミが駄目ロックしか作れないという事を意味する。
385 :
nobodyさん :03/02/23 01:15 ID:PmGQRxss
Socketで?を含むURLをGETしようとしてるんですが、&amp; に展開されてしまってうまくいきません。 何とか回避する方法はありませんでしょうか?
意味不明。
(再挑戦) Socketで&を含むURLをGETしようとしてるんですが、&amp; に展開されてしまってうまくいきません。 何とか回避する方法はありませんでしょうか?
リクエストはどうやって送ってるの?
389 :
387 :03/02/23 01:30 ID:???
$url = "test/read.cgi/php?1044717887"; my $SOCKET = new IO::Socket::INET -> new(PeerAddr => $hostname, PeerPort => 'http', Proto => 'tcp', TimeOut => '5' ); print $SOCKET "GET $url HTTP/1.1\r\n"; ってな感じです。
&はどこで使っているのでしょうか・・・
391 :
387 :03/02/23 01:42 ID:???
またやっちまった。 $url = "test/read.cgi/php&1044717887"; my $SOCKET = new IO::Socket::INET -> new(PeerAddr => $hostname, PeerPort => 'http', Proto => 'tcp', TimeOut => '5' ); print $SOCKET "GET $url HTTP/1.1\r\n"; ってな感じです。 (この$urlは実在しません)
392 :
387 :03/02/23 01:46 ID:???
これで、エラーが Invalid URI in request GET test/read.cgi/php&amp;1044717887 HTTP/1.1<P> と出ます。
print $SOCKET "GET /$url HTTP/1.1\r\n";
>>387 $urlが間違っている。httpのRFC読んで出なおしたまへ。
395 :
387 :03/02/23 01:53 ID:???
>>393 あんりがとうございました。
目から鱗でした〜
396 :
387 :03/02/23 01:55 ID:???
>>394 後学のために、どこが間違いなのかヒントだけでも…
>>354 参考のためにOS教えて。
# truncateまでしたら、まず壊れないと思うけど。
参考のために。
use IO::File;
my $fh = IO::File->new("count.dat", O_EXLOCK|O_RDWR); # $fhがハンドル
で、ファイル開いてみてください(ただしWindows不可)。
>>387 展開されます?
>>392 のサーバのエラーはHTML形式で出力されているようですが。
>>396 ファイル指定は、ドキュメントルートからのパスで指定しなきゃ。
399 :
387 :03/02/23 02:11 ID:???
>>398 だめだ。。。
意味わからん。出直します。。。
米鳥で、htmlファイルを読み込んで編集して出力と言うスクリプトを書いたのですが、 ローカルではopenできるのですが、UPするとhtmlファイルがopenできません。 どうしたら良いでしょうか?
まずは質問の仕方を勉強して、
このスレの
>>1-401 を音読してください。
>>380 まともなOSなら、まともなロックぐらいできるはずだ。
エラー処理とは...
全てのシステムコールに、or die($!);ってつけて、
eval BLOCK の中で実行してみろ。例外が飛んできたら(?)
$@に入るから、それを出せばいい。
Windowsで、メールを送信するプログラムのローカルテスト環境を作ることってできますか?
407 :
nobodyさん :03/02/23 19:06 ID:srUBO4KW
きく
あのう突然すみませんが、 私のプロバがヤフーBBで今書き込めなくて困っています。 どうしたら書き込みできるようになるんでしょうか。教えてください。
409 :
408 :03/02/23 19:09 ID:???
串を使っても書き込めないのですが......
>>408 プロバイダを変える。
あと、スレ違いの質問はよせ。
ファイルの中身を逆順に表示する方法はありますでしょうか。 リストに読み込んでリバースするとなると、メモリ容量が心配でして・・・
>>402-403 スクリプトは間違ってなかったのですが
鳥の仕様でスタ(cgi-bin以下のファイルは操作できない)
婆茶とかハイマしか触ったこと無かったので分からなかった(;´Д`)
>>411 whileで回しつつ、unshiftしていけば?
>>414 それじゃ最終的にファイル全部を配列に入れるわけだから同じだよ。
まあ、100KBぐらいだったら気にせずreverseでいいんでない?
>>414-416 レスありがとうございます。
平均100KBくらいなんですが、気にしなくてもいいのかもしれませんね・・
ちょっと
>>416 さんのところ、詳しく見させてもらいます。
ありがとうございました。
どうせ一気読みするならforで後ろから逆順に読んでいった方がreverseするより軽いと思われ。
まわす数が分かっている場合。 $n = 10; for(1..$n){ 処理; } と、しているのですがもっとベターなやり方はありますでしょうか?
全部読むなら、foreachの方が速くなるかも。特化しているから。
>>420 さんありがとうです。
昔はforeachを使っていたのですが、何時の間にか短いforを使うようになってしまいました。
>>420 特化ってどのへんで?
for と foreach って常に置き換え可能じゃない?
424 :
nobodyさん :03/02/24 08:45 ID:cCE/Sh/G
自作のオブジェクト指向なCGIフレームワークを、公開前にmod_perl環境にも対応させたいです。 mod_perlを極めるためのおすすめ本・サイトを教えてください。 お願いします。
cryptで暗号化しておいた文字列を ユーザに入力して貰ったデータと照合する処理を実現したいのですが 何度試してみても結果がNGで戻ってきてしまいます 尚、照合処理は下記の様なシンプルなものです if ($savedata[0] eq substr($chkiddata[1], 0, length($savedata[0]))) { if (crypt($chkpassdata[1], $savedata[1]) eq $savedata[1]) { print "password check OK...<br><br>\n"; $flg = 1; } } $chkiddata[0] はユーザ入力にてIDが、$chkpassdata[1] はユーザにて入力されたパスワード文字列(平文)が格納されております $savedata[0] は保存されているIDが、$savedata[1] は保存されている暗号化済みのパスワード文字列が格納されております また $flg に 1 が格納されている場合は、check OK の HTML を書き出す処理をおこなっています 因みに、パスワード暗号化を行う処理は、別のPerlスクリプトで行っておりますが、これも何か関係がありますでしょうか 宜しくお願い致します
>>426 > if ($savedata[0] eq substr($chkiddata[1], 0, length($savedata[0]))) {
$chkiddata[1] は、なんなのさ?
if ($savedata[0] =~ /^$chkiddata[0]/) {
ぢゃなぁぃ?
429 :
424 :03/02/24 12:48 ID:???
比較的有用と思われるHTML::Template、CGI::Lite、Apache::Sessionなどを 使い易く統合して機能追加したパッケージを作っいるので、 それがmod_perl環境でも動くように改良したいと思ってるんですが…。 気持ち悪いですか。うあああ。
431 :
426 :03/02/24 14:55 ID:???
申し訳ないです、記述間違ってました $chkiddata[1] の方にユーザで入力されたアカウント名が入っています、でした 今しがた print をIDチェック部分に噛ませて実行してみた所 ID 部分のチェックは問題なく認識できている様なのですが どうしても暗号化パスワードとの比較が NG で戻ってきてしまいます...
URLエンコードとデコードはきちんとしてる?
433 :
426 :03/02/24 15:09 ID:???
>>432 はい、拾ってくれたデータも print で書き出しテストしてみましたが
問題なく元データとして保持されておりました
改行コードが付いてるとか。 chop $savedata[1];
435 :
434 :03/02/24 16:42 ID:???
chompでした。
>>431 目玉開いてよーく見てから、直したの貼って見れ。各変数に何が入っているか説明する事。
先生いいでつか?
windows2000
Active perl 5.6.1 build 633
APACHE 1.3.27
の環境ですが
exec (又はsystem) で外部プログラムを呼び出したとき
コマンドライン上で実行した場合外部プログラムは問題なく起動するのに
ブラウザから呼び出した場合外部プログラムが起動する場合と
起動しない場合があるのは何故なんでしょう??
hoge.cgi
#!/usr/local/bin/perl
print "Content-type: text/html;charset=euc-jp\n\n"; #コマンドラインから呼び出す場合は要らない
system("program.exe");
外部プログラムはどのような物でも問題なく起動 c:>perl hoge.cgi
起動するものと起動しないものがある
http://127.0.0.1/cgi-bin/hoge.cgi
>>437 起動する場合としない場合の違いを説明する事。
まずはpathが通っているかをチェックしる。
> 先生いいでつか?
このスレに代議士はいない。・・・はず?
path を通しても同じです。フルパスで指定しても一緒。
違いは今のところパターンが把握できては居ませんが
どうやら何かしらのメッセージを標準出力に出力しないものは
起動していないような気がする。
例えば
system("dir");は
perl hoge.cgi
http://127.0.0.1/cgi-bin/hoge.cgi 共に問題なく動く
system("wmplayer");はブラウザから呼び出したときは動かない(起動しない)。
標準出力先が違うからね。 Apacheに理解できない出力したらいかんよ。
441 :
nobodyさん :03/02/24 21:26 ID:38CGzi2z
現在より nヶ月前の年を算出したいのですがどのように書けばいいでしょうか? $year = $thisyear + int(( $thismon-1 ) /12 ); で nヶ月後は算出できるのですが…。
445 :
443 :03/02/25 03:31 ID:???
phpってのがミソですかな
どこかで「CGIはこのスレ」とでも誘導してるのか? 理解できん。
>448 板にはともかくスレに誘導はしてないだろうよ…
450 :
437 :03/02/25 15:57 ID:???
パターンと原因が掴めなかったので perlからtelnetで接続させて起動させるように書きました。 まあ、目的は達成できたのでヨシとします。 暇なときにでも勉強するでス。 ありがとう。 余談だがwin9x系だとtelnetdにろくな物が無いのに愕然とした(涙
451 :
nobodyさん :03/02/25 17:11 ID:wR5lMZNW
WIN2000+anhttpdでCGIとして動かしています。 systemでファイルのコピー等を行った場合に、「○個のファイルをコピーしました」 などのsystemの返り文字が表示されますが、これをスクリプト上で 非表示にする方法はないものでしょうか。 ___________ $from="コピー元パス"; $to="コピー先パス"; system("copy $copyfrom/A $copyto"); →1個のファイルをコピーしました。 ___________ ご存知の方いましたらお願いします。
452 :
451 :03/02/25 17:13 ID:wR5lMZNW
訂正: system("copy $copyfrom/A $copyto"); → system("copy $from/A $to");
>>451 system("copy $from/A $to > nul.txt");
とかでダミーファイルにリダイレクトするってのはどう。
ダミーじゃなくても、> nul にリダイレクトだけでいいはずだけど、 anhttpdって、クライアント側への表示を勝手にしちゃうの? って、気づけばここperlスレだった…。
455 :
453 :03/02/25 20:57 ID:???
/dev/nulでだめだったので使えないのかと思った。 /devディレクトリないからあたりまえか。
>>455 nulはデバイスだよ。ファイルとかディレクトリじゃないからパス名はつけられない。
逆にパス名つけたらただのファイルになっちゃう。
>>456 455はUNIXと間違えたと思われ。
UNIXはデバイスファイルという概念を持っていて、デバイスをファイルのように扱う。
そしてパスが/dev/nul。
っていうか、copyコマンドなんて使うなよ use File::Copy; copy("file1","file2");
460 :
451 :03/02/26 10:45 ID:JNJUfkpu
>459 最終的にはお客さんの環境に入れ込むのですが、 perlのバージョンが5.0な事とモジュールをこちらで入れる権限がないので こんな遠回りな事になってしまってるんです・・(涙 system("copy $from/A $to > nul.txt"); は構文ミスになってしまいました。 つかDOS勉強しないとよくわからないって事なんですね・・。 とりあえず応急処置として<!-- -->で囲んでおく事にして、 引き続き調べてみます。 #これってperlの質問じゃなかった・・?すみません
system("$ENV{COMSPEC} /c copy /A /-Y $from $to >nul")
462 :
451 :03/02/26 13:31 ID:???
>461 うはー!!できましたっ! $ENV{COMSPEC}なんて初めて見ました。これなら違う環境でも安心して動かせますね。 本当にありがとうございました。 今夜は2ちゃんに足を向けて眠れませんです。
463 :
nobodyさん :03/02/26 15:07 ID:WD8DDVVN
ある変数の値(例えば$test)で条件文を作りたいのですが 値が一個の場合は(例えば $test=first) if($first eq ""){ 処理; } として、 カンマ区切りで複数の場合は(例えば $test=first,second) if(($first eq "") || ($second eq "")....$testに入ってる値の数だけorで追加..){ 処理; } という処理をやりたくて 今は$testをカンマで分割して配列にいれて(例えば @x) $testの値が複数だったばあいは foreach $i (@x); if($x[$i] = ""){ 処理 } } という感じで回して処理してます。動作は問題なくするのですが、 もっとスマートないい方法ないでしょうか? アドヴァイスをよろしくお願いします
465 :
まる :03/02/26 17:30 ID:T5eWammJ
一部のタグを有効にする掲示板を作っています。 配列で有効にするタグの中身を設定して、それに合致しないものは gt;などで文字化する、というふうに考えたのですが、これでは 有効になるはずのタグまで文字化されてしまいました。 どう書けば動くようになるでしょうか。 #もっとスマートな書き方もあるような気がするけど・・(^-^; #設定項目 @tag = "('b'.'/b'.'i'.'/i'.'u'.'/u'.'s'.'/s')"; #タグ無効処理 sub tag { $value =~ s/</>/g; $value =~ s/>/</g; }
466 :
まる :03/02/26 17:31 ID:T5eWammJ
#タグ有効処理 sub decode{ if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("本文が長すぎます"); } read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # S-JISコード変換 &jcode'convert(*value,'sjis'); # タグ処理 if ($value ne "<@tag(.*)>") { &tag; } #改行処理 $value =~ s/\r\n/<br>/g; $value =~ s/\r/<br>/g; $value =~ s/\n/<br>/g; #削除情報 if ($name eq "del") { push(@DEL,$value); } $FORM{$name} = $value; } }
467 :
まる :03/02/26 17:32 ID:T5eWammJ
しかもタグ要素の <〜style:="***"> までとおることになる・・ この書き方だと・・(って動かないうちにいっててもしょうがないって)
すり抜けを防ぐために、禁止するものを書き換えるではなく、全部書き換えて許可するものだけ戻せ。
469 :
nobodyさん :03/02/26 19:14 ID:h/xtR2PF
perlとなんの関係が?
>>465 文字修飾タグだけならspanタグだけ通るようにしてみるとか。
$value =~ s/\t//g; # [TAB]が含まれていたら削除する(これを'<','>'の代用にするため)
if (($value =~ s{(<b[^>]*>)}{$1}g) != ($value =~ s{</b>}{$1}g)){
# 開始タグと終了タグの数が一致しないので鰓。
print qq{タグ鰓};
}
else {
# < を \tに、 > を \t\t に。
$value =~ s{<(b[^>]*)>}{\t$1\t\t}g;
$value =~ s{</b>}{\t/b\t\t}g;
}
上記を<i><u><s>分処理する。(ハシュを使ってループするなり・・・)
# 他のタグは無効と言うことで・・・
$value =~ s/</</g;
$value =~ s/>/>/g;
# \t\t,\tを復元。
$value =~ s/\t\t/>/g;
$value =~ s/\t/</g;
あーあほらしくなってきた鬱。
>>471 &忘れてた鬱。
$value =~ s/</</g;
$value =~ s/>/>/g;
↓
$value =~ s/</</g;
$value =~ s/>/>/g;
>>465 タグの無効処理、一部有効処理は正規表現スレにいけ。
最近でも出た話題だからすぐに見つかるはず。
>>463 どうでもいいが、根本的に考え方がずれてるんだと思われ。
その処理で一体何がしたいのか言ってみるのもあり。
別のもっとスマートなやり方がみつかるかも。
>>469 CGIの設置は、
1.そのCGIを配布しているサイト
2.そのCGIを設置したいサイトのサポート
の順で方法を調べて、それでもさらにわからないなら諦めるのが普通。
それでも諦めきれない未練がましい人間なら、そうだな、
CGIスレに行けばもしかしたらいけるかも知れない。
1も2も失敗しているのなら、いける可能性はほとんどないだろうが。
質問なのですが、 CGIをperlで作成しているのですが ゲームのロビーサーバーの代わりを ホームページ上で作成しようと考えているのですが、 ホームページを参照している クライアントに TCP-IP、ポート指定 でデータを直接送ることはできるのでしょうか? ホームページは、フリーでCGIが使えるます。 流れ的にこんな感じです。 0.各クライアントが ゲームを起動しておく。 1.ホームページでログイン処理. 2.ログインしたクライアントのIPアドレスを取得しておく. 3.ホームページ上でゲームの対戦相手を決める. 4.相手が決まったら CGIから各クライアントに ログインしたときに取得したIPアドレス、ゲーム専用のポートに 対戦相手のIPアドレス、対戦相手の情報を送信して ピアツーピア接続で 対戦させる。 どうでしょうか 可能ですか?
>>474 Perlで作ってればどんなことでもこのスレに書いていいというわけじゃないぞ。
可能かどうか聞いてるだけだしまぁいいんじゃないの。 可能。詰まったらまたおいで。
>>474 HTMLとブラウザを使っている限り、サーバー側からの情報の送りつけはまず無理と考えろ。
これはPerlとかに限らない話なので、これ以上はスレ違いになるので詳しい説明はしない。
文意を汲み取るならば、
>>474 のやりたいことは、
ユーザーがブロードバンドであることを前提にして、
鯖を用意し、ユーザーにJavaサーブレットやHSPで作ったexeなどを使ってもらうのが一番現実的だと思う。個人レベルでは。
なので、本気でやる気ならばそれぞれ専用のスレに移動しろ。
478 :
nobodyさん :03/02/27 11:20 ID:SWu201Ch
push(@array,"a"); push(@array,"b"); push(@array,"a"); push(@array,"c"); foreach $value (@array){ print "$value\n"; } これを実行すると、a b a cとなります。 aは1回目に既に配列の中にあるので2回目のaは入れたくないのですが、 どうすればいいのでしょうか。
>>478 push(@array,"a");
push(@array,"b");
#push(@array,"a");
push(@array,"c");
入れる前に処理するのと入れた後に処理するのが有りそうな予感
>>478 入れるデータを変数で渡して正規表現で分岐ってのが一番分り易いんでない?
>>478 # 先に重複をチェックする方法
$append = sub { push(@array, $_[0]) if index("@array", $_[0]) == -1 };
$append->("a");
$append->("b");
$append->("a");
$append->("c");
# ハッシュを使って後からキーを取り出す方法
$hash{"a"} = "";
$hash{"b"} = "";
$hash{"a"} = "";
$hash{"c"} = "";
map { print "$_\n" } sort keys %hash;
>>473 >
>>463 > どうでもいいが、根本的に考え方がずれてるんだと思われ。
> その処理で一体何がしたいのか言ってみるのもあり。
> 別のもっとスマートなやり方がみつかるかも。
テキストボックスの名前を羅列したファイルを参照して
フォームメール中の対応するテキストボックスを未入力不可にするスクリプトで
氏名とか住所とかはテキストボックスが複数にわかれてるので
firstNAME,familyNAMEと設定ファイルに書くと
orで条件わけしようと思ったんですが
よく考えたらorにする必要なかったです
氏名の場合なら単純に
firstName
familyName
と設定ファイルに書いて
一個ずつ条件分岐させればよかった話でした。
そもそも未入力不可のテキストボックスを指定する方法があまりよくない気がしてきだした…
>483 下のやり方でうまくいきました 有難うございます
西暦→和暦の関数白根?ぎぼんぬ
<?php #IN:$seireki 西暦 #OUT:$val[0] 元号 $val[1] 年 function wareki($seireki) { $gengo=array( '1989'=>'平成', '1926'=>'昭和', '1912'=>'大正', '1868'=>'明治' #後は自分で ); while(list($nen, $gen) = each($gengo)) { if($seireki >= $nen) { $val[0] = $gen; $val[1] = $seireki - $nen + 1; return($val); } } exit; } ?>
488 :
487 :03/02/27 19:18 ID:???
Perlスレでした すまん
490 :
486 :03/02/27 21:39 ID:???
>487-489 さんこす
491 :
nobodyさん :03/02/28 08:20 ID:nTu2mU2W
すいません。 キー1=値1 キー2=値2 みたいなフォーマットのファイルを扱うクラスがどこかにあったと思うのですが、 名前を教えて下さい。
初心者は暮らすなんか使ってはいけません。
493 :
nobodyさん :03/02/28 08:37 ID:0F+7IAI5
そんなこと言わずに教えてください。 use Class; my $class = new Class(); $class->method(); $class = undef; クラスの使い方なんか、たったこれだけじゃなかとですか。
もっともやね >494
496 :
nobodyさん :03/02/28 14:41 ID:6S1ggN3l
自分で書いたクラスはあります。 ただ、標準モジュールにそういうクラスがあるなら、配布しなくていいからそっちのほうがいいです。
>>496 こんなところでレス書いていないでCPANで探すのが吉。
無駄な労力はストレスの要因ですよ(^o^)
>>493 new Class()で返ってきたのは、おそらく、オブジェクトなので$classという変数名は不適切。
変数を破棄する場合は、undefを代入するよりも、undef $hoge;の方が意味がわかりやすい。
標準では無いと思う。
>>496 SGBMでもGDBMでもDBでもNDBMでもなんでもいいじゃん。
質問です。 ファイルのリスト @files を、更新が古い順に並べ替えたいんですが… 一応自分でも考えてみました。 @new = (); foreach (@files){ push @new, (stat $_)[9] . "<>" . $_; } @files = (); foreach (reverse(sort @new)){ my(undef, $x) = split /<>/; push @files, $x; } これでできそうなんですが、もっといい方法があるような気がします。 もっといい方法があれば教えて下さい お願いします。
503 :
502 :03/03/01 21:25 ID:???
ageさせてもらいますね
my @file; my %hash; foreach(@new){ $hash{(-M $_)} = $_; } foreach(sort{$b <=> $a} keys %hash){ push(@file, $hash{$_}); } うーん…。
sort {(stat $a)[9] <=> (stat $b)[9]} @files; でいけるかな
>>504 同時刻のファイルが消される。
>>505 比較の度に stat を呼ぶのはマズい。
手っ取り早くやるならこう。
@files =
map $_->[0],
sort { $b->[1] <=> $a->[1] || $a->[0] cmp $b->[0] }
map [ $_, -M ],
@files;
エレガントだ。
>>507 何でもかんでも1行にまとめるのがエレガント?
じゃあ俺ほとんどのCコードを10行以内にまとめられるけど。
509 :
504 :03/03/02 12:33 ID:???
>>506 確かに同時刻のファイルが消されます。
忘れてました。
シュワルツ変換(Schwartzian Transform)ですね。
やっぱり覚えた方がいいかな。。
tr/\n//d;
>>509 Schwartzian Transform はデリファレンスのオーバーヘッドがあるんで、
同じ事をより効率良くやるには地道に作業変数を作ってソートした方が
いいらしい。
{
my @time;
push @time, -M for @file;
@file = @file[
sort {
$time[$b] <=> $time[$a] || $file[$a] cmp $file[$b]
} 0..$#file
];
}
>>508 1行(と言うか1文)に詰め込む云々より、この作業変数の為にブロックが
増える所がエレガントでないとは思うがな。
512 :
初心者 :03/03/02 17:23 ID:EYbp7ypM
windowsではexec関数は使えないの? perl内で、EXEファイルを実行したいのですが。
514 :
502 :03/03/02 17:57 ID:???
みなさん回答していただいてありがとうございます! おかげでできそうです 初めてなんですけどここの板の人って親切ですね また何か困ったことがあったらよろしくお願いします。
なんだマルチか。
>>514 自分で勉強する意志のある人には協力するさ(うわっ、なんか俺かっけー
こんな事をできる定義の方法ってあります? $b="b"; @a[0]="a"; printf("[%s]",$b); ### [a]と表示
>>518 $bにbを代入してる以上、お前は天才かアホかのどっちかだ。
>>519 @a[0]と$bを同じ変数として扱う方法はありますか?
という質問です。
@a[0]="a";によって$b="b";が上書きされるという事を表現したかったんです。
説明不足で申し訳ありません。
>>519 いや待て、ちょっと待て。
何かがあるかも知れぬぞ。
では518さんのご登場です↓
522 :
nobodyさん :03/03/03 01:04 ID:pK+Ijnrw
バカばっか
>>520 参照・・・Perlではリファレンスか。それについて調べてみ。
my @a; local *b; # 動的スコープに注意 *b = \$a[0]; $b = 'b'; $a[0] = 'a'; print "[$b]";
Cで言うところのポインタ
my @a; local *b; # 動的スコープに注意 *b = \$a[0]; $b = 'b'; $a[0] = 'a'; print "[$b]"; my @a; local *b; # 動的スコープに注意 *b = \$a[0]; $b = 'b'; $a[0] = 'a'; print "[$b]"; my @a; local *b; # 動的スコープに注意 *b = \$a[0]; $b = 'b'; $a[0] = 'a'; print "[$b]"; my @a; local *b; # 動的スコープに注意
528 :
524 :03/03/03 01:47 ID:???
>>527 # 動的スコープに注意
は癖なんですが…。
他に問題あります?
529 :
518 :03/03/03 01:49 ID:???
530 :
nobodyさん :03/03/03 03:24 ID:MIMHRhQC
簡単な掲示板を作れるようになったんですが・・ 記事削除のやり方がワカランチンです。 投稿に記事ナンバーをつけ、削除のフォームに記事ナンバーを入力して 削除って形をやりたいんですが・・・ よかったら上記の簡単なコードの流れを教えて下さい。お願いします。
>>530 kentさんとかのソースをぱくるよろし
あとすれ違いっぽい
投稿時に削除Passを指定しといてそれと照合しればいい 管理人削除とか既にできてるならそれの応用で。
∩
∧_∧ | | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ´Д`)// < 先生!こんなのを発見シマスタ!
/ / |
/ /| / \
http://saitama.gasuki.com/hiroyuki/ __| | .| | \
\  ̄ ̄ ̄ ̄ ̄ ̄ ̄\ \_____________
||\ \
||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄
|| || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
.|| ||
534 :
nobodyさん :03/03/03 14:30 ID:yTVIkXIk
メインルーチンにあるハッシュの値の一つだけをサブルーチンで 使いたい場合、(例1)引数としてハッシュ丸ごと渡してサブルーチンで 取り出すのと、(例2)呼び出し前に取り出して一つだけを引数として 渡すのでは、呼び出し以降の効率の違いはあるのでしょうか? 例1 &shori (%DATA); sub shori { my %DATA = @_; $DATA{'name'} を処理 } 例2 $name = $DATA{'name'}; ← これは既に得られているものとする &shori ($name); sub shori { my $name = @_; $name を処理 }
>>534 引数にハッシュを指定すると、ハッシュの各要素がすべて展開されて渡されるから
効率は悪いかもしれない。特にサブルーチン側で別のハッシュにコピーするのは
ちょっと良くないんじゃないかな。
&shori(%DATA) → &shori('key1','value1','key2','value2', ... )
使う値が1つだけであれば、例2のように1つだけ渡すのがいいと思う。
またはリファレンスを使うとか。
&shori(\%DATA);
sub shori {
my $hashref = shift;
# $hashref->{name} または $$hashref{name} のように参照する
}
536 :
534 :03/03/03 18:45 ID:???
>>535 値渡しとリファレンスをうまく使い分けながらやってみることにします。
ありがとうございました。
537 :
nobodyさん :03/03/03 20:33 ID:F3LmFaEY
アクセスカウンターを作りたいのですが、 htmlからcgiを呼び出すときに、IMGタグを使って呼び出すには どうすればいいのでしょうか? イメージタグを出力するだけでは駄目なんですね。 ご存知の方いらっしゃいましたら、お願いします。
スレ違い
>>537 フリーのアクセスカウンター使ってろ。
それの仕組みが理解できるようになってから自作とかほざけ。
それに、ここはPerlのスレであってCGIのスレじゃねえ。
1嫁
厨房初心者な質問はここでよいのでしょうか?(すみません) ええと、時間なのですが、昨日の時間などとか、イロイロ出したいのですが一番手っ取り早い方法はなんでしょう。 今考えた方法は、現在時刻 2003/03/04/01:01.00 (年/月/日/時:分.秒) から引いたり足したり、繰り上げたりするのを考えたんですが、非常に効率悪くて作りにくいです。 特に、繰り上がったり繰り下がったりするのが大変です。 しかもうるう年とかよく分からないし。汗 超初心者な事やってますか?俺 どうやれば手っ取り早く出来るのでしょうか?
localtime(time() + $hoge) で増減分を$hogeにつっこむ。
544 :
542 :03/03/04 10:47 ID:???
な、なるほど! ありがとうございます。 あまりに俺が房だったようですね…。 単位は秒ですよね?秒でやってみます。 m(_ _)m
545 :
nobodyさん :03/03/04 16:01 ID:gscrXgmO
#! /usr/local/bin/perl mkdir('./testing',705); open (NTT,'./vcount/vcount.cgi')|| die "ファイルを開けません :$!\n"; @nt = <NTT>; close (NTT); open (VVT,'./testing/vcount.cgi'); print VVT "@nt"; close (VVT); exit(); "./vcount/vcount.cgi"の内容を"tester"ディレクトリの作りその下に"vcount.cgi"で作りたいのですが 上の記述ではフォルダが作られても中にファイルが生成されません。 どうしてでしょうか。要はあるディレクトリ内のファイルを全て別のディレクトリに自動コピーさせたくて とりあえず1ファイルに絞って書いてみました。どうすれば内容を自動コピーできるんでしょう。 環境はWin98とActive Perl、An HttpdをオンラインでダイナミックDNS経由で自分のPCのC GIを実行しています。
>>545 open (VVT,'>./testing/vcount.cgi');
それから print VVT "@nt"; だと期待と違った結果になるので注意。
print VVT @nt; のように汁。
547 :
534 :03/03/04 16:19 ID:???
バイナリモードで扱ったほうが後で文字化け防止になるだろう
checkboxで一旦チェックを入れたら、それ以降再びチェックして外すまで チェックが入ったままにするにはどうしたらよいでしょうか? 個人データを扱う物で、複数回内容を書き換える事を前提にしています。 ご存知の方いらっしゃいましたら宜しくお願いします。
549 :
nobodyさん :03/03/04 16:49 ID:gscrXgmO
>>546 ありがとうございます!!きっちり生成されました!!
助かりました!
>>550 そうか、関係ないのか・・・
逝ってきます。
553 :
552 :03/03/04 18:20 ID:???
ファイルのじゃなくてファイルにね。 で、checked属性にブール値を設定する
>>552 ありがとうございます。早速検索してやってみますね。
ネット上のデータ(例えばヤフーのトップページのソースとか) をPerlで読み込む場合はopen関数ではないんでしょうか? ペーペーにはまだまだ手の出ないコードでしょうか? 同ディレクトリとかつながっているディレクトリのデータを読み込む事を やっていて、ふと思ったので。
>>555 もうその質問何十回目だろう(笑
FAQでも作るべきかな?
LWP::Simpleってので調べてみるといいよ。
WinのActivePerlなら最初から入ってるはず。
HTMLで開始タグと終了タグが一致しているかどうか調べたい 例えば、<em>mona>/strong>や 終了タグの閉じ忘れでエラーがでる のですが、具体的にどうすればよいのかさっぱりです。 何がいい方法があれば教えて頂けないでしょうか。
559 :
557 :03/03/04 20:44 ID:???
<em>mona>/strong>でしたね。大して変わらないけど。
>>558 例えば掲示板の投稿時なんかに最低限のチェックをしたいだけなのでvalidatorはちょっとです。
561 :
577 :03/03/04 20:58 ID:???
また間違えてるし。
>>560 さん
タグは属性をもつものや空要素も含めて全て許可しています。
最低限属性を持たないタグの整合性だけでもチェックしたいのですが。
>>556 ありがとうございました。
方法はわかりましたが、導入難し・・・まだまだ先は遠いようで、いろいろ調べてみます。
>>561 がんばってスタックでも書いてみたら?
でも、< />な要素が入ると崩壊するか。難しいな。
>>561 難しいね。
その場しのぎの方法ならそれなりにありそうだけど、それでも
それなりにめんどくさそうだなぁ。
適当に書いてみた(超いいかげん)。
タグの中で'<'や'>'が書けないのは仕様です。
my $temp = $to_check;
$temp =~ s|<!--.+?(-->)||sg;
$temp =~ s{<(script|style).*?(</\1>)}{}sgi;
$temp =~ s{</?(br|p|li|hr|meta|input|img|base)[^>]*>}{}sgi; # 閉じないことを許可するタグ
while ($temp =~ s|<(\w+)[^>]*>[^<>]*(</\1>)||si){}
error() if $temp =~ /[<>]/s;
>>566 気づかなかった。
568 :
561 :03/03/04 22:53 ID:???
>>563 さん
取りあえずこんなの書いてみますたが
$data = "<a><b>a</b></a><c /><d></f>";
my(@stack) = ();
while($data =~ /<\/?(\w+)\s*.*?>/){
if($data =~ /<(\w+)>/){
push(@stack,$1);
}elsif($data =~ /<(\w+)\s*\.*?\/>/){
;
}elsif($data =~ /<\/(\w+)>/){
$tmp = pop(@stack);
if($1 ne $tmp){die "不整合";}
}
$data =~ s/<\/?(\w+)\s*.*?>//;
}
print "end\n";
なんかスマートじゃないですね。というかそれ以前に正規表現が怪しい。
属性がつくともうだめぽ
>>565 きっと誰も従いませんよ(w
ちょっと修正。 どっちにしても役に立たなさそうだけど。 $temp =~ s|<!--.+?(-->)||sg; $temp =~ s{<(script|style|pre|textarea)(\s[^>]*)?>.*?(</\1>)}{}sgi; $temp =~ s{</?(br|p|li|hr|meta|input|img|base)(\s[^>]*)?>}{}sgi; # 閉じないことを許可するタグ while ($temp =~ s|<(\w+)(\s[^>]*)?>[^<>]*(</\1>)||si){}
571 :
nobodyさん :03/03/04 23:22 ID:TX/Dujet
$str1="20030304" を使って $str2="2003年03月04日" を生成したいのですが どうすればよいですか?
>>571 $date =~ s/^(\d\d\d\d)(\d\d)(\d\d)$/$1\/$2\/$3/;
573 :
561 :03/03/04 23:24 ID:???
初めて見た特殊文字が多かったので解読に手間取りました。
正規表現雑技の方は$(の辺りが今一解読できてませんが。
>>570 さん
役に立たないなんてそんな。
\数字は目からウロコでした。さっき書いたコードが恥ずかしいです。
当面の間このコードを借用させて頂きます。ありがとうございました。
>>571 $str1 =~ s/(\d{4})(\d{2})(\d{2})/$str2 = qq{$1年$2月$3日}/e;
>>574 それは $str1 の内容も書き換えるので
($str2 = $str1) =~ s/(\d{4})(\d{2})(\d{2})/$1年$2月$3日/;
576 :
nobodyさん :03/03/05 23:48 ID:LLn1UqDh
何となく DB というものを使ってみたくなり、Perl で PostgreSQL を扱いたい訳なんですが・・・ ぜんぜん勉強法が見えてきません。“ Perl で”っていう時点で、もう駄目なのかなあ・・・やっぱ PHP なんですかね? もし宜しければ、オススメのサイトや参考書を教えて頂きたいのですが。
578 :
nobodyさん :03/03/06 00:04 ID:/oqmBN82
なるほど。DBI を勉強しろと言うことなのか・・・なるほど。
自分で作ったモジュールの中からさらにモジュールオブジェクトを作成すると newでの変数初期化がされない現象が起こるのですが、これはperlの仕様ですか? ↓-------------------- a.pl package a; sub new{ my $this=shift; my $a=0; my $obj{'obj'=>$a}; bless $obj,$this; return $obj;}1; ↓--------------------- b.pl package b; require('./a.pl'); sub new{ my $this=shift; my $b=0; my $obj{'obj'=>$b}; bless $obj,$this; return $obj;} sub test{ my $a = new a; print "a=$$a{'obj'}";}1; ↓--------------------- main.cgi require('./b.pl'); sub test {my $b = new b; $b->test();} ------------------------------------- 結果:a= (何も表示されない)
>>576 まずは道具をインストールする。
で、SQLを適当に理解する。
あとは、
connect prepare execute fetch finish disconnect
仕様=バグとか言うふざけた前提でほざいてると解釈して良いのか?
>>579 newは「変数初期化」なんて機能じゃないけれど。
>>579 前置(?)のnewは、コンパイルするときに、それが関数か、
メソッドかを決定しないといけない。
で、newっていうサブルーチンがある(ように見える)から、関数になった。と。
a->new()でどうだ。
584 :
579 :03/03/06 00:22 ID:???
>newは「変数初期化」なんて機能じゃないけれど。
あい、それは承知してます。
newでオブジェクトのメンバを初期化したいという意味でした。
>>579 の場合だと、a.plで
$a=0;
・・・
$obj={'obj'=>$a};
としているのに、bから作成したときは$a->{'obj'}に0が入っていないのです。
(0以外でも同様。main.cgiから直接作成した場合は初期化される)
これがバグなのか、仕様なのかどこにも説明してないので設計に困ってます。
585 :
579 :03/03/06 00:24 ID:???
perlobjにWARNINGって大きく書いてあるんだけどなぁ〜
>>580 どうもです!いろいろやってみるしかないですね・・・
590 :
nobodyさん :03/03/06 11:24 ID:rJoYB8KP
ActivePerlの5.6と5.8って共存できますか?
592 :
nobodyさん :03/03/06 12:35 ID:nlUIeg7X
あの… 日本語を交えて変数を作りたいのですが、 「全部」ハッシュにしたらアホでしょうか? $file{'ログファイル'} $file{'登録ファイル'} やっぱ重くなりますか? アホ丸出しのような気がしますが、この方が作りやすいんです。
>>592 そういう質問をするレベルならどうせ動かないから好きに作っていいよ。
ただしサーバには上げないでローカルでやってくれな。
>>592 日本語を使いたいのはわからんでもないですが、
はっきりいってアホです。
VB使え。
>596 そでつ
$変数 = 1; Unicodeでなんとかならんか?
>>592 別にいいんじゃない?
ハッシュの構造上、考えてるほど重くはならないよ。
ただ、他人がそのソースを見たら( ´,_ゝ`)プッ とは思うかも。
600 :
nobodyさん :03/03/06 18:20 ID:mX/0qgeV
>>592 そんなあなたにPerlのオブジェクト指向文法!
$this->{field} = 'test';
$this->{公安二課課長補佐} = undef;
主な利点:日本語がちょっとだけ目立たない。
BSD magazine No.12 P127〜P128 より > use encoding "euc-jp"; # スクリプトと同じ文字コードを指定 > use utf8; > my $人 = 1; > $人++; # 私たちは繁殖している!
602 :
601 :03/03/06 18:26 ID:???
要 Perl 5.8.0 な。
>>600 それができるのは、キーが\wのとき。日本語の場合は何かでくくらないとだめ
604 :
nobodyさん :03/03/06 20:58 ID:+0RpBVtX
すいません、ActivePerl-5.8.0.805-MSWin32-x86にwin32-apiをppmを起動してインストールしようとすると ppm> install win32-api Error: no suitable installation target found for package win32-api. と表示されインストールできませんでした。 ppm>sarch win32-api ppm> search win32-api Searching in Active Repositories 1. Win32-API-OutputDebugString [0.03] OutputDebugString Win32 API support ppm> install 1 Package 1: Error: no suitable installation target found for package Win32-API-OutputDebugString. サーチをかけてインストールしてもパッケージがないと言われます。 また、 no suitable installation target found for package の一文で検索をかけても英語圏HPしかでてこず、多分どこかにパッケージを ぶち込んだらOKだと言う解釈なのですがどうにもヘタレ読解力ではキビシイです。 アドバイスお願いできないでしょうか?
>>604 ありゃ、インストールされた。
日を改めてインストールしてみたら?
606 :
nobodyさん :03/03/06 21:13 ID:+0RpBVtX
粘って粘って3日目です(;´д⊂)
607 :
nobodyさん :03/03/06 21:46 ID:+0RpBVtX
しまった・・。 環境はXPproでc¥perlにperlをインストールしています。
609 :
592 :03/03/07 12:00 ID:???
>>593-600 分かりました。ありがとうございます。
別に
アホ丸出しだろうが
( ´,_ゝ`)プッと思われても構わないので
今後は全部ハッシュで作ろうと思います。
610 :
nobodyさん :03/03/07 16:16 ID:o/kX6MY9
特定のホストからのアクセスのみ通すアクセス制限をしたくて探したのですが、 逆の「特定のホストからのアクセスをはじく」アクセス制限のCGIしか見つけられず そこで、これを改造したら使えないかなあと考えました。 が、どこをどういじって良いのか見当がつきません。どなたかお知恵を貸してください・・。 @deny = ("*.co.jp","*.hoge.net"); sub get_host { $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; # gethostbyaddr関数を使用する場合は1 $gethostbyaddr = 1; if ($gethostbyaddr) { if ($host eq "" || $host eq "$addr") { $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2); } } if ($host eq "") { $host = $addr; } } sub axs { # ホスト名を取得 &get_host; if ($deny[0]) { local($flag)=0; foreach (@deny) { if ($_ eq '') { last; } $_ =~ s/\*/\.\*/g; if ($host =~ /$_/) { $flag=1; last; } } if ($flag) { &error("許可されていないアクセスです") } } }
612 :
610 :03/03/07 16:20 ID:o/kX6MY9
いっそシンプルにこうしたら・・・?? sub axs { &get_host; if ($_ ne "@deny"){ &error("許可されていないアクセスです")} }
613 :
610 :03/03/07 16:21 ID:o/kX6MY9
.htaccessもSSIも使えないです(^^;
以下のような過去10回のゲームの結果があります。 名前<->点数<->偏差値<-> の様になってます。 これを名前でuniqしたいのですが、賢い方法はあるでしょうか? 一応自分で作ったのですが、マヌケな感じで最後の人が表示されないようです。 識者の方、よろしくお願いします。 --(生データ)--- a<->17<->100<-> a<->20<->68.97<-> a<->20<->68.97<-> a<->27<->87.1<-> b<->27<->87.1<-> c<->13<->41.94<-> c<->14<->87.5<-> c<->22<->75.86<-> c<->22<->75.86<-> c<->8<->47.06<-> d<->14<->82.35<-> d<->14<->87.5<-> d<->25<->86.21<-> d<->25<->86.21<-> d<->31<->100<-> e<->16<->100<-> e<->17<->100<-> e<->27<->93.1<-> --(生データ)---
>>614 です。
自分で作ったマヌケなプログラムです。
@sortedに生データが入っているとして、
foreach (@sorted){
($s_name,$s_point,$s_rate) = (split(/<->/))[0,1,2];
if($s_name eq $old_name){
$total_p = $s_point + $old_point;
$total_rate = $s_rate + $old_rate;
$old_name = $s_name;
$old_point = $total_p;
$old_rate = $total_rate;
$howmany ++;
}elsif ($s_name ne $old_name){
$average=sprintf('%4.2f', $old_point / $howmany); $average+=0;
$rate_avg=sprintf('%4.2f', $old_rate / $howmany); $rate_avg+=0;
push(@uniq, "$old_name<->$old_point<->$howmany<->$average<->$rate_avg\n");
$old_name = $s_name;
$old_point = $s_point;
$old_rate = $s_rate;
$howmany = 1;
}else{ print "Error!! does not match!!\n";}
}
shift @uniq;
@uniq = reverse sort { (split(/<->/,$a))[3] <=> (split(/<->/,$b))[3] } @uniq;
616 :
610 :03/03/07 16:33 ID:o/kX6MY9
>>612 待った・・・根本的なところが、、、 ごめん、超厨房な質問。 $_ の意味はなんでしょう。$名前 (変数)とは違いますよね。 #手元の入門書には$hogehogeと@hogehogeの説明はあるんだけど$_がない
>>616 デフォルトで入る変数だよ。
@deny で foreach してるなら、その中の各行が$_に入ってる
618 :
610 :03/03/07 16:37 ID:o/kX6MY9
>>617 そういうことなんですね・・。 ということは>>612はダメじゃん(死)
619 :
610 :03/03/07 16:39 ID:???
あげてしまった・・・。
620 :
614 :03/03/07 16:43 ID:???
これでどう?試してないけど。 それよりおらの質問にも答えてけれ foreach (@deny) { $_ =~ s/\*/\.\*/g; if ($host =~ /$_/) { last; } } if ($_ eq '') { $flag=1; last; } if ($flag) { &error("許可されていないアクセスです") } } }
621 :
614 :03/03/07 16:47 ID:???
上のダメだわ。これは? foreach (@deny) { $_ =~ s/\*/\.\*/g; if ($host =~ /$_/) { last; } }else{ &error("許可されていないアクセスです") } }
622 :
610 :03/03/07 16:50 ID:???
>>620 おあ、ありがとう。
今思いついて書き込もうとしたんだけど、おもっきし間違ってたよーです(冷汗)
>それよりおらの質問にも答えてけれ
ごめん・・・わっちには手に余るんだ・・初心者すぎて(苦)
#掲示板カスタマイズくらいしか経験ない。
623 :
610 :03/03/07 17:03 ID:o/kX6MY9
これで大丈夫みたい・・・(エラーは出なかった)
sub axs {
&get_host;
foreach (@deny){
if ($_ eq '') { last; }
$_ =~ s/\*/\.\*/g;
if ($host =~ /$_/) { last; }
if ($_ ne "@deny"){ &error("許可されていないアクセスです")}
}
}
アクセスをはじけてるかどうかはまだチェックしてないけどね。
>>614 さん、ありがとう(*^^*) 感謝です。
ある文字列を16進で縦に出力する方法を教えてください 例"5aB0" ↓ 0x35 0x61 0x42 0x30
625 :
nobodyさん :03/03/07 19:38 ID:UTyY6aWY
>>624 $str = "ある文字列";
chomp $str; # 必要なら
foreach( split //, $str ){
printf "0x%x\n", ord;
}
627 :
nobodyさん :03/03/07 19:58 ID:UTyY6aWY
>>614-615 エラーチェックはしてないでつ
あと@uniqの内容がこれで良いのか自信なし
@sorted = でーた;
@uniq = ();
my %count = ();
my %sum_point = ();
my %sum_rate = ();
foreach(@sorted){
my($name, $point, $rate) = (split /<->/)[0..2];
$count{$name}++;
$sum_point{$name} += $point;
$sum_rate{$name} += $rate;
}
foreach(sort keys %count){
my $ave_point = sprintf "%4.2f", $sum_point{$_} / $count{$_};
my $ave_rate = sprintf "%4.2f", $sum_rate{$_} / $count{$_};
push @uniq, join("<->", $_, $sum_point{$_}, $count{$_}, $ave_point, $ave_rate);
}
今変数内に、HTMLタグを含む文字列が入ってます。 質問1.この中の<br>タグ(大文字のタグも含む)の数を数えたい場合どうすればいいでつか? 質問2.この中の後から数えてn番目の<br>タグ(大文字のタグも含む)以降の文字列を別変数に入れたい場合どうすればいいでつか? お頼み申し上げ候
>>628 #三回マッチ
$val = "1<br>2<br>3<br>4<br>5<br>6<br>7<br>";
$val =~ /((.*?<br>){3})/;
print "$'\n";
630 :
629 :03/03/07 21:32 ID:???
括弧が一つ多かった。 大文字も含むなら $val =~ /(.*?<br>){3}/i;
>>628 2.の良い方法が思いつかないけどとりあえずこんなんで
index使ったほうがいいのかな
1. count_br(文字列)
2. separate_br(文字列,n番目)
sub count_br{
my $str = shift;
return ($str =~ s/<br>//ig);
}
sub separate_br{
my($str, $cnt) = @_;
$cnt = count_br($str) - $cnt;
my $pre = join "<br>", (split /<br>/i, $str." ")[0 .. $cnt];
return substr($_[0], length $pre );
}
my @line = $str =~ /[^<]*<br>/ig; my $new = join('', @line[ $n .. $#line ]);
$'を使うものの方が速そうだな。あぁ
634 :
631 :03/03/07 23:12 ID:???
>>632 漏れもそれを最初は考えたんだが、<BR>以外のタグが
あったときなんかはどうすれば良いのでしょう?
回避方法が思いつかずあんな恥ずかしいソースに…
635 :
614 :03/03/07 23:20 ID:???
>>627 ありがとう。
ちょっと手直ししたらうまくできましたーー。
きれいなコードで早そうですね。
まじさんくす。
>>634 はぅー考えてなかった。
そこは否定先読みで何とかできるかな。
$val = "1<br>2<br>3<br>4<br>5<br>6<br>7<br>"; my $want = 3; # 3以降 my $count = 0; my $after = ''; while($val =~ /<br>/ig){ if (++$count == $want){ $after = substr($val, pos($val)); } } print "count=$count after=$after\n"; 出遅れた…。
638 :
631 :03/03/07 23:33 ID:???
>>636 n番目の<BR>以降がn番目の<BR>を含まないならこうでいいのかな?
ベンチマークしたらほとんど変わらなかったけどソースすっきりです。
sub separate_br{
my($str, $cnt) = @_;
my @line = $str =~ /.*?<br>/ig;
return join('', @line[ ($#line-$cnt+2) .. $#line ]);
}
なるほど。最短一致ですか。先読みとか言ってた自分はアホですな。
640 :
:03/03/08 01:05 ID:???
timesで何かそれらしき物(CPU時間)が出てくるから、少しは参考になるかも。
642 :
628 :03/03/08 03:36 ID:???
>>629-634 ,636-639
うまくいきました。
ありがとうございます。
今回は漏れの厨な脳に一番マッチした637さんのを使わせていただきました。
ただ、後から数えてn番目の<br>タグ以降の条件が前から数えてになってまつた。
CJ ClubのCGIってそんな負担だったのか…。 私も詳しく負荷率調べる方法教えて欲しいのです。
644 :
:03/03/08 06:43 ID:???
ローカルでHTML表示部分をループさせて process viewer見てたら、perlだけで30%近く いきますね。
645 :
nobodyさん :03/03/08 08:09 ID:ijgyFeL7
45
646 :
nobodyさん :03/03/08 09:22 ID:2Y4AuOip
それここに書いてある
http://homepage3.nifty.com/digikei/ http://homepage3.nifty.com/digikei/sample/sample.html ,、-―-、
丿 <`) __
,、- ''' "二ヽ_(ヽ'`(二ニ・ | \_
/ 、 !__'、_┌´ │ / `' ー┐
/ ヽ | ` | | |
___ | ヾ__| | _,、r‐'',ニ=- | / _,、-‐'゙
_| '、| ミ/ ゙、 |_,∠-''´ ̄`'ー、  ̄|-''" |
\|. | l___l / ̄ヾ`´` | ̄ ̄ ̄`'''iー、
. |/゙|  ̄ ヽ_,、-''´`ヽ _,、,、,、,、_|______|_
| ( ´ ,、- ''゙ 丿 ヾ二二二二二二二二二|ニ!
ヽ<二二二二二>~/ / / └‐┬─‐────┬┘
>>644 負荷かけてんだから当たり前なわけだが。
>>647 スクリプティングによる差は出ませんか?
>>648 そりゃ場合によっては差も出るだろうが
「HTML表示部分をループ」
だけならそんなに変わんないんじゃ?
>>649 掲示板の、
ログデータ読み込んで整形してHTMLで出力させる
みたいな感じです。
他で差が出るとすると連続書き込みさせた場合ですかね。
child tree のソースをちと読んでみた。
これは… 激しく読むのが苦痛。
CPU負荷は環境によるので一概には言えないが、
メモリにはかなり厳しそうなスクリプトですな。
で、
>>640 を読む限りだと
・禁止してないスクリプトなら設置していいよ
・でも負荷が高いときは勝手に止めることがあるからね
ということなので、CPU負荷は調べる必要ないかと。
652 :
世直し一揆(コピペ推奨) :03/03/08 13:01 ID:lDVM7LmW
<血液型A型の一般的な特徴>(見せかけのもっともらしさ(偽善)に騙されるな!!) ●とにかく気が小さい(神経質、臆病、二言目には「世間」(「世間」と言っても、同じA型を中心とした一部の人間の動向に過ぎないのだが・・・)、了見が狭い) ●他人に異常に干渉し、しかも好戦的でファイト満々(キモイ、自己中心、硬直的でデリカシーがない) ●妙に気位が高く、自分が馬鹿にされると怒るくせに平気で他人を馬鹿にしようとする (ただし、相手を表面的・形式的にしか判断できず(早合点・誤解の名人)、実際にはた いてい、内面的・実質的に負けている) ●本音は、ものすごく幼稚で倫理意識が異常に低い(人にばれさえしなければOK!) ●権力、強者(警察、暴走族…etc)に弱く、弱者には威張り散らす(強い者にはへつらい、弱い者に対してはいじめる) ●あら探しだけは名人級でウザイ(例え10の長所があってもほめることをせず、たった1つの短所を見つけてはけなす) ●基本的に悲観主義でマイナス思考に支配されているため性格がうっとうしい(根暗) ●単独では何もできない(群れでしか行動できないヘタレ) ●少数派の異質、異文化を排斥する(差別主義者、狭量) ●集団によるいじめのパイオニア&天才(陰湿&陰険) ●悪口、陰口が大好き(A型が3人寄れば他人の悪口、裏表が激しい) ●他人からどう見られているか、人の目を異常に気にする(「〜みたい」とよく言う、 世間体命) ●自分の感情をうまく表現できず、コミュニケーション能力に乏しい(同じことを何度 も言ってキモイ) ●表面上協調・意気投合しているようでも、腹は各自バラバラで融通が利かず、頑固(本当は個性・アク強い) ●人を信じられず、疑い深い(自分自身裏表が激しいため、他人に対してもそう思う) ●自ら好んでストイックな生活をしストレスを溜めておきながら、他人に猛烈に嫉妬 する(不合理な馬鹿) ●後で自分の誤りに気づいても、強引に筋を通し素直に謝れない(切腹するしかない!)●自分に甘く他人に厳しい(自分のことは棚に上げてまず他人を責める。包容力がなく冷酷) ●男は、女々しいあるいは女の腐ったみたいな考えのやつが多い(例:「俺のほうが男 前やのに、なんでや!(あの野郎の足を引っ張ってやる!!)」)
653 :
nobodyさん :03/03/08 14:48 ID:GxFJGMsn
すいません、デコード処理のルーチンの一部なんですが $in{$key} .= "\0" if (defined($in{$key})); の「.」ってなんでそう?探してもみつからず、気になって気になって 夜も寝ずに昼寝してしまいます。
>>653 文字列の連結。 +=とかと同じシリーズ。って言うか基礎。本読め。
>>653 $a = $a . $b;
$a .= $b;
上を短縮した書き方が下。
他に += とか、ほとんどの演算子でこのような記法ができる。
あぁなるほど、いやね、妙に半角一マス空いてたんで違う意味なのかなって思ってマスタ。 ありがとうございました。これでぐっすりできます。多謝。
657 :
nobodyさん :03/03/08 18:26 ID:6Zv33rxC
以前定数は use constantがイイ! という意見が出てるのを見てから見栄えも上級者っぽい という事もあって使いまくってたんですけど 何故配布CGIとかだとさっぱり使ってないんでしょう? そんなの配布サイトに聞けッ!て感じですけど ご意見聞かせて下さい。
constとenumで
配布CGIの作者は必ずしもPerlの達人ってわけじゃないからね。 糞みたいなスクリプトでもそこそこ動けばいいんだよ。 あと、Perl4でも動くようにっていう配慮もあるかも。 (でも実際は新しい記法についていけてないだけの人のほうが多そうだ)
660 :
657 :03/03/08 18:46 ID:6Zv33rxC
>>658-659 ありがとうございます。
配布CGIのほとんどが使って無いので
何か自分の知らない落とし穴でもあるんじゃ?と思ってました。
ほんのわずかでも早くなってデメリットが無いのなら
使わない手は無いという感じで、これからもビシバシ使おうと思います。
上から順に読むんだからインライン展開とかできないだろが
配列@_内の重複した要素をまとめてユニークにするロジックなんですが・・ @a=grep(!$b{$_}++,@_); foreach (@a){ print "$_\n"; } grepの第一引数の意味がよくわかりません。({$_}とか++の意味) 重複したものを探して真の場合は取り除いている ようなきはするのですが・・ どなたか教えてください。
664 :
nobodyさん :03/03/08 19:49 ID:g3+hGhZv
現在KENT WEBのSunbbsを改造しています。 それで新着情報ボードモードにしてあるので $comと比較して「二重投稿禁止」のエラーを出させないようにしたいんですが # 二重投稿の禁止 ($num,$name,$com) = (split(/<>/, $lines[0]))[0,2,5]; &error("二重投稿は禁止です") if ($in{'name'} eq $name && $in{'comment'} eq $com); ↑この部分を全部消したら$numに干渉せず 記事全て[1]になってしまいます。 $in{'comment'} eq $comだけを消してもエラーが出てしまいます。 どなたか教えてください。
>>663 まず初期状態では %b は未定義なので、評価するとすべて偽。
grepの第1引数は、真で返すとその要素が戻り値のリストに入る。ここまでOK?
要素をキーとして $b{} を評価する。これが偽なら、はじめて出てくる要素なので
この要素をgrepの戻り値として返す。そのとき、第1引数は真にしないといけないので
!で反転させている。で、++して「その要素はすでに返した」というフラグを立てる。
これを繰り返す。
同じ要素が出てくると、$b{} は++されているので「真」になる。!で反転させると偽になり、
grepの戻り値としては返されない。結果、同じ要素は複数返されないことになる。
説明下手でスマソ
>>664 2行目だけ消せばいいと思われ。
>>663 $b{} はハッシュの要素を指す
! は論理否定
$_ はデフォルトの対象となる変数
(この場合はgrepによって第二引数=リストの一部が設定される)
++ はオートインクリメント(この場合は後置:式の評価後、インクリメントが発生)
667 :
664 :03/03/08 20:19 ID:???
>>665 OKでした。
2行目にも$comの記述があるから、と消そうとしなかった僕はアホですね。
ありがとうございました。
668 :
663 :03/03/08 20:43 ID:???
質問てか教えてなんだけど、簡単なアクセスカウンターの作り方 教えてください<(_ _)><(_ _)>ペコペコ 検索してもよく出てきませんでした(恥 お願いします(たたかれてもメゲマセン←ハァ?
>>669 あっちで答えてやったのでは不満か?傷ついた。
windows環境でperl勉強しています。 フルパスからファイル名を取得したいので 以下のように作りました。 一応機能的にはokなんですが、もう少し格好良くperlっぽいやり方があれば教えてください。 なんか無駄が多いような・・ $_=$0; $_=~ s/^(.*)\\(.*)$/\2/; print "$_\n";
674 :
名無し.net :03/03/08 22:05 ID:HY3rXLfE
はじめまして。 連想配列(?)についての質問なんですが、 $temp->{'001'} = "1"; $temp->{'002'} = "2"; $temp->{'003'} = "3"; という配列があり、これを通常の連想配列(ハッシュ)で while (($name, $value) = each(%temp)) { print "$name = $value<br>\n"; } とやるのと同じ事をしたいのですが、可能なのでしょうか? ご存知の方がいらしたら是非教えてくださいm(__)m %tempを$tempにしたら、500 Internet Server Errorになってしまいました。
%{$temp} だっけ…、ちと動作させてないから動くかわからん。
677 :
名無し.net :03/03/08 22:14 ID:HY3rXLfE
>> 676 おお。 出来ました。 ありがとうございましたm(__)m
>>672 use File::Basename qw(basename);
print basename($0);
>>674 普通にハッシュを使うのではいけないのかな?
$temp{'001'} = '1';
# ...
まぁ、普通にデリファレンスすればいいんだけどさ。
while(my($name, $value) = each %$temp){
# ...
}
でも、サーバーで実験するのはやめたほうがいいよ。
ローカルマシンにperlを入れなさい。
>>672 $_=$0;
($_)= /.*\\(.*)$/;
print "$_\n";
んーいまいち
ローカルサーバでテストしてるのかも。 CGIとして実行するとエラーは全部500になっちゃうから、ちゃんと エラーメッセージの見られる環境を用意したほうがいいよ。 (コマンドラインで実行させるとか、CGI::Carpモジュールを使うとか)
来訪者のホストを表示させるスクリプトを教えて下さい。
682 :
名無し.net :03/03/08 22:36 ID:HY3rXLfE
>> 678 Subroutineを梯子して使っているので変数形式のほうがいいかなぁと思いまして・・・。 っていうか、連想配列でのやり方知らないので(苦笑。 すいません。 一応、perlはインストールしてありますが、アップロードして実行して動くか調べてます(ぉぃ やっぱサーバーに悪影響ですよね・・・。
>>681 表示させるって、「どういう環境で?」「どこに?」「どういうとき?」
質問するほうが省略してどうする!
>>683 すいません。
トップページを開いた時画面内どこでもいいですので表示させたいのです。
Perlと関係ない質問には答えんなってば。
>>681 みたいなのはどうせクレクレ厨なんだから、技術的なアドバイスしても
徒労に終わるぞ。
689 :
687 :03/03/08 23:29 ID:???
そういえばここはPerlスレか。
来訪者のホストを表示させるスクリプトを教えて下さい。 なにこの質問 このスレを舐めてるの?
書き込まれた内容を逆から表示したいのですが(例えば「あいうえお」を「おえういあ」) reverseで反転すると日本語が化けてしまいます。 1バイト文字、2バイト文字が混在していても上手く反転して表示するには、どうすればいいのでしょうか? また、改行(<br>)とかあっても正常に改行されて、且つ文字化けしない・・・。 よろしくお願いします。 技術的に難しいですか?
print $ENV{REMOTE_HOST};
>>692 文字コードは何なのか?
モジュールは使っていいのか?
perlのバージョンはいくつか?
695 :
nobodyさん :03/03/09 02:36 ID:teyBWd6E
use Benchmark; timethese(10000,{ 'ex1'=>sub { print "テスト\n"; }, 'ex2'=>sub { print << "EOM"; テスト EOM } }); をDOSプロンプトで実行すると テスト テスト テスト テスト ・・・・ テスト ex2: 0 wallclock secs ( 0.60 usr + 0.00 sys = 0.60 CPU) となります。 ex1: の結果をex2:のすぐ下にでも表示させたいのですが、 どうすればよいのでしょうか。 この結果(ex1: ex2:)はどこかの変数に入っているんですか? アホな質問ほんとスミマセン・・・・。
>>692 print &jreverse('一応作ってみた。Shift-JIS限定。<BR>とか改行は考慮してないんでそのへんはうまく修正してちょ。');
sub jreverse {
my $str = shift;
my ($i, $f, @jchar) = (0, 0, () );
foreach (unpack('C*', $str)) {
$jchar[$i] .= chr($_);
if (!$f && (($_ > 0x80 && $_ < 0xa0) || ($_ > 0xdf && $_ < 0xfd))) {
$f++;
} else {
$f = 0;
$i++;
}
}
join("", reverse @jchar);
}
>>695 my $r = timethese( 略 );
foreach(keys %{$r}){
my($sec, $usr, $sys, $cnt) = @{$r->{$_}}[0,1,2,5];
printf "%10s: %2d wallclock secs (%5.2f usr + %5.2f sys = %5.2f CPU) @ %.2f/s (n=%d)\n",
$_, $sec, $usr, $sys, $usr+$sys, $cnt/($usr+$sys), $cnt;
}
698 :
697 :03/03/09 03:33 ID:???
書き忘れ どんなモジュールでも質問する前にドキュメント読むように。 perldoc モジュール名 で、usr+sys = 0 のとき上のルーチンではエラーになるので 適当に直して使ってください。
699 :
695 :03/03/09 04:53 ID:xiqLThI6
>>698 ありがとうございます。
perldoc も読み、更にその日本語訳もネットで読みましたが
まったくわかりませんでした。
そして usr+sys=0 のとき というのがどんな時なのかも
わかりません。よって直し方もわかりません。逝って来ます。
>>692 # shift-JIS 限定
$s = "こんにちは、世界!";
$s =~ s/([\x81-\x9f\xe0-\xfc])([\x40-\x7e\x80-\xfc])/$2$1/g;
$s = reverse($s);
print $s;
701 :
700 :03/03/09 08:58 ID:???
しまった、またしても…。 <br>は適当に処置をよろ。s/>rb</<br>/g;とか。
もしかしたらperl云々の問題かもしれませんが、 unlink ファイルを削除 rmdir ディレクトリを削除 のディレクトリってのは要するにフォルダのことでしょうか? 今まで同義のような曖昧な解釈でしたので一度ビシっと言ってやってください。
ディレクトリのことをウイソ厨はフォルダと呼ぶらしい
そのウイソ房に気が向いたら説教してくだせぇ
706 :
704 :03/03/09 09:37 ID:???
URLは前半だけでもうまく貼れるんだなぁ ぉぃ
707 :
704 :03/03/09 09:45 ID:???
って擦れ違いじゃねーか! こんな香具師にレスつけるなんて… ダメボ…。
>>706-707 暇だね・・
>>705 アリガトウございました。よくわかったようなわからないような。
これからチャント理解できるように詰めていきます。
use constantを使う場合と変数を使う場合では速度に差が出たりするのでしょうか。 また、ourなるものがありますが、皆さんどういう場面で使われるのですか?
>>710 初心者にはそう説明したくなる気もわからんではないがな。
>>710 取りあえず掲示板に数人がかりで理路整然と論理を突きつけてみるのはどうか?
print "abc","def"; は print "abc"; print "def"; と同義ですか?それとも print <<EOM abc def EOMと同義ですか? 鯖負荷を軽減させようとEOM使うのはやめたんですがカンマ区切りだと意味がないような気がしてきたので 書籍を見てもPerlだとメモリーの使い方は書いてなかったりする(欝
>>714 Perlがどうメモリ管理をしているのか知りたかったら、Perlのソースを読め。と言ってみる(藁
>>714 どちらかというと前者。
しかし、メモリの使用量云々を気にするなら、
print文の使い方より変数の使い方を気にすべき。
>>718 そういうツッコミは無知を露呈するだけだと思うがどうか
perlスレだし
>>719 Perlで実行速度や消費メモリを気にしすぎる方がどうかしていると思うが。
どんな言語でもコーディングで効率化は図れると思うが。 インタプリタやスクリプトなら最適化が難しい分余計に。 他の言語を使えというのはひとつのソリューションだろうが、 このスレの趣旨ではなかろう。
だから(ryってしてるんだと思うよ。多分。
>>714 深読みしすぎかもしれんが、
<<EOM;
EOM
この記法は「EOM」じゃないからね。
ソース出さずに「EOM云々〜」って質問すると恥かくから気をつけよう。
>鯖負荷を軽減させようとEOM使うのはやめたんですが これどういう意味なんだ?
>>724 End Of Message かなあ。
>>725 ヒアドキュメントのほうが負荷が大きいと判断したのかと。
どっち使ったところで殆ど変わらんのじゃ?
730 :
nobodyさん :03/03/09 18:06 ID:2bzPHLiw
便乗質問なんですが、HTML出力をprint文で書く時 print <<"HTML"; <html> ほげほげ </html> HTML と書いているのですが、どこかで「HTML」と書くのは"格好悪い" と書かれていた気がします。。 慣例的にはなんと書けば良いのでしょう? EOFとかになるんでしょうか?
>>730 print <<"NULLPO";
<html>
ぬるぽ
</html>
NULLPO
∧_∧
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>731
>>730 別にいいんでないの?
asm{}みたいなもんだし。
734 :
nobodyさん :03/03/09 18:26 ID:2bzPHLiw
asm{}??? 「HTML」格好悪くないですか?? できれば慣例とか知りたいです。 そういう慣例ページみたいのあればうれしいんですが。。
>>734 それは公開されている数々のスクリプトを見ればいいと思うけど。
慣習というか、一般的には結局終わりを示すわけで END_OF_??? EO? こんなのが多いと思うけどさ。 ラベルと一緒でそれとわかれば何でもいいんじゃないの?
737 :
nobodyさん :03/03/09 19:27 ID:vWAYxQig
>>735 ごもっともです。けど見てみたら同じHTML出力でも
統一されてないようだったのでいったい何の略だ?
と思いまして。。
>>736 なるほど。勉強になりました。EO?をよく見ると思ったら
そういう理由だったのですか。こういうのはEOM、こういう場合は
EOFとか暗黙の常識?みたいのがあると思ってました。
(ある程度はそういうのがあるのでしょうけど)
ありがとうございました。
print <<"おわり"; 日本人なら日本語で。 おわり # ネタだからね、多分!
慣習的にEOFをずっと使ってた……。 このスレ読むまで意味を考えたこともないことに気付いた。 HTMLはダサくないと思う。 むしろ、そこはHTMLの出力部分であることを明示する意味で、 ソースの可読性に貢献してると思う。 俺も少し考えてみるか……
740 :
714 :03/03/10 01:07 ID:???
実行共用サーバーを使っているので消費メモリは気にしたいんです 実行速度は確認画面などで時間稼ぎをすればある程度はごまかせますが 機械は誤魔化せないのが辛いです ちなみに漏れはEOM=End of Messageだと思ってます EOFは本来ファイルの終わりをさす言葉なので途中で書くことはためわれます ヒアドキュメントを使うというのは@array=<FH>同様に一気にメモリーを使って実行してしまう書法 対してprint "abc"; print "cde";はwhile()同様にメモリーの消費を抑えて実行する書法だと思っているのですが だと思っていましたが間違いでしょうか?
741 :
714 :03/03/10 01:11 ID:???
あ、意味不明なたとえにしてました @array=<FH>; print @array; がメモリーの無駄遣い print <FH> while(<FH>); ということで、考えてみてください ついでに695ではありません
別になんだっていいんじゃないの、自分の好きなので。<HTMLでもEOMでも そんな些細な事にいちいちカコイイ!!とかカコワルイ!!とか言ってる方が何か変よ。
>>740 メモリの消費と言うが、ヒアドキュメント程度でperlがシステムから確保する
メモリを使い切るようなコードを書いてるならそっちが問題だろう。
特にサイズを指定しない場合のメモリサイズ知ってるか?
そうそう、答え
>間違いでしょうか?
間違いです。メモリに格納はされません。
>>741 考えるまでもない例えだろ。
744 :
714 :03/03/10 04:24 ID:???
>>743 メモリを確保しないでどうやって書き込むんですか?
まぁ、結局View記述言語はPHPとかJSPな感じの記述法が最適な訳だが。
>>746 IIS+ActivePerl で PerlScript 使えばよろし
こんばんは。 PerlにはPHPのstaticに相当する関数ってありますか? それなりにPerlを扱ってきたにもかかわらず、今まで知り得なかったので もしあったら便利だなーと。
>>748 perlfaqにあるね。staticキーワードは無いが、実現は出来る。
perldoc -q static
...
BEGIN { # BEGINが不要なケースもある。が、あったほうが安全
my $counter = 42;
sub prev_counter { return --$counter }
sub next_counter { return $counter++ }
}
...
>>748 13:37にこんばんわって日本に住んでないのか?(w
こんばんは。 Perlで半角カタカナを文字化けさせないように利用するにはどうすれば良いでしょうか? jcode.plを使うと文字化けが発生するのですが・・・。 全角カタカナに直す以外の方法で教えてください
>> 752 そんなぁ〜(><)
Shift-JISならjcode.pl使っても文字化けしない?
>>755 Shift-JISで通すならjcode.plはいらない。
もちろんEUCでデータを送られたら化ける。
ところで、ページをSJISで表示してるのに、フォームからEUCで送られてくるってこと
あるのかな?前から疑問なんだけど。
>> 756さん 出力はJhift-JISにしてますけど、コードやDBはEUCを使ってます。 あと、メールを使うときはjisに変換したり・・・。 なのでjcode.plをどうしても使ってしまいます。
100行くらいのテキストファイルがあったとして、 そのファイルの50行目の値が欲しい時、直接50行目の値を取得することできるんでしょうか。 49回スルーさせるんじゃなくて。
759 :
名無しさん@Meadow :03/03/11 09:24 ID:i+lsKHdV
当然シフトJISで通したら正規表現は転ける。encodeプラグマ使えば別なんだろが。 そもそもネットで半角(ry >758 固定長ならseekで。可変長なら無理ぽ
761 :
Fox :03/03/11 10:58 ID:eJEHBp/l
たしか、、半角カナは日本特有のコードだから化けるんじゃなかったカナ〜
>>756 ブラウザの実装次第になってしまうのでありうる。
>>757 EUCで半角カナをどう扱うか考えてみましょう。
無理ぽ
>>758 head -50 text.txt | tail -1
前にもここにかいたのですが、 掲示板にはいる前のページとかに 最後に書いた人の名前と時間が表示されてるのがつくりたいです。 ちなみにiモードでやりたいです。
>>764 ひとつ質問していい?
何でこのスレで聞くの?
>>757 なんで出力をEUC-JPにしないの?Shift JISにしないとなにか問題あるの?
769 :
の :03/03/11 13:56 ID:2/UrfMw3
>>760 インデックス持ってれば、可変長でも seek で可能だな。
ファイルポインタを末尾から数えて3行目に移動なんてできますか?
>>773 わかるよ。3行目と3文字目を間違えてるんだろ、要するに。
exitってさ、ライブラリから使ってもOKだよね? 完全にプロセス死んでくれるよね? まさかライブラリのみ終了してますた。なんてオチはないよね? 内部処理とかはどーなってるのか全然知らないんで…。 m(__)m
778 :
776 :03/03/11 15:56 ID:???
どーもありがとうでした。
>>770 ファイル内部に行なんていう概念はない。
\n毎に行と考えたいのだろうが、ファイルにとってはただの1文字。
どうしてもやるなら読み込んでから改行の数と位置を調べて
計算して3行目に相当する位置へseek。
780 :
nobodyさん :03/03/11 16:48 ID:4+uSO65s
ルーチンaaaで使う変数は全てレキシカル変数(my)とする。 って言う便利な記述はないですか? ないですよね?
781 :
770 :03/03/11 16:56 ID:???
上手い方法はないのですね。ありがとうございました。
784 :
nobodyさん :03/03/11 19:16 ID:8fW/w1hx
ウェブメールのパスワード(半角数字4文字)が分からなくなってしまい、 数字を1万通り入れればいいんですけど、さすがに時間の都合で難しい 登録した時のアドレスが違うのかパスワード再発行が処理されない。 以上の状態 他の板で テキストエリアに入力するよりPerlでも使ってガーっとpostし たほうが簡単。 といわれましたが、perlは使った事がないんで何とも。 その板の住人に聞くのも板違いかと思って、こちらに移りました。 自分で検索した所、イメージ的に 1,自分のPCをperlが使えるようにする。(できた) 2,perlにてパスワードのエリアにpostするためのファイルを作成 3,自分のPCから実行し、パスワードテキストエリアに挿入 という事で、だいたい合ってますか?
>>784 犯罪に結びつく可能性があるので教えない。
同情誘っても無駄。お帰り下さい。
>>785 一応、同情を誘うつもりはありません。
質問スレなので、詳しく書こうかと思って。
その辺伏せれば、まともな答えが返ってこないですよね?
>>786 書いたところで帰ってこないと思うよ。総当たりのパスワードクラッキングの方法なんて。
>>787 お説教でしょうか?
まあ、だいたい合っているというのであれば、それはそれで
いいです。
後は自己責任でやります。
どうもありがとうございました。
>>788 >まあ、だいたい合っているというのであれば
すまん、上2行くらいしか読んでない。
Brute Force Attackというやつだね。
>>791 既にフローチャートじみた物は頭にあるがその使い古された挑発には乗る気にならない。
パスワードが通ったか通らなかったかの判断分岐が ちょっと面倒そうだなあと言ってみるテスト。
>>793 ダメだったときの結果はわかるのだからそのelseで良いんではないかと考えた。
と、誘導尋問ならおもしろいなと思ったテスト。
>>792 質問に関しては解決したと見ていいです。
挑発してません。
スクリプト荒らしですか?
>>784 perlでpostが1〜3にないんだが、
フォームには手でコピペするのかなあ?
(σ´∀`)σゲッツ!?
最近放置できない熱いハートの持ち主が多いなぁ・・・
逆に自作自演かも。(笑 その前に釣られたあなたもはーとびーと
私はまるでCGIのことがわからんのですが、 多人数同時参加型のネットゲームが作りたいです。 どうすればよかとですか?
>>804 取りあえず基礎を勉強してくれ。
レーサー志望にアクセルの踏み方から教えていたら日が暮れる。
変な質問なんですが・・・ perl本体とlib(*.pm)のそれぞれをBuildするコンパイラが違ったりすると マズい事になりますか? 具体的にはSolaris。perlがSUNのccでBuildされ、lib類(CPAN等)はgcc でBuildされた場合・・・って感じです。 Shared library 周りで不整合が起きる様な気もするんですが、手元にSUNの ccが無いので試す事が出来ません。
ActivePerl-5.8.0.805-MSWin32-x86.msi をインストールし、さらにImage::Magickを
インストールしようと思ったのですが、ppm で検索をかけても見付かりません。
http://ppm.activestate.com/PPMPackages/zips/ で 8xxを見たら確かに無いので 6xxにある Image::Magick.zip を使って
ppm install Image-Magick.ppd
したのですが以下のようなエラーが出てきてしまいます。
Error: no suitable installation target found for package Image-Magick.
これはどのように対処したらいいのでしょうか。
>>808 ActivePerl-5.6.1.635 を使って下さい
810 :
nobodyさん :03/03/12 15:54 ID:eDO5fFOY
$n の値が $i の倍数だったら真。 という正規表現を書こうとしたんですが どうも書き方が解らず for 文になってしまいます。 どなたかお手本を見せてもらえないでしょうか。 お願いします。
811 :
nobodyさん :03/03/12 15:57 ID:NGPUyx9R
>>810 数値だよね?
($n % $i == 0)
812 :
810 :03/03/12 16:16 ID:???
>>811 数値です。
なるほど、割り切れるかどうかを見ればよかったんですか。
有難う御座いました。
頭悪くてスミマセンです。
813 :
nobodyさん :03/03/12 17:56 ID:bplOKqH9
ぐちゃぐちゃと書き込んだコメントをすべて取ってしまおうと 思い立ち、エイヤっと全部まるまる取ってしまったら、なんか すごくスクリプトがスッキリ見えて、前よりも理解しやすくなっ た。。。。という経験ないすか?
>>813 俺のプログラムのコメントを書く人は寡黙な方なので数日後に開いてパニックになったりします。
現在自動メール返信のルーチンを考えています。 スクリプト内で取得したメールアドレスを$mailという変数に 格納し、メールのテンプレートを外部ファイルから読み込んで 送信したいのですが、ヘッダ部分にTo: "$mail"と記述していても 変数展開が行われません。 外部ファイル内にある変数は展開できないのでしょうか?
>>815 $mailがどんな形で宣言されているのか不明なんで、わかりません。
818 :
815 :03/03/12 22:32 ID:???
>>817 メインルーチンの中で、$mail="
[email protected] ";
となっています。で、外部ファイルでは
To: $mail
From:
[email protected] Subject: hoge
<以下メール本文>
という構造です。このテンプレートファイル名が$fileに格納されているとき、
open (BODY,"$file");
@mail_body=<BODY>;
close (BODY);
としています。
>>818 @mail_body =~ s/\$mail/$mail/gs;
@mail_body = map{ s/\$mail/$mail/g; $_; } <BODY>; s///はスカラのみが対象になるかと。 スマートにやるなら、HTML::Templateをお勧め。
>>819-820 返答ありがとうございます。
最初、s///で自力でやってみたのですが、$をエスケープするのを
忘れていたり、818さんのように配列ごとs///を作用させてしまい
エラーが出っ放しだとか、いろいろありましたが、現在は以下のように
しました。
$body="@mail_body";
$body=~ s/\$mail/$mail/gs;
スマートな方法ではないですが、一応動きました。
Perlは自由度が高くてうれしいのですが、反面そのおかげで、
結構悩んでしまいますね。。。
>>821 もうちょっと基礎(コンテキスト、リテラル)から勉強せい
$body="@mail_body";とかかなりむちゃくちゃ(わかってあえてやってるならいいけど)
823 :
nobodyさん :03/03/13 12:33 ID:Am3iEG5g
>>815 open FI, 外部ファイル;
foreach(<FI>) {
s/%_(\w+)_%/${$1}/eg;
$mail_txt .= $_;
}
close FI;
で、どだろう。
KENTのsunbbsを改造しているんですが タイトル($sub)をhtmlに書き出す時だけ **文字以上だったら2バイト切って、"…"を付ける ってことをやりたいんですが どこにどう付け加えればいいでしょうか? ご教授お願いします。
>>824 if ( length ( $sub ) >= ** ) {
$sub = substr ( $sub, 0, length ( $sub ) - 2 ) . '…';
}
** は文字数ではなくバイトで指定
2「バイト」切るって言ってるんだからいいでしょ
>>827 あほか?
の後ろ2byteを切ってみて下さい。
829 :
山崎渉 :03/03/13 16:55 ID:???
(^^)
830 :
824 :03/03/13 17:07 ID:???
>>826 タイトルは半角で書く予定なので文字化けは大丈夫です。
>>825 どこに記述すればいいんでしょうか?
投稿処理の時点で$subではなくsubに置き換えて…無理ですね。
>>830 HTMLを吐き出す前あたりでいいんじゃない?
832 :
nobodyさん :03/03/13 21:45 ID:PyTQVFy/
$aaa = $FORM{'mode'};
$bbb = '123';
$ccc = '456';
・
・
・
$datafile = "ddd.txt";
open (dataf,">>$datafile");
flock(dataf,2);
・
・
・
print dataf "〜$aaa,$bbb,$ccc〜\n";
・
・
・
close (dataf);
というスクリプトを作りました。(abc.cgiとします)
このスクリプトを実行させる際に、modeにabcdeを与え、
テキストファイルに「abcde,123,456」と書かせたいのですが、
http://www.hogehoge.com/abc.cgi?mode=abcde という呼び出し方じゃダメなのでしょうか?
どうしても「,123,456」と書かれてしまうんです。
どこがいけないのでしょう?
>>832 フォームのデータをエンコして%FORMに入れる処理(またはそれに相当する
サブルーチン等の呼び出し)はもちろんやってるよね?
834 :
833 :03/03/13 21:55 ID:???
エンコじゃなかった、デコードだ。 逝け>俺
>>832 $FORM{'mode'}の中身を調べる。
# ちゃんとどっかで$form{'mode'}に代入してる?
HTML::TemplateってHTMLっぽい文法でなんかどんくさい感じがするんだけど、 みんなはこれで満足してますか? 特に、何かの要素の値(?) <a href="(ここ)"></a>に何かを入れるとき、テンプレート が、ちゃんとしたHTMLじゃなくなるのが痛い。 で、CGI::FastTemplateっていうかっこいいやつを発見したんだけど、使ってる人はいますか?
838 :
832 :03/03/13 22:57 ID:???
すみません。解決しました。 デコードもやってないし、$FORM{'mode'}にも値を代入してないという、 初歩的な問題でした。 お騒がせしました。
>>818 亀ですが漏れはこうやってます
最後の出力のときに使って
open TMPL, "<$file";
while(<TMPL>){
s/\$([_\w]+)/${$1}/eg;
(HTMLエンコード処理)
print;
}
close TMPL;
>>836 使ってみたけど、ちょっと扱いづらいね。
単機能化されているみたいだから、
HTML::Templateより速くなるみたいだけど。
見た通りのサブルーチンなのですが、ローカルで使用しても かなりの時間がかかってしまいます。 通常、実装するとしたらこれで大丈夫なのでしょうか? my @port = ( 80, 8000, 8080, 8888 ); my $remote = $ENV{"REMOTE_ADDR"}; my $iaddr = inet_aton($remote)or die "Unknown host : $remote"; my $proto = getprotobyname('tcp'); socket (SOCK, AF_INET, SOCK_STREAM, $proto) or return 0; foreach my $port ( @port ) { my $paddr = sockaddr_in($port, $iaddr) or return 0; if (connect(SOCK, $paddr)) { return 1; } } return 0;
コマンド(引数は外部からの値)の実行結果を@_に格納したいのですが、 バッククウォートで `コマンド $xxx` ↑このようにやると危険なので system "コマンド","引数" ↑こんな感じでやりたいのですが systemを使ってリスト@_に格納する事はできないんでしょうか。 できないのであればどういう方法が一番bestでしょう? 汚染チェックはやりますが、少しでも危険な要素を取り除きたいので・・。
>>843 system関数だけでは無理だと思う。
俺ならシェルスクリプトを作るかな。
で、必要な引数のほかにファイル名を引数にとって
そのファイルに全てを出力させる。
perl側からは、systemで呼んだ後にそのファイルを
読みに行けばいい。
windows環境ならバッチファイルでもいいかと。
>>843 汚染チェックをしっかりやっていれば
open FOO, join(' ', $cmd, @arg, '|') or error;
@_ = <FOO>;
でいい気がする。
それならバッククォートでも変わらないような
すみません。 厨房質問なのですが、 main.cgiがあり、使用するライブラリが複数ある。 とうぜん「require」を書いてあるのはmain.cgi。 この時、ライブラリAから直接ライブラリBに含まれるサブルーチンに飛ばしてなんら問題ないんでしょうか? なんか作ってて微妙に怖くなってきました。 とある解説サイトでライブラリとはCGIにサブルーチンが埋め込まれたのと全く同じ動きをするって書いてあったけど本当でしょうか? メインファイルを直接経由しないライブラリ間でのやり取りって支障ないですよね?
848 :
843 :03/03/14 20:31 ID:???
>>844 >>845 ありがとうございます。
ファイルに吐くのも考えましたがいちいちやっていたら大変なので・・。
汚染チェックだけに頼るのが一般的なんですかね?
perl始めて数週間なのでいまいち常識がわからなくて・・
>>843 open(FOO, "-|") or exec 'command', $param;
print <FOO>; # 何か処理
close(FOO);
perldoc perlsec参照。
Perlクックブックレシピ19.6に詳しい方法が載ってます。
>>848 これが常識
$pid = open(PIPE, '-|');
die unless(defined($pid));
if ($pid) {
local $/ = '';
@_=<PIPE>;
} elsif ($pid) {
exec 'command', 'arg';
}
>>847 requireは実行時に評価される点に注意して、
(requireを書く場所を間違えなければ)
可能です。
852 :
850 :03/03/14 21:47 ID:???
切り貼り失敗
>>848 これが常識
$pid = open(PIPE, '-|');
die unless(defined($pid));
if ($pid) {
local $/ = '';
@_=<PIPE>;
} else {
exec 'command', 'arg';
}
[cXYZ] # X,Y,Zは数字。Xには0〜3、Yには0〜4、Zには0〜3が入ります。 という文字列を S● B●●●● O●● # ●の数はそれぞれX,Y,Zの数値。0の場合は●はなし。 に変換したいのですが $test = "[c222]"; if ( $test =~ m/\[c([0-3])([0-4])([0-3])\]/i ){ $count ="S"."●" x $1." B"."●" x $2." O"."●" x $3; $test =~ s/\[c([0-3])([0-4])([0-3])\]/$count/i; } ない知恵絞って上記のようなものを書いて見ました。 もっとよい方法がありましたら教えてください。 あと $test に [cXYZ] が複数あった場合、すべて変換にするには if の代わりに while を使う方法になりますか?
$test =~ s/\[c([0-3])([0-4])([0-3])\]/'S' . '●' x $1 . ' B' . '●' x $2 . ' O' . '●' x $3/ge;
855 :
853 :03/03/14 22:46 ID:???
( ゚д゚)ポカーン 漏れは何をまわりくどいことをやってたんだ。 s/\[c([0-3])([0-4])([0-3])\]/S●x$1 B●x$2 O●x$3/ 最初こんな感じでやってみて無理だったので、上のになりました(^^; 勉強になりました。ありがとうございます。
856 :
841 :03/03/15 00:24 ID:???
>>841 のサブルーチンは動かないでしょうか?
こちらのスクリプトを改造したのですが、一応
オープンとクローズは遅いながらも判別できました。
#!/usr/local/bin/perl -w
use strict;
use sigtrap;
use Socket;
my ($remote, $port, $iaddr, $paddr, $proto);
$remote = $ARGV[0] || "127.0.0.1";
$port = $ARGV[1] || 0;
print "REMOTE : $remote\n";
print "PORT : $port\n";
$iaddr = inet_aton($remote)or die "Unknown host : $remote";
$proto = getprotobyname('tcp');
socket (SOCK, AF_INET, SOCK_STREAM, $proto) or die "socket : $!";
while ($port < 65536) {
$paddr = sockaddr_in($port, $iaddr) or die "$!";
if (connect(SOCK, $paddr)) {
print "PORT : $port OPEN\n";
socket (SOCK, AF_INET, SOCK_STREAM, $proto)or die "socket: $!";
}
else {
print "PORT : $port CLOSE\n";
}
$port++;
}
>>841 の
>my $remote = $ENV{"REMOTE_ADDR"};
>my $iaddr = inet_aton($remote)or die "Unknown host : $remote";
inet_atonはホスト名をIPアドレスに変換でしょ。
無意味な正引きするより$ENV{"REMOTE_ADDR"}をpackしたほうが
早いんじゃないの?
教えようと思ったけど、ポートスキャナじゃん。。 しかも65536って、あーた。
iswebのモバイル用フォルダにお絵描き掲示板を設置したところ
pooアプレットの方は問題なく動いたのですが、しぃアプレットの方は
画像が2重に投稿され投稿失敗のメッセージが表示されてしまいました。
それまで普通のcgi-binフォルダではどちらも正常に動作していたので
多分ページに挿入される広告が悪さをしてるんじゃないかとは思うんですが
どう直せばいいのか私にはサッパリわかりません。
どなたかわかる人がいたら教えてください。お願いします。
ちなみに今まではこのスクリプトを使わせてもらってました。
ttp://mrdc.hp.infoseek.co.jp/compati.zip
860 :
859 :03/03/15 01:40 ID:3fqyLgHG
一応、BBSNoteではしぃアプレットも正常に動作したのですが 今ダウンロードできるバージョンはもうpooをサポートしてないので、、
>>857 確かにその通りでした。削っているうちにちんぷんかんぷんになっていたようです。
有難うございました。
>>858 アホな目的に使うつもりはないので65536はさすがにやっていません(^^;
このような感じでやってみました。突っ込み所がありましたらよろしくお願いします。 依然として非常に遅いのですが、2chなどのプロキシ弾きはCでこのようにやっているものなのでしょうか? my @port = ( 8000, 8080, 8888 ); $ENV{"REMOTE_ADDR"} =~ /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/; my $iaddr = pack("C4", $1, $2, $3, $4); my $proto = getprotobyname('tcp'); socket(SOCK, AF_INET, SOCK_STREAM, $proto) or return 0; foreach my $port ( @port ) { my $paddr = sockaddr_in($port, $iaddr) or return 0; return 1 if(connect(SOCK, $paddr)); } return 0;
my $iaddr = pack('C*', split(/\./, $ip));
$iaddr = pack('C*', split(/\./, $ENV{"REMOTE_ADDR"}));
867 :
nobodyさん :03/03/15 09:19 ID:Uli+0qKe
/cgi-binでしかperlを実行できず、 /cgi-binではhtml、jpgを閲覧できません。 現在のフォルダ /www/ html/ cgi-bin/ これを/www/html/ 配下すべてでperlもhtmlも動作できるようにしたいのですが、 どうすればいいんでしょうか?
>>867 apacheの設定を弄るか.htaccessで設定を変更する必要があるのだが権限あるの?
キーワードはScriptAlias,ExecCGI。
スレ違いになるので後は自分で調べてください
870 :
nobodyさん :03/03/15 10:27 ID:Uli+0qKe
# AddHandler cgi-script .cgi のコメントは外した? ドキュメントルートを移動させてれば、そっちもOptionsの設定がいるよ。 つか、サーバルートの設定を変えるってのはヤバイ。 これ以上はすれ(略。
872 :
867 :03/03/15 10:55 ID:???
ごめんサパーリ。 もっと勉強が必要か。 CGI設置フォルダの下にhtmlを置くやつが使いたかったから・・・。
>870 >当然root権限はあります こんなやつがroot権限を持つなんて・・・、しかも当然だって・・・(w
874 :
867 :03/03/15 12:35 ID:???
>>873 となりのPC(ry
root権限なかったら、こういう質問しませんよ。
共用なら、たいていどこの階層でもperl使えるし、
cgi-bin限定でもhtmlや画像、映像も置ける。
ISPのサーバーなら、できないならできないと初めから書いてるしね。
ま、踏み台にされないように頑張りますw
875 :
867 :03/03/15 12:37 ID:???
というか、板違いですかねぇ。
この程度のことを質問しているようじゃ、踏み台にされないように頑張ります っていっても期待はできないな。気持ちで防げるものではないから。あはは・・
877 :
867 :03/03/15 13:55 ID:???
出来た・・・。 そんなに難しいことじゃなかったらしい。 876にバカにされるのもいさ仕方ないのかも。 サーバーの電源落として寝ますわ。
二度と電源を入れないのを切に願う
879 :
nobodyさん :03/03/15 17:45 ID:5hlN9xGB
$tmp = `/usr/bin/whois -h $server $name.$domain |grep -i '$msg'`; このような処理で万が一タイムアウトになった場合、次の処理に移り たいのですが、実行しっぱなしになってしまいます。 通常どういった処理を行うのが良いのでしょうか。
>>849 >>850 ありがとうございました。
ただ私の環境はActivePerl-5.6.1.635なので
どうもできないようです。(forkできないから?)
execも引数を2個使うとなぜか機能しません。
○exec "コマンド 引数"
×exec "コマンド","引数"
もうさっぱりわかりません。
open FOO,"コマンド 引数|"
これだとFOOに結果が格納されたんですが
引数が外部の場合危ないですよね。
恥ずかしい話だが。。。 漏れって「引数」をずっと「いんすう」って読んでたよ。
882 :
845 :03/03/15 19:28 ID:???
>>879 alarmでどうよ。
>>880 > 引数が外部の場合危ないですよね。
だから「チェックをしっかり」と書いてるんだけど…。
"$cmd $arg"と書かずに$cmd,@argと書いた意図を汲んでほしいな。
そもそも使いたいコマンドは何?引数はそんなに複雑なの?
引数が2つ以上のexecは引数が1つの時と挙動が変わるし、
第一システムコール使う関数は9x系とNT系で実装具合が違う。
駱駝本なりperldoc -f execなり読んでね。
>881 私も昔そう呼んでたよ。気にするな。
>>881 98SEが出るあたりまでずっとそう呼んでたよ。
>>880 汚染チェックだけしっかりやっとけ
>>882 $cmd,@argでも' 'でjoinしている時点で
意図を汲みようがないと思われ
>>879 $SIG{'ALRM'} = sub{ die 'timeout' };
eval{
alarm($timeout); # $timeout秒
$tmp = `/usr/bin/whois -h $server $name.$domain |grep -i '$msg'`;
alarm(0);
};
if ($@){
alarm(0);
($@ =~ /timeout/) or die;
# timeout!
}
# windowsではalarmが使えません。
>>880 windowsでは "-|"が使えません。
887 :
nobodyさん :03/03/15 22:26 ID:5hlN9xGB
>>882 ,886
どうもありがとうございます。
うまくいきました!
cgiからcgiを呼び出すとき、GETなら$ENV{'QUERY_STRING'}に 文字列いれてやればいいんだけどPOSTはどうやればいいですか? 途中まで書いて調べてみたんだけど。 $ENV{'SCRIPT_NAME'}="/cgi-bin/test.cgi"; $ENV{'REQUEST_METHOD'}="POST"; $ENV{'CONTENT_LENGTH'}="24"; open FH,"-l", or exec "perl","test2.cgi";
>>888 LWP(libwww)使うと幸せになれるかと。
>>889 thx
調べてないけどモジュールですね?
やてみます
891 :
890 :03/03/16 11:19 ID:???
>>889 できました。ありがとうございます。
一応こんな風になりました。ってコピペですが。
use
HTTP::Request::Common qw(POST);
use LWP::UserAgent;
$ua = LWP::UserAgent->new;
my $req = POST '
http://www.xxx/yyy.cgi ',
[ namae => "bbb",
name2 => "aaaa" ];
@aaa= split ( /<BR>/,$ua->request($req)->as_string);
標準入力で渡せばいい。つまり、、FHに書き込む。
893 :
nobodyさん :03/03/16 20:10 ID:HMSF0mo0
#トリップ使用/非使用(0=非使用 1=使用) $trip = 1; #トリップ変換文字列 $tripsalt = XX; #---------------------# # トリップ # #---------------------# sub tripping { if ($trip == 0) { } if ($trip == 1) { # トリップ機能有効なら◆は◇に置き換える $name =~ s/◆/◇/; if ($name =~ /(#|#)(.*)$/) { $string = crypt("$2", $tripsalt); $tripstr = substr($string,2,8); $name =~ s/(#|#)(.*)$/◆$tripstr/; } } 掲示板にトリップ機能を付けようと思っています。 上の設定でon/offを切り替えれるように設定しようと思っているのですが、 これでいいのでしょうか?
895 :
893 :03/03/16 20:15 ID:HMSF0mo0
これを掲示板CGIの書き込み処理の前にサブルーチンで呼び出しても、 動いてくれませんでした。 有効にしたはずだけど無効でした。
896 :
nobodyさん :03/03/16 20:15 ID:MtdvS7v9
Perlでフォームの内容を判断させるにはどういう命令を使ったらいいんでしょうか。 「あほ」 が含まれてるだとか、判断したいんです。
>>893 どう動かなかったのか?
$tripsalt = XX;
一応クオートで囲って下さいな。
if ($trip == 0) {
}
いらないです。
後、スコープという物をもうちょっと意識した方が良いかと思います。
898 :
893 :03/03/16 20:28 ID:HMSF0mo0
>>897 レスありがとうございます。
動かなかったというのは無効設定というか、
加える前と何も変わりませんでした。
on off機能を無くしてスクリプトに直接埋め込んだ(こういう表現で良いのでしょうか?)
場合、有効になりました。
>>$tripsalt = XX;
>>一応クオートで囲って下さいな。
これですが直接埋め込んだときは囲わなくて動いたので大丈夫だったのですが、
やはり囲った方がいいのでしょうか?
直接埋め込んだときは書き込み処理の前に
$name =~ s/◆/◇/;
if ($name =~ /(#|#)(.*)$/) {
$string = crypt("$2", $tripsalt);
$tripstr = substr($string,2,8);
$name =~ s/(#|#)(.*)$/◆$tripstr/;
}
を埋め込みました。
まだクッキー部分の始末もしないといけないし、まだまだ時間がかかりそうです。
>>898 HTMLじゃないんだから、文字列のクオートは省略しちゃいかんよ。
「文字列ではない何か」とみなされることがある。
プログラムの別の場所で$tripという変数を使ってたりしない?
>>897 の言う「スコープ」を意識しないと、こういう単純ミスをしがちなので。
>>901 正規表現を勉強して、パターンマッチで対応する。
901 :
893 :03/03/16 22:10 ID:HMSF0mo0
>>899 レスありがとうございます。
試行錯誤でなんとか出来ました。
あとはクッキーにトリップ変換後の物が記録されるのを修正です。
Perlは最近自分で勉強しだしたので、スコープが何か全く分かりません。
勉強してきます。
レス付けてくださった方ありがとうございました。
?
903 :
nobodyさん :03/03/16 22:24 ID:04Nbdlpl
904 :
nobodyさん :03/03/16 22:40 ID:WBb98oow
おはようございます。 while (<FH>) { だと 内容が $_ に格納されますが } foreach my $x (@x) { のように、初期で変数に格納する方法はないでしょうか? } 説明がへたくそですみません・・。 while (<FH>) { $x=$_; とするしかないのでしょうか・・ }
>>906 while (my $x = <FH>) {
...
}
>907 有難うございますー 一度、($x = <FH>) でやったところエラーが出たので 出来ないのかと思い込んでいたら、 myが抜けていたのですね・・。Strictで書いていたもので; これで次に進めそうです(^^
909 :
896 :03/03/17 08:08 ID:???
なんでおれの質問だけスルーしてるの? わかる人おしえてください Perlでフォームの内容を判断させるにはどういう命令を使ったらいいんでしょうか。 「あほ」 が含まれてるだとか、判断したいんです。
910を優しく書くと if ($hoge =~ /あほ/) {print "含まれている";}
$hs=gethostbyaddr(pack('C4',split(/\./,$addr)),2)||$addr if!($hs=$ENV{'REMOTE_HOST'})||$hs eq$addr; ↑訳して下さい。 というか自分で書いといて どういう順番で読むか忘れた…(久々ゆえ
914 :
真の896 :03/03/17 16:35 ID:3tcTX76s
909は俺じゃない訳ですが。。。まぁ、ありがとう。
>>911 ご教授ありがとうございました。
>>912 質問したらココに誘導されたので、もう一度書きました。
>>913 逆引きしたいのなら
$addr = $ENV{'REMOTE_ADDR'};
$host = gethostbyaddr(pack('c4',split(/\./, $addr)), 2) || $addr;
これでいいんじゃないの?
逆引きできたら$hostにはその結果||出来なかったら$addrを挿入;
>>914 誘導されたのなら、その旨をちゃんと書くこと。
でないとマルチ扱いされても仕方がない。
>>913 $hs = gethostbyaddr(pack('C4',split(/\./,$addr)),2);
$hs ||= $addr if (!($hs=$ENV{'REMOTE_HOST'}) || ($hs eq $addr));
$hs = gethostbyaddr(pack('C4',split(/\./,$addr)),2) || $ENV{'REMOTE_HOST'} || $addr;
と等価…のはず。
918 :
913 :03/03/17 20:27 ID:???
>>915 ,917
レスthx。
gethostbyaddrは負荷になるとか聞いた覚えがあったんで、
$ENV{'REMOTE_HOST'}が空だった時のみにgethostbyaddr、とかいうのを
一行で書きたかった…んだと思ふ。
919 :
915 :03/03/17 20:47 ID:???
920 :
915 :03/03/17 20:58 ID:???
>918 まぁApacheだとすると HostnameLookups off アクセスは逆引きしない apacheのログはIP(***.***.***.***) $ENV{'REMOTE_HOST'}は存在しない HostnameLookups on アクセスは逆引きする apacheのログはHOST形式(****.***.ne.jp) $ENV{'REMOTE_HOST'}は逆引きした結果 HostnameLookups double on の結果を更に正引きして一致するか確かめる 一致しなければIP形式になる。いわゆるDNS二度引き $ENV{'REMOTE_HOST'}は逆引きしたのが正引きしたのと同じなら存在する 稀に偽の逆引きアドレスいれるサーバがあって 逆引きすると日本語で萌え萌えとかでるいう香具師もいる ちなみにgethostbyaddr関数はdoubleと同等ね 普通はApacheの逆引きはしない様にして ホスト情報が欲しいときだけgethostbyaddr関数などを使うのが これが一番サーバにやさしいかと。
$ENV{'REMOTE_HOST'}が空で返ってきて、 gethostbyaddrが動作しないなら、 ホスト名取得は不可能でしょうか? 必要分だけ今はnslookup(泣) まぁ使ってるうちに結構頭で逆引きできるようになりました(死)
922 :
915 :03/03/17 21:26 ID:???
>>921 gethostbyaddrが動作しないってどういうこったい?
まぁ自鯖だと仮定すると
DNSをルータのではなくISPのを指定して見るとか
923 :
921 :03/03/17 21:40 ID:???
iswebですが、動きません。
924 :
915 :03/03/17 21:49 ID:???
>>923 REMOTE_HOSTも使えなくて
gethostbyaddrも使えない?
んな鯖やめなさい。
925 :
921 :03/03/17 21:52 ID:???
>>924 確かに止めた方がいいように思うことも一杯あったので多分もう止めます。
REMOTE_HOSTもgethostbyaddrも使えない。
HOOPSと統合によって<!--#exec cgi="..."--> まで使え無くされて踏んだり蹴ったり。
<!--#exec cgi="..."--> と.htaccessが使えて、
REMOTE_HOSTかgethostbyaddrのどちらかが使える(普通使えるよなぁ・・・)
フリーサーバって無いかなぁ・・・
>>925 SSI OK
CGI OK
.htaccess NG
なら結構あると思うぞ
本格的にサイトつくりたいのなら
XREAでも借りなさい。
927 :
921 :03/03/17 22:03 ID:???
>>926 そうなんですよね。
CGI、SSI可はかなりあるんですが、.htaccessまでってのは無いですよね。
金払ってまでならまぁ無くても仕方ないかなって思ってますけど。
ところでXREAって今一般向け止まってません?
>>927 ドメイン適当に1150円でとれば無条件で使えたと思ったが
さらに2400円払えば広告なくなって
破格だと思うが適度に安定してるし
ドメイン無し有料って出来たかな忘れたわ。
929 :
918 :03/03/17 22:18 ID:???
>>919 ,920
なにしろ忘れるくらい独学(perl関連のサイトをググってるだけ)だもんで。
勘違い以前に無知に等しかったり。
理解できたかどうかはともかく説明多謝。
930 :
sage :03/03/18 00:22 ID:I8ME4rq8
#!/usr/bin/perl
SetCookie {
$CookieName = hello';
$ExpireDate = '200108270900';
}
と
#!/usr/bin/perl
GetCookie {
unless ($ENV{'HTTP_COOKIE'} = hello) {
Print "Location:
http://hoge.com/chuui/cookie.html\n\n ";
}
で直リンクを低減させようと思案しています。
ですが、第一にクッキーがセットされません。
どこがどういう風に変なのでしょうか?
演算子の使い方とかクッキーの仕様に対する理解とか・・・
>>930 SetCookieで
セットしてないじゃん
いろいろ。
936 :
930 :03/03/18 08:45 ID:I8ME4rq8
てーと、どこいら辺が…? >931 演算子の使い方とか〜 そもそも演算子というのがよく分かっていません。 色々見て回って書いてみたものなので >932 読んだのですが、理解を超えています。 だから、初心者なのですが… >933 色々なホームページで見た限り、これで良さそうな感じで書かれてあったので、これ以上は… >934、935 では、正しくはどういう記述を…?
そもそもいきなりクッキー埋めこもうとするのも問題じゃろな クッキーカウンタとかもやめてほしいネ
>>936 クッキーの仕様についてはCGIの範疇なのでスレ違い。
だいたい、ソースのコピペしかできないようなレベルじゃ扱うのはまだ早いよ。
自分で掲示板の1つも作れるようになるころには、理解できるようになってるはず。
つうか、「Perl クッキー」とかでぐぐればけっこう解説サイトがヒットするけどな…
939 :
nobodyさん :03/03/18 09:33 ID:jCHimkJH
質問です。 ローカルにApache,perlがあります。CGIページで system("xload")を実行したいですが、できません。 system("pwd")のようなコンソールアプリは動くが、xloadや xemacsなんてのは動かないという認識でよいのでしょうか。 御回答をお願いします。
940 :
930、936 :03/03/18 09:50 ID:I8ME4rq8
>937 >そもそもいきなりクッキー埋めこもうとするのも問題じゃろな よく意味は分からないけど、そんなもんなんですかねェ・・・ >938 >自分で掲示板の1つも作れるようになるころには、理解できるようになってるはず。 これは何となく分かるような気がします。 >「Perl クッキー」とかでぐぐればけっこう解説サイトがヒットするけどな… 確かにいっぱいヒットしましたが、殆ど紫色なんですよ。 一度は見ています。あまり分からなかったですが・・・ ともかく、皆様、色々有り難うございました。 また来るとは思いますが、少し、色々漂流してこようと思ってます。
941 :
bloom :03/03/18 09:51 ID:aWc/tLn4
IE6だとデフォでcookie弾かれる
943 :
nobodyさん :03/03/18 14:32 ID:nZAPWH8k
>>943 >これって使っても大丈夫ですか?
何について心配しているのか、さぱーりわからん。
niftyって外部との通信が可能なのか・・・
>>939 CGIページって何?
ま、いいや。
xload がどう動くことを期待してるわけ?
Perl より先に HTTP を学ぶことを推奨しとく。
>>939 斬新な発想すぎてオレにはついていけない
システム状況(?)を見たいのならmrtgてのもあるぞ。
perlより先に SNMP を学ぶことを推奨しとく。
掲示板眺めてたら #環境変数取得 $ip = $ENV{'REMOTE_ADDR'}; $host = gethostbyaddr(pack("C4", split(/\./, $ip)), 2); $host ||= $ENV{'REMOTE_HOST'}; $host ||= $ip; $referer=$ENV{'HTTP_REFERER'}; $script=$ENV{'SCRIPT_NAME'}; ってのがあったんですが、$host ||= $ip;の||=ってなんですか? 多分、インクリメントやデクリメントのように略されてると思うんですが 本を読んでも見つからず、検索かけても全くヒットしてくれないのです。 アドバイス頂けたら嬉しいです。
>>949 なぜ前スレで?
とりあえず、"perl" と "演算子" あたりをキーワードにすれば見つかる
# 実際見つかったから
>>949 $a ||= $b は、$a = $a || $b と等価。
つまり、$hostが空(=偽)なら右辺値を代入。
>>950 えっ、次スレ立っても現行スレを消化するまではこっちを利用するってのが普通だと
思ってた。違ったのか。すいません。
いろいろ考えて
$host eq "" || $host eq "$ip"
のようなものかなとか考えてました。"perl" と "演算子"で検索してきます。ありがとうございます。
954 :
nobodyさん :03/03/20 13:07 ID:sfBN77p8
みなさん use strict; って使ってます?
使ってます
>>955 ということは
Kentみたいのじゃなくて
varsなどでグローバル変数 myなどローカル変数を
明確にやってるんでしょうか?
やってます。 Kentみたいの、ってのがよくわからんけど。 # 何が聞きたいのかいまいち見えてこないし
>>957 サンクス
KENTWEB配布のやつは
use strict使ってなくて
局所的にlocal使っているんですが
ほとんどは定義もせずにグローバル変数になってます
perl4互換のせいでしょう。
my($hoge); &jcode::convert( *hoge, 'sjis' ); こうして変数をmy宣言してしまうとコンバートされません。 localじゃないとダメです。なぜでしょうか? localだとuse strictでエラーが出ますし。
>>961 結局それが聞きたかったの?
my $hoge;
jcode::convert(\$hoge, 'sjis');
>>961 レキシカル変数に型グロブは使えないよ。
Perl5なら
>>962 みたいにリファレンスを使おう。
通常の日付から1970年1月1日からの秒数を計算するツールって ありませんか?
Timeモジュール
>>964 use Time::Local;
print timelocal($sec,$min,$hour,$day,$mon,$year);
967 :
nobodyさん :03/03/21 16:26 ID:6r+JTGmv
おしえて君ですいません ある行の途中にAAAという単語があったら それ以降の文字をすべて消すにはどうすればよいでしょうか? ex. XXX AAA YYY 上のAAA YYY(ランダムな文字列、文字数)を消したいのレス。
968 :
nobodyさん :03/03/21 16:39 ID:pOguTMzc
969 :
967 :03/03/21 18:14 ID:6r+JTGmv
そろそろ秒読みに入らない? あと31!
30
972 :
nobodyさん :03/03/22 22:45 ID:blYpQKgH
970ゲト 970げと 9 7 0 ゲ ト 9 7 0 げ と
973 :
nobodyさん :03/03/22 22:49 ID:89cBTolJ
pmファイルってPerlのモジュールですよね? 何ができるのですか?どうやってつかうのですか?
>>974 何ができる?→モジュールによる。
どう使う?→検索しる
>>974 plファイルってPerlのライブラリですよね?
何ができるのですか? どうやってつかうのですか?
>>976 何ができる?→ライブラリによる。
どう使う?→検索しる
cgiファイルって実行ファイルですよね? 何ができるのですか? どうやってつかうのですか?
1000!
>>978 > cgiファイルって実行ファイルですよね?
そんなことはありません
> 何ができるのですか? どうやってつかうのですか?
一概には言えません
>>978 実行ファイル?→そうとは限らん
どう使う?→検索しる
>>981 まあ、皮肉ボケをかますのもそれくらいにしとこうや。
最初の質問者の
>>974 は見てないのか通じてないのか通じてて無視してんのか知らないけど。
阿呆な質問には阿呆な回答がつくのが関の山だって言う、好例だな。
質問です。 スクリプト?mode=check みたいのを掲示板に作っているのですが、 その中で属性のチェックの中で755のチェックはどう指定sすればいいのでしょうか? 777の場合は if (-r $script && -w $script && -x $script) { print "<LI>スクリプトパーミッション:OK\n"; } else { print "<LI>スクリプトパーミッション:NG → $script\n"; } 666は && -x $scriptを削除すればいいのですが 三つ数字が並んでいない755はどうすればいいのか分かりません。 よろしくお願いします。
誤爆 if ((($mode) = (stat($script)) == 755) { みたいにですか?
あ、自己解決しました。 どうもありがとうございました ≦(._.)≧ ペコ
解決したっていうならいいけど、違う予感・・・
>>991 結局こうしました
if ((($mode) = stat($file)) = 755) { print "<LI>表\示ファイルのパーミッション:OK\n"; }
else { print "<LI>表\示ファイルのパーミッション:NG\n"; }
(;・∀・)む・・・結局解決してないかも・・・?
ちゃんと関数の使い方ぐらい調べて書けよ statは配列で13個の値を返す 3番目( [2] )にパーミッションも含まれている 値を見ればわかるがそのままでは直接使えない 8進数にして下3桁が一般的にいう755などのようなパーミッション これは定石だからこの機会に覚えるといい
995 :
nobodyさん :03/03/25 02:21 ID:ouvjm9qN
あと1000まで6!
5
4
3
2
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。