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

このエントリーをはてなブックマークに追加
1nobodyさん
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >>2-10

前スレ http://pc8.2ch.net/test/read.cgi/php/1153987463/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
2nobodyさん:2006/09/15(金) 14:02:17 ID:gobry0n2
関連スレ
CGI: Common Gateway Interface part 13
http://pc8.2ch.net/test/read.cgi/php/1126436361/

【Perl,CGI】参考書籍 第三版
http://pc8.2ch.net/test/read.cgi/php/1030209573/

【Perl】ファイルロック(排他処理)について語ろう
http://pc8.2ch.net/test/read.cgi/php/1024795138/

★負荷軽減対策委員会(Perl、PHP)★
http://pc8.2ch.net/test/read.cgi/php/1034645635/

CGIに依存しないPerlの話題一般/Part2
http://pc8.2ch.net/test/read.cgi/php/1030548610/

★三 【 スクリプト改造工房 PART 9 】 ★三
http://pc8.2ch.net/test/read.cgi/php/1143834740/

【 スクリプト改造依頼スレ 】(丸投げ) part5
http://pc8.2ch.net/test/read.cgi/php/1141174205/
3nobodyさん:2006/09/15(金) 14:02:58 ID:gobry0n2
ム板Perlスレより 1 of 2

[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www.site-cooler.com/kwl/perl/

[本]
リャマ: http://www.oreilly.co.jp/books/4873111269/
駱駝: http://www.oreilly.co.jp/books/4873110963/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/books/4873112028/

[オンラインマニュアル] (追加)
最新のドキュメント: http://search.cpan.org/~nwclark/perl-5.8.8/
perl5.8.xのドキュメント(一部): http://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: http://www.cpan.jp/search.cgi
perldoc.jp: http://www.perldoc.jp/
Perldoc.com: http://www.perldoc.com/
4nobodyさん:2006/09/15(金) 14:05:07 ID:gobry0n2
5nobodyさん:2006/09/15(金) 14:16:42 ID:???
6nobodyさん:2006/09/15(金) 15:47:59 ID:???
>>1
s/(.*'-')o/~~otukare-/;
7nobodyさん:2006/09/15(金) 23:40:06 ID:???
VIPのバカが釣りにはしゃいで喜んでいます

女子大生拉致監禁事件!?12くらい
http://ex16.2ch.net/test/read.cgi/news4vip/1158323954/

「どう見ても釣りだろ」
というと顔を真っ赤にしてレスしてくるので注意!!!
8nobodyさん:2006/09/16(土) 11:00:05 ID:vjnDDSY/
chomp(@lines = <STDIN>);
@lines = sort @lines;
print "@lines\n";
がソートされたものを表示して

@lines = sort chomp(@lines = <STDIN>);
print "@lines\n";
が要素の個数を表示するのは

前者は配列をダブルクォーテーションの中で展開していて
後者はリストをスカラーコンテキストで使っているから
という解釈で正しいでしょうか?
9nobodyさん:2006/09/16(土) 11:18:12 ID:??? BE:283008184-BRZ(3000)
chompの戻り値は切り落とした文字数だからね
10nobodyさん:2006/09/16(土) 11:37:13 ID:vjnDDSY/
>>9
ありがとうございます。
11nobodyさん:2006/09/16(土) 22:23:36 ID:???
一行にしたいなら:
chomp(@list = sort <STDIN>);
12nobodyさん:2006/09/18(月) 19:19:34 ID:???
STDINに直接sort指定できるんだ。
その発想は無かった。
13nobodyさん:2006/09/18(月) 22:14:51 ID:???
そりゃsortが要求するのはLISTであってARRAYじゃないしね。
普段はあんまり意識しないけど、LISTとARRAYの違いは重要。
14nobodyさん:2006/09/18(月) 22:14:58 ID:???
>>12
STDIN を直接ソートしてるわけじゃなくて、
リストコンテキストで評価することでファイルの中身をソートしてるだけ。
15nobodyさん:2006/09/18(月) 22:32:44 ID:???
なるへそ。
そういう動作の仕方を知ってると色々応用できるし参考になるよ。
16nobodyさん:2006/09/19(火) 06:52:45 ID:???
Shift_JIS でコーディングをする場合のセキュリティについての質問です。

例えば、次のようにユーザ入力の値をダブルクォート内に代入したとします。
この時エスケープする文字列は、 & と < と > と " と ' です。

<a href="http://$hoge">

バイナリエディタで解析した " (ダブルクォート) の 16進表記は、"22" です。
ここで、$hoge に バイナリレベルで "82" をいれてみるとどうなるかやってみました。(バイナリファイルを一般のテキストエディタで表示したときの、"・"(半角) と表示されるあれです。)
それを出力して、IE と Firefox と Opera で表示したところ、 "82 22" で 1つの不正な文字 "・"(全角) として表示され、ダブルクォートが消えうせていました。

当然、掲示板のURL欄にこういう文字列をいれられたら、それ以降のデータがダブルクォート内のものと扱われますし、
その後の投稿内容の一部が " (ダブルクォート) 外にすることも可能で、"onload" イベントなどを使った、XSS攻撃も可能になるわけです。

大手CGI配布サイトのCGIで実験してみたところ、なんと実際にXSS攻撃が可能でした。

つまり、下記の条件を満たしてるPerlには脆弱性があることになります。

・文字コードとしてShift_JISを使っている。
・ダブルクォート内に正規表現などで入力内容を規制していない文字列が代入される。
 (所謂、< とか > とか " のサニタイズをしていてもこの攻撃は可能。)
・Shift_JIS に存在しないコードを含む文字列が存在しないかの確認をしてない。
1716:2006/09/19(火) 06:56:55 ID:???
上の脆弱性を要約すると、

「"(ダブルクォート) は 1バイト文字だけど、ユーザが送る文字列の最後に不正な1バイトコードをいれることで、
その1バイトコードと、ダブルクォートが合体した、不正な文字化けした2バイトデータと扱われ、ダブルクォートが消失してしまう(文字化けした・になる)」ということです。

こういった「文字化けを悪用した攻撃」に関する解説サイトはなかなか見つからず困っています。(上の情報は自分で検証した結果です。)
これの対処についていくつか質問があります。


・ユーザから送られてきた文字列が、Shift_JIS として正当であることを確認する、モジュールなどはないでしょうか?
それができたら、文字化けを悪用した攻撃は防げるかと思います。


・EUC-JP や UFT-8 ではこのような問題は発生しないのでしょうか?
参考: http://www2d.biglobe.ne.jp/~msyk/cgi-bin/charcode/bbs.cgi?past=1&c=r&n=82

 ・もし、EUC-JP などなら問題が生じないのであれば、スクリプトの文字コードの変換をやろうかと思います。
  Shift_JIS の駄目文字を "\" でエスケープしているコードを自動的に変換するソフトはないでしょうか?


ご教示お願い致します。

1816:2006/09/19(火) 06:58:25 ID:???
>>16 の <a href="http://$hoge"> が2chブラウザで見ると、
実体参照化される場合があるようです。

<a href=”http://$hoge”> です。
19nobodyさん:2006/09/19(火) 12:24:14 ID:???
XSSはブラウザ依存だからなぁ。
「このサイトはテキストブラウザ専用です」と書いておけばおk。
完全に排除したいなら最後に半角スペースを入れるくらいしかないと思う。
なぜならクライアントはページ製作者の指定したエンコードで表示するとは限らないから。
20nobodyさん:2006/09/19(火) 12:38:09 ID:???
>"onload" イベントなど
s/=/?/g;

>Shift_JIS として正当であることを確認
正規表現
21nobodyさん:2006/09/19(火) 12:39:43 ID:???
表示されてない…
s/=/&#61;/g;
22nobodyさん:2006/09/19(火) 15:40:09 ID:???
>>16
てーか普通URLに \x7f 以上の文字あるときはそれ全部エスケープするだろ?
あのくだらない日本語ドメインかなんかですか?(^ω^;
23nobodyさん:2006/09/19(火) 17:02:06 ID:???
>>17
> ・ユーザから送られてきた文字列が、Shift_JIS として正当であることを確認する、モジュールなどはないでしょうか?
正規表現一行で実現できるよ。
24nobodyさん:2006/09/19(火) 18:25:23 ID:???
if構文でandとorなんですが、
AでかつBでかつCの場合、のような全部andというわけではなく
AでかつBかCの場合、という混合の書き方はありますでしょうか?
現在は
if($foo eq 'A'){
if($bar eq 'B' or $bench eq 'C'){
print $foobar;
}
}
みたいに入れ子にしてます。
25nobodyさん:2006/09/19(火) 18:27:03 ID:tgpbfNw0
>>24
($foo eq 'A') && ($bar eq 'B' or $bench eq 'C')
26nobodyさん:2006/09/19(火) 18:28:07 ID:???
>>25
即答有難う御座いました。
使っていきます。
27nobodyさん:2006/09/19(火) 18:39:53 ID:LgUjbLc5

http://www.technorati.jp/home.html

テクノラティで任豚が発狂中〜〜www
ここの左側で「踊っているマリオ」のところが任豚ブログだ。
任豚パワーは凄まじい〜〜。
28nobodyさん:2006/09/19(火) 20:00:03 ID:???
>>23
kwsk
29nobodyさん:2006/09/19(火) 20:10:20 ID:???
>>28
$str = qr/^([\n\x20-\x7e\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$/;
実際に使ってるのはこんな感じ。
30nobodyさん:2006/09/19(火) 20:29:05 ID:???
>>29
サンクス。
使ってみる。
31nobodyさん:2006/09/21(木) 03:42:14 ID:???
Perlでのセッション管理で汎用的に使用されているような
モジュール・ライブラリがあれば教えていただきたい次第
です。

CGI::SessionやWalrus::Session::Lite等が検索で出てきま
すが、環境によって動作する・しないというものもあるみた
いなので一番安全で手軽に導入できるものがあれば
有り難いです。
32nobodyさん:2006/09/21(木) 06:44:43 ID:31FpoYel
CGIで使うんならCGI::Sessionが無難と思われ
33nobodyさん:2006/09/21(木) 08:00:46 ID:???
foreach構文についてなのですが、
1万行に渡るデータを、一行ずつ拾って、という処理をさせていると、
foreach構文の後ろを実行せずブラウザが完了と返してきます。
1万行が多いのか、foreach構文の中身の処理が多いのか、判別つきませんが、
ちゃんときっちり完了させる書き方ってありますでしょうか?
(タイムアウトなのでしょうか?)

foreachに送る@配列を1000ずつとかに切って、それの処理が終わるのを待ってから次の1000を処理する、とか、
いろいろ考えたのですがその待たせるという処理の仕方も思いつかなかったです。
なにか方法ありませんでしょうか?
お教えくださいますようお願いいたします。
3433:2006/09/21(木) 08:04:08 ID:???
ちなみに、
foreachの中で行ってる処理も途中で中断されてるみたいです。
出力結果は途中まででした。

これはコーディングで解決できるような問題なのでしょうか?
@配列の行を20行ほどにして試してみたら普通に処理されたので、
構文ミスではないと思います。
35nobodyさん:2006/09/21(木) 08:38:30 ID:???
>>33-34
高負荷(実行時間が長すぎる)なので途中で実行停止されるように
鯖で設定されているのでは。
3633:2006/09/21(木) 08:50:05 ID:???
>>35
なるほどやはりタイムアウトのような感じの処理をされているんですね。
ありがとうございます。

foreach $foo(@foo[0...200])
とかぶつ切りにすればそれぞれの処理は軽くなるような気がしますが、
それを
for ($bar = 0; $bar < 10000; $bar+200){

}
内で処理させたら同じになっちゃいますでしょうか。
($john = $bar+200;
foreach $foo( @foo[$bar...$john])
のような切り方にして)

テスト環境がもろいので、あまり何度も試す事ができなくて困ってます。

何か方法御座いませんでしょうか?
37nobodyさん:2006/09/21(木) 09:05:15 ID:???
実行時間で切られてるんだからどう切っても全体の処理量が変わらなければ
何の効果もない。1回あたりの処理が短い時間で終わるようにがんばって書き
直すしかないだろう
38nobodyさん:2006/09/21(木) 09:08:43 ID:???
>>33
ループ回数だけで言うと、10000回くらいなら一瞬で終わるよ、こんなのなら
my $i;
foreach (0..9999) { $i++ }
print $i;
なのでループの回数そのものの問題ではないでしょう。
起動時から完了までどのくらい時間がかかっているのですか?
ループの中の処理はどんなことをしているのですか?
子プロセス起動させてバックグラウンド処理ができるなら、そのようにするとか。
小分けにして、処理後にリダイレクトさせるようにして、続けるとか。
do.cgi→do.cgi?1000→do.cgi?2000→…
3933:2006/09/21(木) 09:12:56 ID:???
>37
やはり、一回の処理にはかわりはないんですね。
ありがとうございます。

>38
会員制サイトのメールマガジンのシステムなんですが、
1万件のアドレスを切って、メール送信、次のアドレス、という風に処理してるんです。
以前この質問をしたとき、なにに使ってるかを最初に書いたら「スパム業者に力は貸せない」と一蹴されてしまったので、書くのを躊躇してしまいました。
やはりsendmailの処理が重いのでしょうか。
40nobodyさん:2006/09/21(木) 09:20:46 ID:???
>>39
メールマガジンなら BCC で1回で送るのでは不都合あるかな?
41nobodyさん:2006/09/21(木) 09:26:05 ID:???
制限はずせばいいんじゃないの? 制限を自分でいじれない貸し鯖なら
そもそもやるべきではない。
4233:2006/09/21(木) 09:28:54 ID:???
>>40

最近携帯ばっか触ってたので、bccが4つまでしか使えないと勝手に脳内で設定されてました。
ありがとうございます。それでやってみます。

みなさま有難う御座いました。
4333:2006/09/21(木) 10:58:40 ID:???
えと、初歩的なことのような気もするんですが、

foreach $mail(@mail){
print MAIL "Bcc: $mail\n";
(受け取った$mailに配信)
}
とループしてたのを、

print MAIL "Bcc: $mail\n";
($mailにBCCの内容を)
とするつもりなんですが、

BCCの区切り子って,(カンマ)じゃないんですか?
$mail = join(/,/,@mail);
とすると、

open(MAIL,"| $sendmail -t");
print MAIL "Bcc: $mail\n";
print MAIL "From: $from\n";
print MAIL "Subject: $title\n\n";
print MAIL "$message\n";
close(MAIL);
のデータのsubject、Fromが空になって、本文に表示されるようになってしまいました。
本文に、ずれ込んだ件名なども表示されてます。

なんか根本的に間違ってるのでしょうか?
44nobodyさん:2006/09/21(木) 11:24:13 ID:???
根本的な間違い: 事故の元だからBccで送るな。
4533:2006/09/21(木) 11:46:43 ID:???
$mail =~ tr/\r\n//d;
で改行したらいけました。
有難う御座いました。
46nobodyさん:2006/09/21(木) 11:48:09 ID:???
1万のメルマガをBCCで送るなんて怖くてできねーww
4733:2006/09/21(木) 11:50:02 ID:???
>>46
すみません、後学のためにBCCの恐怖をお教えいただけないでしょうか?
他に軽く出来る処理のヒントになるかもしれないですし。
4846:2006/09/21(木) 12:00:24 ID:???
>>47
BCCで送るつもりがCCになっててメルアド流出ってニュース聞いたことないですか?
「事故の元」って>>44が言ってるのもそういうことだと思いますよ
4933:2006/09/21(木) 12:04:51 ID:???
>>48
あー、そっちの意味ですか。
それは大丈夫です。
>>44
>Bccで送るな。
と言ってますからBccで送ってはいけない、って意味なので違う事を危惧してくださっていると思います。
50nobodyさん:2006/09/21(木) 12:23:58 ID:???
大丈夫大丈夫って飲酒運転して人を轢き殺すタイプだな
51nobodyさん:2006/09/21(木) 12:24:45 ID:???
これはとあるシリアル制御機器にコマンドを送る命令である


$test->printf("%c%c",0x1b,0x40);

これでは問題なく動いてくれるが、
ちょっとコマンドを長めに投入するとだめ。
原因はなんだろう

×
$test->printf("%c%c%c%c%c%c",0x1b,0x40,0x1f,0x03,0x1b,0x40);
5233:2006/09/21(木) 12:30:16 ID:???
>>50
お前>>48で46を名乗って「>>44が言ってるのも」と他人の振りをしてるのはなぜだ?
>>44=>>46=>>48=>>50
答えれねーならしゃしゃんじゃねーよクズが。
5346:2006/09/21(木) 12:34:25 ID:xRtMaydf
はいはい妄想乙。
54nobodyさん:2006/09/21(木) 12:46:46 ID:rVJ008ap
>>52 != >>33
だろ
55nobodyさん:2006/09/21(木) 12:50:01 ID:rVJ008ap
  |    |    |  /-------------石綿-------------
  |    |    |/|           ∧   | lllllllllll |
▲|  schindler /  |    シュレッダー  |雪|   | パロマ | l| ̄ ̄ ̄|
▽|    |  //l . |    |アイリス |  |印|   | O。O | ||___| アメリカ産牛肉
  |    |// │ |    |オーヤマ|    ̄  `┬┬_´ ..||ε(;; ;)3|\  __
  |    /..│   | |  __ ̄ ̄ ___ . / ┌┘/l . ||ε(;; ;)3|.  || |#|イトーヨーカドー電気ストーブ
_|_/  │   | |  |Mac ||_  |:|デル|:| lニニニl/  .||ε(;; ;)3|.  || ~~~
.  / .     |   | | /__/l|:.. : |ニニニ|.::.:.:.||.:..:::..::..:  ̄ ̄ ̄\||            _/ ̄ ̄\_三菱
./ .       |0,  | |::_||.::..:...||:..::.SH902iS::::.[PS2]::::: /\\ : | | .           └-○--○- ┘
 設計     |   |/.::.↓>>52.:..::::./ヽ-、.:(PSP): .| \| ̄|=| |コ=      /\\ :  _/ ̄ ̄\_トヨタ
姉歯事務所|  ./.::..:..:<⌒/     ヽ.::..:..:◎..:...::.. .| \|  |: | | 松下|  .| \| ̄| └-○--○- ┘
.       |/.::..:..:..::::.<_/____/.::.: ソニーBMG:..\.|_|: | | FF式 .  .| \|  |  ファイヤストンタイヤ
      ____   ___    _____  ________...\.|_|:サンヨー石油ファンヒーター

56nobodyさん:2006/09/21(木) 13:03:19 ID:???
>>47
メールアドレスに改行仕込まれるとそれ以降のアドレスが駄々漏れになる。
sendmailの引数で指定すれば(シェルに解釈させないように注する)、その心配はまったく無くなる。

付録:
一行の長さの制限とか考えてないでしょ。
57nobodyさん:2006/09/21(木) 13:43:19 ID:???
>>56
Sendmail の引数で指定するのは、一般的にはやっちゃいけない方法と言われてるね

リスクとしては、

OSインジェクション >>> メールアドレス漏洩 だし、

シェルに解釈されないようにする&RFC準拠のメルアドを全て使えるようにする手間 >>> 改行コードとカンマとスペースを排除する手間

シェルコマンドは色々あるからね。
まぁシェルコマンドを全部エスケープすればすむだけだとは思うけど。
58nobodyさん:2006/09/21(木) 13:46:31 ID:???
そもそもメールマガジンで1万って考えられないな。
スパムじゃないの?
59nobodyさん:2006/09/21(木) 13:47:40 ID:???
>53

>54

>55

おいおいいきなりID出して別人工作か。
もちっと頭使え。
60nobodyさん:2006/09/21(木) 13:50:34 ID:???
>>58
メールマガジンで1万ってのは普通だろ


むしろ、スパムで「たった」1万通なわけないじゃん

スパムのアクション率なんて、0.00001% とかだぞ。
スパムするなら、最低500万通/日、業者なら1億通/日は送っているだろ。

61nobodyさん:2006/09/21(木) 13:50:39 ID:???
>>58
また出た。
お前がツクリャ30人が関の山だろうが、俺の文章読みたさにがんがん登録があるってわけ。
貧相な想像力でねちねち言ってんじゃねーっつーの。
62nobodyさん:2006/09/21(木) 14:22:11 ID:xRtMaydf
wwwwwww
63nobodyさん:2006/09/21(木) 14:22:18 ID:???
でも個人のメールマガジンで1万の登録が有るってのもな。
64nobodyさん:2006/09/21(木) 16:30:17 ID:???
てか、みんな一応質問に答えてやってんだから
それぐらいで着火するようなら自分で考えて自分でやれ
ちょっと調べればいくらでも出てくるぞ
65nobodyさん:2006/09/21(木) 19:39:32 ID:???
↓そろそろ釣りでした宣言
66nobodyさん:2006/09/21(木) 20:13:30 ID:???
本日の営業時間終ったから、レスは明日じゃないかな
67nobodyさん:2006/09/21(木) 21:46:53 ID:???
スパマーも一応仕事だからな。
6833:2006/09/22(金) 06:53:12 ID:???
回答ありがとうございます。

>>56
仰るとおり長さの制限に引っ掛かりました。
ヘッダーが32kb超えてる、みたいな感じのエラーが出たので、10件ほどでのテストでは判明しない問題でした。
>>38が提案してくださったようなプロセスの小分けの方向で模索してみます。

>>57
シェルコマンドをエスケープですか。
難しそうですが、勉強してみます。
6933:2006/09/22(金) 07:18:25 ID:???
自分の頭の整理も含め、もう一度書き直しますね。

1: 自分はこういう事がしたい。
1万件のメールアドレス(@配列にいれてあります)にメールを送信したい。

2: それでこんな風にやってみたが・・・
a.foreach構文で1万回sendmailをやってみた
b.全部を$mailに入れてBccとして送らせてみた

3: こんなエラーが出て上手く行かなかった。
a.実行時間が長すぎて、途中で切られた
b.ヘッダーが長すぎると言われた

ヘッダーを短くするには繰り返し構文を使うしか思いつきません。
>>38の案を模索してみたんですが、バックグラウンド処理、リダイレクトというのがさっぱりわからなかったです。
一回の処理を短く行う方法は御座いませんでしょうか?

お教えくださいますようお願いします。
70nobodyさん:2006/09/22(金) 09:54:19 ID:???
>>69
僕の使ってるサーバではやらないでね。
7133:2006/09/22(金) 09:55:43 ID:???
ない知恵を絞ってみました。
@maill[0..99]←([]の中身は変数で変更可能)
で100回だけループするようにして、
htmlのリフレシュを使って、@mail[100..200]を処理する(getメソッドで数値を渡しておく)ようにして、
それが@mailの行数を超えるまでリフレシュさせまくる、というのは不安定でしょうか?

それか、100件ごとに
sleep 5;
などを入れて休憩させるといけるのか、とかも考えましたが、
これだと「一回の処理の時間の長さが50秒追加されるだけで余計長くなってる」ってことになるでしょうか?
100件ごとに一回の処理として扱われるなら最後までいけると思うんですが。
7233:2006/09/22(金) 09:57:18 ID:???
>>70
昨日の結局何も答えてはいないだけのクズか。
しつけーぞ。しゃしゃり出るならなんか回答してみせろ無能め。
7338:2006/09/22(金) 10:13:02 ID:???
>>69
ふつう、1万件のメールをCGIプログラムでは送りません。タイムアウトするから。
ヘッダが長すぎるというのはあたりまえ。1行の長さが998文字以下と決まってるのです。
だから、やるなら、

Bcc: [email protected],
 [email protected],
 [email protected],

のように、1つのヘッダ行が複数にまたぐ場合は、2行目以降は行頭に空白文字(スペースあるいはタブ)を置いて続けることができます。
このような仕様がいろいろあるので、メールクライアントを作りたかったら、RFCを読みましょう。
ttp://www.ietf.org/rfc/rfc2822.txt
ttp://www.puni.net/~mimori/rfc/rfc2822.txt(日本語訳)

プログラムで送ろうとせずに、eml形式のメールデータをローカルなperl環境で1万個作ってメーラーにインポートして一斉に送ってはいかが?
スパムを送られたら幇助しているようでいやなので詳しく書く気はないです。ごめんなさい。
74nobodyさん:2006/09/22(金) 10:18:03 ID:???
> 1万件のメールアドレス(@配列にいれてあります)にメールを送信したい。
もうこの時点で目的は何であれスパムだよな。

そうじゃないんだったらメルマガやメーリングリストでも使えばいいじゃん。
75nobodyさん:2006/09/22(金) 10:20:42 ID:???
>>72-73

>>35>>40
を書いた者だが、
もうおまえ去れ。
スパム業者でないという保証もないし。
これだけヒントもらってるんだから自分でやれよ。
76nobodyさん:2006/09/22(金) 10:39:14 ID:???
>>74
そういうシステム使うと、その業者を儲けさせるだけ
やつらは、人様が苦労して作成したコンテンツに広告を載せて配信し、ぼろ儲けしている
7733:2006/09/22(金) 10:50:43 ID:???
>>73
> プログラムで送ろうとせずに、eml形式のメールデータをローカルなperl環境で1万個作ってメーラーにインポートして一斉に送ってはいかが?
ありがとうございます。
最終段階で送信プログラムを実行するんじゃなく、
<p><a href="mailto:foo\@bar.com?bcc=$mail&subject=$subject$body=$body">SUBMIT</a></p>
というHTMLを吐き出すことにしました。


>>74
>> 1万件のメールアドレス(@配列にいれてあります)にメールを送信したい。
> もうこの時点で目的は何であれスパムだよな。
配信希望者に送る場合もでもスパムというのでしょうか?

> そうじゃないんだったらメルマガやメーリングリストでも使えばいいじゃん。
そのメルマガのコーディングについての質問です。

>>75
いただいたヒントを参考に解決しました。

みなさま、本当に有難う御座いました。
78nobodyさん:2006/09/22(金) 11:04:03 ID:d6rNV+wj
ID出して否定しないし33の名前は全部同一人物だろ
結局mailtoでBCCwwwww
Perl関係ないじゃんww
解決乙。もう来るなよ

>>75
>>73は33とは別の人ね。すげー親切で泣ける
7975:2006/09/22(金) 11:10:34 ID:???
ホントだ・・。>>73さんごめん。
8033:2006/09/22(金) 11:12:12 ID:???
>>78
> ID出して否定しないし33の名前は全部同一人物だろ
最初にIDを出していないので、否定しようと騒いでも余計に悪化すると思いまして。

お陰様で解決しました。
81nobodyさん:2006/09/22(金) 11:13:44 ID:???
変ななりすましはスルーでOK
82nobodyさん:2006/09/22(金) 11:56:21 ID:???
だが、否定ぐらいはしとけと。
83nobodyさん:2006/09/22(金) 12:14:06 ID:???
>>57
最近のperl使ってシェルを経由させずに起動すれば良いだけ。

> Sendmail の引数で指定するのは、一般的にはやっちゃいけない方法と言われてるね
無知をさらけ出されても困る。
84nobodyさん:2006/09/22(金) 13:09:56 ID:???
>>76
自分で鯖立てればいいだけじゃん。
85nobodyさん:2006/09/22(金) 16:20:39 ID:URN28btq
post データが
a0=1&b0=1&a1=4&b1=2&a2=2&b2=2&・・・&an=8&bn=9
と"a".$i =数字と"b".$i=数字となっているものを
postgresql にperl でupdateしたいのですが、

for($i=0;$i < n; $i++){
$str ="update table set a=$html->param('\"a\".$i') where b=$html->param('\"b\".$i)";
$sth=$dbh->prepare($str);
$sth->execute();
}
こんな感じでupdateしたいのですが,試行錯誤の上に挫折中です。
うまい方法はないですか?
86nobodyさん:2006/09/22(金) 16:31:12 ID:d6rNV+wj
$html->param('\"a\".$i')
をprintしてみたらどうでしょうかね
87nobodyさん:2006/09/22(金) 16:38:47 ID:???
$html->paramはなんですか?文字列ですか?メソッドですか?
$strに何が代入されてるんですか?
88nobodyさん:2006/09/22(金) 16:50:49 ID:???
>>87
どうみても $html は CGI のインスタンスだし、$str には SQL 文が代入されてるがな。(´・ω・)

文字列の中でメソッド呼び出しってできたっけ?
一旦 param の内容を変数に代入してから $str に埋め込んでみては?
89nobodyさん:2006/09/22(金) 16:50:53 ID:URN28btq
>>87
>$html->param

$html=new CGI;
です。
>$str
にはpostgresqlに対するupdate のストリングが入って欲しいものです。

>>86
CGI=HASH(0x804c914)->param('"a".1')
となりました。
90nobodyさん:2006/09/22(金) 16:56:20 ID:???
てか、パラメータを直接 SQL 文に埋め込むと SQL インジェクションできるんじゃね?
91nobodyさん:2006/09/22(金) 16:58:49 ID:???
流石○○板だな
9286:2006/09/22(金) 16:58:56 ID:???
>>89
いや意味的には>>88と同じで変数を確認ってことです
っつーかbのシングルクォート
93nobodyさん:2006/09/22(金) 17:03:18 ID:???
$html->paramはなんですか?クォートの中から呼び出せるんですか?
$strに何が代入されてるんですか?
確認しましたか?
94nobodyさん:2006/09/22(金) 17:04:10 ID:???
アッー!
95nobodyさん:2006/09/22(金) 17:51:48 ID:???
>>85
$htmlってのは
use CGI;
my $html = new CGI;
したもんだと仮定しますた。それから、
$dbh は、DBI/DBD::Pgで接続したときのインスタンスと仮定しますた。んで、

まず、$html->param('\"a\".$i') ってのがおかしい。全体をシングルクォートしてしまうと$iは展開されません。
まあ、$html->param("a$i") だとします。

そんで、ダブルクォーテーションの中に $html->param("a$i") を入れちゃうと、
$html と ->param("a$i") とに分かれて解釈されちゃうので、外に出してください。

だけれど、せっかくprepare使うんなら

my $sth = $dbh->prepare("update table set a=? where b=?");
for ( $i=0; $i < n; $i++) {
    $sth->execute($html->param("a$i"), $html->param("b$i"));
}

などとしてはいかがでしょうか?

※上記のソースで n が裸で出てくるのはおかしいです。use strictすれば教えてくれます。
※SQL-injectionのチェックはしてくださいね。
96nobodyさん:2006/09/23(土) 06:00:23 ID:08cXFZbB
Perlで、サニタイズするときの定番の関数は何ですか?
PHPだとhtmlspecialchars()というのが標準で備わっているんですけど、Perlでそれに相当するものは何になるんでしょうか。
(自分で書くのは簡単なんですけど、できればPerl標準のものがあればそれを使ったほうがいいかなと考えています。)
97nobodyさん:2006/09/23(土) 06:57:54 ID:???
PHPのそれに相当するビルトイン関数はないよ
98nobodyさん:2006/09/23(土) 07:46:28 ID:???
>>97
ライブラリ関数で結構ですので、教えていただけませんか。
99nobodyさん:2006/09/23(土) 08:34:56 ID:???
Perl標準もデファクタスタンダードと呼べるものもないと思うよ

HTMLを使用するモジュールには大概あるから(CGI、TT、HTML::Templateなど)
あとは自前で用意するんじゃないかな
100nobodyさん:2006/09/23(土) 08:39:51 ID:???
101nobodyさん:2006/09/23(土) 09:31:06 ID:???
サニタイズゆうな。クズ。
10216:2006/09/23(土) 16:17:05 ID:???
今日、@IT に自分が質問していた内容に関する記事が追加されました。

http://www.atmarkit.co.jp/fsecurity/rensai/hoshino10/hoshino01.html

自分が書き込んでから数日以内のことなので、ひょっとしたらこのスレ見ててくれたのかな、と思ったりw
偶然かもしれないですけど・・・

もし、見ていてくれたのなら 杉山 さん、本当にありがとです。
103nobodyさん:2006/09/23(土) 17:05:32 ID:???
ねーよw
104nobodyさん:2006/09/23(土) 17:24:16 ID:???
>>16 より引用

> バイナリエディタで解析した " (ダブルクォート) の 16進表記は、"22" です。
> ここで、$hoge に バイナリレベルで "82" をいれてみるとどうなるかやってみました。(バイナリファイルを一般のテキストエディタで表示したときの、"・"(半角) と表示されるあれです。)
> それを出力して、IE と Firefox と Opera で表示したところ、 "82 22" で 1つの不正な文字 "・"(全角) として表示され、ダブルクォートが消えうせていました。


>>http://www.atmarkit.co.jp/fsecurity/rensai/hoshino10/hoshino02.html より引用

> 赤坂さんの入力には、「%82」という文字列が含まれている。


22 はダブルクォートだけど、82 はようするに22と組み合わされて1つの2バイト文字と扱われればいいわけで、82である必然性が無い。
参考リンクの、http://applesoup.googlepages.com/bypass_filter.txt にも 82 は出てこないからね


以上の理由により、杉山氏はこのスレを見ている可能性が高い
105nobodyさん:2006/09/23(土) 17:43:34 ID:???
http://www.atmarkit.co.jp/fsecurity/rensai/hoshino10/hoshino03.html によれば、
php なら、mb_convert_encoding($_GET{'hoge'},'SJIS','SJIS')) で対策できるみたいだね。

Perl の jcode.pl で同じことやったが、無理だったわ。
不正な文字列を変換してもそのままになっちゃうみたい。

Perlで対策するにはどうすればいいんだろうか・・・。
106nobodyさん:2006/09/23(土) 17:59:04 ID:???
>>29 じゃだめなんかい。
そんなに面倒だったら、受け取った文字列の後ろにスペース一個くっつけとけば?
107105:2006/09/23(土) 18:02:03 ID:???
>>106
なるほど
それでできるのか
ありがとうございます
108105:2006/09/23(土) 18:15:29 ID:???
$str = qr/^([\n\x20-\x7e\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$/

の qr ってなんだろう。と調べてみました。

http://psst.jp/syn/archives/000199.html

つまり、>>29 は、「^([\n\x20-\x7e\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$」を、正規表現としてコンパイルしているわけですね。


実際に $GET_hoge の無効な文字列を削除するには、

$GET_hoge =~ s/$str//g

とすればいいわけですね。

ありがとうございます。
109nobodyさん:2006/09/23(土) 18:23:40 ID:???
この脆弱性、CGI配布サイトで配られている大部分の掲示板スクリプトとかにとかに影響していますね・・・
漏れの使っている Child Tree とかはもろ影響してるし

実はphpユーザなんでPerlのことよくわからないや(´・ω・`)
しかも自分で書いたスクリプトじゃないから修正が大変です><

本来出力時のエスケープがいいと思うのですが、、print 内の変数を全て書き換えるのは大変なので、
GET と POST として送られてきた全てのデータに >>29 の正規表現を適用させる方法は無いでしょうか

どうかお願いします
110105:2006/09/23(土) 18:33:56 ID:???
あれ、動かしてみたけど、駄目でした。

> つまり、>>29 は、「^([\n\x20-\x7e\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$」を、正規表現としてコンパイルしているわけですね。

まではいいんですが、

> 実際に $GET_hoge の無効な文字列を削除するには、
> $GET_hoge =~ s/$str//g

は違ったようですね。

「^([\n\x20-\x7e\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$」は正しいパターンなので、

if ($GET_hoge !~ $str) {
&error("貴方が送信した文字列はShift_JISとしてValidではありません。");
}

みたいに使うってことだったようです。
111nobodyさん:2006/09/23(土) 18:36:49 ID:???
Encode.pmでは無理か?
112nobodyさん:2006/09/23(土) 18:38:01 ID:???
>>109
製作者に言えよw
113nobodyさん:2006/09/23(土) 18:52:41 ID:9+jKDZxZ
指定したファイルを読み込んで、そのファイル内に記述された$aaa等の変数をperl内の内部変数に置き換えるにはどうすれば良いですか?
114nobodyさん:2006/09/23(土) 18:57:30 ID:???
>>110
最後の1バイトがゴミかどうか調べてみれば?

>>113
while(<DATA>){
${$1} = $2 if /^(\w+)=(.*)/;
}
print $aa;
__END__
aa=bb
115nobodyさん:2006/09/23(土) 19:01:07 ID:???
^([\n\x20-\x7e\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$ の意味を考えてみた

"\n" は改行文字、"\x" はなんだか良く分からないけど、バイナリレベルで調査するって宣言かな
"\x20-\x7e" は、16進数の "20" から "7e" ってことか
2桁の16進数だから、

16^2 = 256 = 2^8 = 1バイト

つまり、この [] の1ブロックで、1バイトってことだね
1ブロック目、2ブロック目、3ブロック目全てが 1バイトのよう

これを括弧でかこって繰り返しにしている

あれ?

ってことは、3バイトの文字列で始まり、それが0回以上繰り返される?
例えば、ユーザ入力値が "ab" だったら不正扱い?

でも試してみたらそうならないし

う〜ん
116nobodyさん:2006/09/23(土) 19:36:39 ID:???
正規表現ってそんなわかりにくいのかな。

>>110,115
その場合こう。
というかちょっと数行に分けて書き換えてみるからこれでわかって。

my $reg_alpha = qr/(?>[\t\r\n\x20-\x7e]+)/; # アルファベットの連続
my $reg_han_kana = qr/(?>[\xa1-\xdf]+)/; # 半角カナの連続
my $reg_multi = qr/(?>(?:[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])+)/; # 2バイト文字の連続

$GET_hoge =~ s/^((?:$reg_alpha|$reg_multi|$reg_han_kana)*).*$/$1/;

テストはしてない。
117nobodyさん:2006/09/23(土) 19:39:36 ID:???
>>113
状況がよくわからんが、
・require
・eval
・正規表現
お好きなのを使ってどうぞ
118nobodyさん:2006/09/23(土) 19:42:38 ID:???
>>116
あー、o 修飾子つけた方がよかったかもしらん。たいしてかわらんかもだけど。;
119nobodyさん:2006/09/23(土) 19:49:01 ID:???
>>115
全然違う…。

[¥n¥x20-¥x7e¥xa1-¥xdf]
が、ASCIIキャラクタとsjis半角カナ ... A

[¥x81-¥x9f¥xe0-¥xfc][¥x40-¥x7e¥x80-¥xfd]
がsjis2バイト文字 ... B

/^(A|B)*$/
だから、1バイト文字と2バイト文字で構成されている文字列にマッチする。
(sjisのみ対応)

正規表現の2バイト目の最後、0xfdまで文字あるから直しておいた。
120nobodyさん:2006/09/23(土) 19:51:21 ID:???
>>116
(´・ω・)
$GET_hoge =~ s/^((?:$reg_alpha|$reg_multi|$reg_han_kana)*).*$/$1/os;
121115:2006/09/23(土) 20:10:01 ID:???
>>116
ご親切にありがとうございます。
あとでそれぞれの修飾子の意味を調べながら解読してみようかと思います。

>>119
なるほど。
プロポーショナルフォントなせいで "|" を見落としていました。
そのせいで、3バイトを意味すると思って混乱していたようです。
誤解が解けてすっきりしました。
本当にありがとうございます。

「ASCIIキャラクタとsjis半角カナ」 と 「sjis2バイト文字」 では当たり前かもですが、1バイト目が重複することはありえないわけですから、
Shift_JIS の [?x81-?x9f?xe0-?xfc] で終わっているようなのは不正ですね。

# http://www.atmarkit.co.jp/fsecurity/rensai/hoshino10/hoshino02.html
# [マルチバイト文字の1バイト目(0x82)] ってどういうことなんでしょう。
# "82" がマルチバイト文字の1バイト目ということは分かるんだけど、"0x" って・・・。
# マルチバイト文字の1バイト目が "82" であるということを、"0x82" と表記するって決まりがあるんだろうか。
122115:2006/09/23(土) 20:10:35 ID:???
2chブラウザでコピペしたときに正規表現が変になっちゃいました
123nobodyさん:2006/09/23(土) 20:21:34 ID:???
おまえらおもしろいな

use Encode qw/encode decode/;
encode( 'sjis', decode( 'sjis', $q->param('query') ) );
124nobodyさん:2006/09/23(土) 20:23:05 ID:???
>>121
0x の接頭辞は、16進数である事を示す。
0x82 で16進数の82を指す。
125nobodyさん:2006/09/23(土) 20:24:48 ID:???
126nobodyさん:2006/09/23(土) 20:43:33 ID:???
まあ、いちいち変換→逆変換するのは無駄い気もするけどね。
127121:2006/09/23(土) 21:39:58 ID:???
>>124
サンクスです
128nobodyさん:2006/09/23(土) 21:39:59 ID:???
PERL5ってこのスレでいいの?
129nobodyさん:2006/09/23(土) 21:49:51 ID:???
>>123
あーEncodeって半端なマルチバイトを落としてくれるのか知らなんだ
入力された文字コードのチェックするしコストにはならないよね
130nobodyさん:2006/09/24(日) 00:58:20 ID:???
Encode.pmはjcode.plよりも劣るから使ってない
jcodeにはutfパッチのやつとかあるしさ
131nobodyさん:2006/09/24(日) 01:07:12 ID:???
>>130
凄い釣りですね^^
次はPerl5はPerl4より劣るから使ってないとか言い出すんですか?
132nobodyさん:2006/09/24(日) 01:15:21 ID:???
ワロス
133nobodyさん:2006/09/24(日) 01:27:45 ID:???
そんなエサに俺様がクマー
134nobodyさん:2006/09/24(日) 04:38:21 ID:???
勉強になるなぁ。
135nobodyさん:2006/09/24(日) 04:47:31 ID:???
釣りの?(´・ω・`)
136nobodyさん:2006/09/24(日) 05:19:33 ID:???
=チラシの裏
最近 perl の
  my $this = shift or return;
  $hoge ||= 'hogehoge';
  $piyo &&= piyopiyo($piyo);
こういう書き方にエクスタシーを感じてきた。 if文いらないのステキすぎ。
=cut
137nobodyさん:2006/09/24(日) 05:33:37 ID:???
おまいらPerlメモを知らないのか?
ttp://www.din.or.jp/~ohzaki/perl.htm
138nobodyさん:2006/09/24(日) 11:31:51 ID:???
良くわからない正規表現使うよりは、
String::Multibyteモジュールを使ってみるのも。
use String::Multibyte;

my $str = "イリーガル\x82";
my $sjis = String::Multibyte->new('ShiftJIS');
print $sjis->islegal($str) ? 'true' : 'false';

ttp://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
も参考になる。
139nobodyさん:2006/09/25(月) 00:34:54 ID:wf+gGDeG
21:00pmにc:\beta.exeを終了させるプログラムはどのようなソースになりますか?
140nobodyさん:2006/09/25(月) 01:22:59 ID:???
>>139
>>1 ぐらい読め。
> 【投稿する際の注意】
> 質問するときは内容をよく吟味してから投稿してください。
> 「コマンドの意味がわかんない」とかはマニュアル見ましょう。
> 回答者さんは何でも屋じゃありません。
>
> 1: 自分はこういう事がしたい。
> 2: それでこんな風にやってみたが・・・
> 3: こんなエラーが出て上手く行かなかった。
141nobodyさん:2006/09/25(月) 06:43:54 ID:???
>>99,100
さんくすです。
142nobodyさん:2006/09/27(水) 10:30:04 ID:???
ひさびさにPerlメモ見たら、

※上記の内容について
最近の perl(perl5.8.8等)では,index 関数を使うよりも, /\Q$keyword\E/ という正規表現を使った方が速いようです.実行速度は perl のバージョンや実行環境,スクリプト等に影響されるため,必要に応じてベンチマークをとるのがよいでしょう.

って書かれてた。7月下旬に更新されたらしい。
数年越しでも書き換えなきゃいけない情報をちゃんと更新するのは偉いなあ・・・。ちょっと遅いけど、まあGJ!
143nobodyさん:2006/09/27(水) 12:02:27 ID:???
正規表現を使わないなら関数を使うより速いことが多い
144nobodyさん:2006/09/27(水) 16:45:21 ID:???
日本語でおk
145nobodyさん:2006/09/27(水) 16:57:20 ID:???
/\Qpenis\E/ ⇒ 正規表現なし ⇒ 高速
/^pen(?: )?is$/ ⇒ 正規表現あり ⇒ 低速

C言語のstrcmp()に置き換えできるような場合、Perlでは/〜/を使う方が速い
…とどこかのサイトに書いてあったがURLを紛失してしまった
146nobodyさん:2006/09/27(水) 17:13:22 ID:???
でも誤差程度ならindexでいい気が。
147nobodyさん:2006/09/28(木) 08:51:24 ID:???
@new_word_list = keys %new_bad_hash;
print "new_word = $new_word","\n";
print "last_bad_hash{new_word} = $last_bad_hash{$new_word}","\n";
とすると
$new_wordはちゃんと入っているのですが、ハッシュの値が表示されません。

@new_word_list = keys %new_bad_hash;を
@new_word_list = ("A","B","C");と直に書くとうまく表示されます。

printで表示すると両者ともA B Cと表示されます。
前者と後者の違いはなんだろうと思い、
chomp、=~ s/\s/ /g;をしてみたり、lengthで長さを確認してみたのですがいっこうに
違いがみいだせません。
この違いは何なんでしょうか?
148nobodyさん:2006/09/28(木) 08:55:20 ID:???
すみません>>147の$new_wordは@new_word_listから適当にとってきたものです。
149nobodyさん:2006/09/28(木) 09:11:56 ID:???
$new_word もそうだが、
%last_bad_hash は %new_bad_hash と関係あるのか >>147 じゃわからないんだがw
情報小出しにしないで、自分で質問文読んで理解できるように書いてね・・・
150nobodyさん:2006/09/28(木) 09:28:43 ID:???
えと、%last_bad_hash は %new_bad_hashとキー($new_word)が同じハッシュで、
%new_bad_hashからキーを取り出して$last_bad_hashのハッシュ値を得ようとしています。

しばらくいじってたんですが、
キーが全部アルファベットだとうまくいくみたいです。
日本語だと前者はダメで、直に書いた後者は大丈夫でした。
151nobodyさん:2006/09/28(木) 12:32:45 ID:???
>>147
整理すると、
$new_word の値は、%last_bad_hash のキーであるはずなのに、$last_bad_hash{$new_word} の値が表示されないのですね。
%last_bad_hash のキーの中に $new_word の値が存在しないからそのような現象が起きるので、$new_word の値と、
%last_bad_hash のキーをすべて表示させてみてはいかがですか。値の中にスペースが入っているということはないんですか?
2バイト文字の場合文字コードの問題もありますよ。
print unpack("H*", $new_word);
print unpack("H*", join(",", keys %last_bad_hash));
とでもやって値を比較してはどうですか。
152nobodyさん:2006/09/28(木) 13:43:21 ID:???
文字コードの問題でした。。。。EUCとJISが混在してました。
すみません。ありがとうございます。
153nobodyさん:2006/09/28(木) 17:27:09 ID:???
はじめまして。
スレ違いでしたら、申し訳ありません。

社内で使用するために、掲示板を設置する作業を請け負いました。
フリーの添付ファイルアップロード機能付きの掲示板を設置したのですが、
添付ファイル名に日本語が使用したいという希望により、
レス番などを用いたユニークなファイル名に変換して、
サーバーへ保存する改造を行いました。
すると、ダウンロードする際に名前が変わってしまうので(当たり前ですよね;)
どうにかならないかとの希望が出て、どうすればいいか迷っています。

コメント文を保存しているファイルには、
『添付ファイルの元の名前』『サーバー保存用に変換している名前』も書き出しています。

添付ファイルのダウンロードは、単純に<a></a>で直接ファイル名を指定しております。
ダウンロードの際に、元のファイル名に変換するという事が出来るのでしょうか?
また他に何かいい方法があれば、お知恵を貸していただきたいのですが。
よろしくお願いします。
154nobodyさん:2006/09/28(木) 17:40:49 ID:???
> また他に何かいい方法があれば、お知恵を貸していただきたいのですが。
> よろしくお願いします。

御社の出入り業者に発注すればよろしいのではないかと。
155nobodyさん:2006/09/28(木) 18:04:21 ID:???
>>153
できるよ。
ファイル名に変換するんじゃなく、保存するときのデフォルトのファイル名を変えるってだけだけど。
156nobodyさん:2006/09/28(木) 18:09:05 ID:???
簡単に言うとこうか
print "Content-Disposition: attachment; filename=\"$filename\"\n";
くわしくは ↑ でぐぐって。
157nobodyさん:2006/09/28(木) 18:31:39 ID:???
日本語ファイル名だとさらにひとひねり必要だが、↑をぐぐってよく調べれば
その辺もわかるだろう。
158nobodyさん:2006/09/28(木) 18:58:11 ID:???
159nobodyさん:2006/09/28(木) 19:03:19 ID:???
>>154-158
レスありがとうございます。
頭こんがらまくりですが、がんばって調べてみます。
でも多分、私なぞの頭では無理そうなので、
「出来ません!」と開き直る率高しです。(;´Д`)

>>154さんのご指摘の通り、
こんなHP担当もどきに頼まず、ケチってないで外注さんに依頼しろ!って感じです。
グチってもしかたないですがw

ありがとうございました!
160nobodyさん:2006/09/28(木) 21:27:50 ID:???
> でも多分、私なぞの頭では無理そうなので、
> 「出来ません!」と開き直る率高しです。(;´Д`)

坊や頭大丈夫かい?
161nobodyさん:2006/09/28(木) 23:16:37 ID:???
>>160
ああああ ごめんなさい。
書き方悪かったですね。
私に依頼してきた、社内の人にです。
私には分不相応ですので、ファイル名には気をつけてくださいと伝えるつもりです。
教えてくださった事は、勉強しています。
162nobodyさん:2006/09/29(金) 00:22:15 ID:CoNVbZUT
$HOUSYUGAKU = "-892-4305-2940";
$KOSUU = "-4-1-2";
$GOUKEI_HOUSYUGAKU = "-3568-4305-5880";
$SYOHIN_CODE = "-CODEA-CODEB-CODEC";

@housygaku_list = split(/\-/,$HOUSYUGAKU);
@kosuu_list = split(/\-/,$KOSUU);
@goukei_housygaku_list = split(/\-/,$GOUKEI_HOUSYUGAKU);
@syohin_code_list = split(/\-/,$SYOHIN_CODE);

for($i = 0; $i < @housygaku_list; $i++) {
$TOTAL .= "&si=" . $housygaku_list[$i] . "." . $kosuu_list[$i] . "." . $goukei_housygaku_list[$i] . "." . $syohin_code_list[$i];
}

として、$TOTALの値を&si=892.4.3568.CODEA&si=4305.1.4305.CODEB&si=2940.2.5880.CODEC
としたいのですが、&si=...&si=892.4.3568.CODEA&si=4305.1.4305.CODEB&si=2940.2.5880.CODEC
となってしまいます。

どのようにすれば問題解消するでしょうか?
ご教授お願いします。
163nobodyさん:2006/09/29(金) 00:24:23 ID:???
自宅サーバ板で聞いたら鯖関係なかったみたいなので
こちらで質問します

↓これ自分です
948 名前:DNS未登録さん :2006/09/26(火) 20:33:39 ID:szdp6kC6
質問です。ググッたけど分かんなかったです
環境はWinXP Home SP2 apache1.3.27

画像をアップロードして掲示板から参照するCGIを
作ったんですが、日本語ファイル名をSJISで
アクセスしようとすると、FORBIDDENになります

例えば
猫.jpgにhttp://%94L%2ejpgでアクセスできない
あ.jpgにはできる

ログを見ると罵.jpgにアクセスしようとしています
罵.jpgは%94l%2ejpgなので、SJISの2バイト目のL大文字がl小文字になってる事が
原因だと思うんですが、何か解決策はないでしょうか?

もしやWindowsが大文字と小文字区別しないから無理、とかですか?

どなたかお願いします


いただいたレスでLを%4Cにすればイイとあったんで
$filename =~ s/(\W)/'%' . unpack('H2', $1)/eg;
$filename =~ s/([A-Z])/'%' . unpack('H2', $1)/eg;
↑の様にして見ましたが結局%94%4c%2ejpgでアクセスしても
Apacheのエラーログに罵.jpgにアクセスしていると書かれます

これってこういうものなんでしょうか?
164nobodyさん:2006/09/29(金) 01:06:10 ID:???
HTML に URL エンコードされた文字列を書くんじゃなくて、直接日本語ファイル名を HREF に書いてみ
165163:2006/09/29(金) 01:24:30 ID:???
レスありがとうです
猫.jpgにアクセスしてみたんですが同じでした

エラーログも
(2)No such file or directory: file permissions deny server access:
と出るのが気になります。なんでパーミッションエラー?
ファイル名が違うのなら404だと思うんですが…
166nobodyさん:2006/09/29(金) 06:55:52 ID:???
うちの IEタン と Fxタン では %94L.txt 、 %94l.txt 両方とも普通に判別してできたけど?
何が違うんだろうねえ。
windows でも、たとえば 猫.txt と 罵.txt は同じフォルダに共存できてるので、そのせいじゃないっぽい気がするけどね。
もしかしたらブラウザのせいかもしれないよ。
167nobodyさん:2006/09/29(金) 10:12:37 ID:???
向こうでも見たけど、普通にアクセス権がないだけとかじゃねーかよ。
168nobodyさん:2006/09/29(金) 10:44:20 ID:???
あるあるwww
169nobodyさん:2006/09/29(金) 13:34:48 ID:???
まじかよw
「Apacheのエラーログに罵.jpgにアクセスしていると書かれます」
が全てにおいてなってるって信じてそれは除外してたのにw
170ソケット:2006/09/30(土) 01:35:35 ID:jL8SsxbP
次のコードでソケットが生成できないです。ヒントでも欲しい。。。
どうもサーバの問題な気もするけど。。。
$proto = getprotobyname('tcp');
unless($iaddr = Socket::inet_aton($host)){return;}
$sock_addr = Socket::sockaddr_in($port, $iaddr);
unless(socket(SOCKET, Socket::PF_INET, Socket::SOCK_STREAM, $proto)) {
print "error"; return;
}

でerrorになります。スクリプトはコピペじゃなくて手書きなので、
万一誤記があったら申し訳ありません。
ただし、問題のコードは別のレンタルサーバで動いていたので、
実機に誤記はないはずなんです。
$hostはlocalhostです。

環境:fedora core4 perl5.8
171nobodyさん:2006/09/30(土) 01:41:09 ID:???
>>170
とりあえず、情報が少なすぎるので氏ね
172ソケット:2006/09/30(土) 01:51:07 ID:jL8SsxbP
申し訳御座いませんでした。
perlのバージョン:5.8
インストールされているライブラリは多くて書き込めないのですが、
fedora core 4 の「サーバインストールモード」でインストールして、
その後sendmail-cf、qpopper、gccをrpmで入れました。

すみません。他にどんな情報が必要なのかが。。。
サーバ関係の板かな?
173nobodyさん:2006/09/30(土) 01:55:43 ID:???
そんな断片的なコードで動く動かないと言われても、
誰も答えることができないよという意味。

ぼくのちんちんで彼女がイってくれません。どうしてでしょう?と同じだもん。

最小のテストコードで試して何が悪いか追求しましょう。
174ソケット:2006/09/30(土) 03:31:10 ID:???
不快な思いをさせまして、すみませんでした。
追求してみます。
175nobodyさん:2006/09/30(土) 08:18:25 ID:???
>ぼくのちんちんで彼女がイってくれません。どうしてでしょう?と同じだもん。
例えが素晴らしい
176163:2006/09/30(土) 13:43:31 ID:???
>>167-169
レスありがとうです

猫.jpgと 罵.jpgを同じフォルダに置いて
http ://%94%4c%2ejpgにアクセスすると罵.jpgが表示されます
しかもその際他の画像よりロードが長いです
また、http ://猫.jpgでも罵.jpgが表示できました

%94%4c%2ejpg→%94L%2ejpg→%94l%2ejpg→罵.jpg
こういう流れなのでしょうか…?
177nobodyさん:2006/09/30(土) 16:11:26 ID:???
>>176
mod_encoding
スレ違い
178nobodyさん:2006/10/01(日) 12:28:14 ID:???
正規表現に、ー(長音記号)を使うにはどうしたら
いいのでしょうか?
179nobodyさん:2006/10/01(日) 12:58:10 ID:???
???
180nobodyさん:2006/10/01(日) 14:00:28 ID:???
>178
日本語でおk
181178:2006/10/01(日) 17:57:37 ID:???
すみません。

perlのCGIでhtmlファイルを標準出力に出力しようとしています。
それでhtmlのformのvalueに「カラー」と入れています。
そしてCGI側で変数に
$color = "カラー";
としていて、$colorとマッチした行を書き換えたいのです。

それで
$line =~ s/$color/xxxxx/;
と書いているのですが、
htmlファイルが上手く出力されません。

この行をコメントアウトするとhtmlがすべて出力されるので
この行に問題があるようなのです。

182nobodyさん:2006/10/01(日) 18:08:31 ID:???
>>181
「カラー」が「color」ならうまくいきません?
それでうまくいったら文字コードの関係でしょう。
183nobodyさん:2006/10/01(日) 20:28:54 ID:???
$color = quotemeta $color;
あるいは
$line =~ s/\Q$color\E/xxxxx/;
184nobodyさん:2006/10/01(日) 21:19:06 ID:???
俺も初心者だけど。。。

Shift-JISだと、”ー”の第2バイトが”[”ってことかな〜?
後々の事を考えると、EUCかUTF-8がいいかもね。

use encoding "shiftjis";
185nobodyさん:2006/10/01(日) 21:56:19 ID:???
use encoding なんか薦めないでくれwww
186nobodyさん:2006/10/01(日) 21:57:04 ID:???
>>184
初心者に不用意に encoding.pm を教えるなよ。
187nobodyさん:2006/10/01(日) 22:17:27 ID:???
encoding って負の遺産だろ・・・
188nobodyさん:2006/10/01(日) 22:32:53 ID:???
さんざんでわろたw
189178:2006/10/01(日) 22:43:04 ID:???
みなさんアドバイスありがとうございます。
ということは>>183さんのやり方がいいのでしょうか?
明日試してみます。ありがとうございました。
190163:2006/10/02(月) 00:08:50 ID:???
>>177
遅れましたがレスありがd
ちょっと調べたんですが、Windows版のApache1.3用mod_encodingって
もしかして無いんでしょうか?

自分でビルドするしかないって事になるのでしょうか

あ、自宅サバ行った方がいいかな
191nobodyさん:2006/10/02(月) 18:06:42 ID:NJMhk9xt
ASCIIコードを文字に変換するのってどうすんの?
"\x20"→" "みたいな感じ
192nobodyさん:2006/10/02(月) 18:12:31 ID:???
perl -e 'print +( chr( "¥x20")) . "¥n"'
193nobodyさん:2006/10/02(月) 18:14:51 ID:???
おおまちがい orz...
194nobodyさん:2006/10/02(月) 18:54:08 ID:???
ハッシュのアドレスを使ってそのアドレス先のハッシュのキーを取り出すことは可能ですか?
$ref_hashがハッシュのリファレンスだとすると
keysはハッシュしか受け付けてくれないので、
$ref_hashからハッシュを復元(?)してkeysで取り出したりできないだろうかと
思っているのですが
195nobodyさん:2006/10/02(月) 18:56:59 ID:???
196194:2006/10/02(月) 19:03:04 ID:???
あるハッシュへのアドレスがあって、そのアドレスが$ref_hashです。
それで、そのハッシュのキー値がしりたいのですが、
無名ハッシュなので、なんとかしてアドレスからわからないだろうかと・・・
197nobodyさん:2006/10/02(月) 19:15:47 ID:??? BE:264939146-BRZ(1100)
デリファレンスってどうやんだっけ?
198nobodyさん:2006/10/02(月) 19:26:18 ID:???
$ref_hashがハッシュのリファレンスなら

keys %$ref_hash

だがアドレスといっているので何か違う世界の話かもしれないな...



199nobodyさん:2006/10/02(月) 19:41:16 ID:???
リファレンスを文字列にすると、"型(アドレス)" が得られるけど、このアドレスの事?
perl -e "print [123];" → ARRAY(0x123456)


まあリファレンスの事だろうけど
200nobodyさん:2006/10/02(月) 19:46:10 ID:???
encoding って使うとまずのですか?
201194:2006/10/02(月) 20:01:46 ID:???
いやリファレンスのことです。。。
すみません、ありがとうございました。
202nobodyさん:2006/10/02(月) 21:02:26 ID:???
>>200
まずくありません。よく知られた罠があり、使う場面を選ぶというだけです。しかしそのため、

「よくわからないけれどとにかく動くようにしたい人」に勧めると、二日ほど経ってから「今度は思わぬところがアッー! で困っています」と泣き付かれるかもしれず、
「プログラムやライブラリを配布して社会に貢献したい人」に勧めると、膨大な数の配布先が use encoding の罠に汚染されてしまうかもしれず、
「夢と希望と探究心に溢れた初心者」に勧めると、貴重な学習曲線の序盤でつまらない無駄足を踏ませてしまうかもしれず、

などの事情で大抵は勧めにくいということです。
適切な使いどころがわからないなら使わないほうが無難でしょう。
203nobodyさん:2006/10/02(月) 21:30:58 ID:kJiDkda9
すみません、他スレから誘導されてきました。

ホスト名が検索できない海外の串からのアクセスが多くて困っています。
そこでそのようなアクセスを弾くようにするにはどのような手を加えたらよいでしょうか?
良く見かける言葉では
・ホスト名が無い時に弾く
・逆引きできないホストからのアクセス禁止
のようになるとおもいます。

難しい事は分からないので出来るだけ簡単に何かないでしょうか?
よろしくお願いします。
204nobodyさん:2006/10/02(月) 22:16:03 ID:???
>>202
ありがとう。
よく知られた罠とは何でしょうか?
少しググって見ましたが、こんな感じのやつしょうか?

Allen's diary(2005-04)
http://www.tokimeki.st/diary/?date=200504

Perlで何だか妙なエラーが出て悩まされた件について。
具体的には、"Wide character in subroutine entry"って何やねんっ!と悩んでたけど、
よくよく考えたら

use encoding "shift-jis"してるから標準入力から取り込んだ文字列は既にUnicodeに
なってるというのに、わざわざEncode::from_to($str, "shiftjis", "euc-jp");とかやってた

複数ファイルへのリダイレクトのために標準出力を一旦閉じて開きなおす際に文字コードを
指定しなおしてなかった(出力はeuc-jpだけど、use encoding "shift-jis", STDOUT=>'euc-jp';で
満足してた)という二重障害が原因と判明。慣れないことをするからこんな恥ずかしいバグが
出るんだよ_| ̄|○
205nobodyさん:2006/10/02(月) 22:33:23 ID:???
>>203
それは 「自分ではperlコードなんか作りたくないけど、どこかそういうコードを配布してるところを知りませんか?」 ってこと?

自分でやるなら、$ENV{REMOTE_ADDR} と $ENV{REMOTE_HOST} 、
それに gethostbyaddr や gethostbyname でぐぐってみていろいろ自分で考えて、
それでもわからなかったら聞きにおいで。

>>204
そのひと、いろんな意味で何やってるのかわからんねw
206nobodyさん:2006/10/02(月) 22:37:55 ID:???
>>204
概ねそれです。しかし実際にはもっと大きな罠です。
「use encoding の効果は use encoding されたプロセスの I/O 全てに効いてくる」というのがその理由です。
つまり自分だけでなく、他人の書いたコードの "use encoding" safe を気にしなければなりません。
use や require で読込まれたコードがそれっぽい処理をしているとアウトですから。

そんなのイヤでしょ?
207nobodyさん:2006/10/02(月) 22:50:41 ID:???
>>206
ああ、なるほど。
納得しました。
サンクスです。
208203:2006/10/02(月) 23:49:15 ID:???
>>205
>それは 「自分ではperlコードなんか作りたくないけど、どこかそういうコードを配布してるところを知りませんか?」 ってこと?
配布している所があれば是非活用したいですのでもしあれば教えていただけませんか?
209nobodyさん:2006/10/03(火) 00:37:08 ID:???
>>208
スレ違いなのでどちらかへ ∩( ´∀`)∩ドウゾ (っ´∀`)っ))ヨロシク

【CGI】こんなCGI探してますver.21
http://pc8.2ch.net/test/read.cgi/hp/1154177468/

ご希望のCGIを作成いたします
http://pc8.2ch.net/test/read.cgi/php/1145308869/
210nobodyさん:2006/10/04(水) 12:12:04 ID:zNjB8ynb
どうにもうまく行かないバグが発生しており、自分では原因が分からないところまで来てしまったので質問させて下さい。
自分のはてなブックマークからRSSを取得して、ブックマークしているURLを抽出→そのURL(合計30件)をブックマークしている全てのユーザーを抽出→上位を表示というスクリプトを組んだのですが特定のURLからユーザー情報を抽出出来ないバグが発生しています。
少し長いのですが以下にコードを載せます。
211nobodyさん:2006/10/04(水) 12:13:19 ID:zNjB8ynb
#!/usr/bin/perl

use LWP::Simple;

$base = get('http://b.hatena.ne.jp/Marathon/
rss'); #ここのMarathon部分を自分のユーザーIDに変更
@splited_base = split /\n/, $base;

foreach $i (@splited_base) {
if ($i =~ m|a href="http://
b.hatena.ne.jp/entry/(.+?)"|) {
$data = get('http://
b.hatena.ne.jp/entry/rss/'.$1);
push(@splited_rss, split /
\n/, $data);
}
}
#続く
212nobodyさん:2006/10/04(水) 12:14:47 ID:zNjB8ynb
#続き
foreach $i (@splited_rss) {
if ($i =~ m|<title>([a-zA-Z0-9].*[a-zA-
Z0-9])</title>|) {
push (@fav_user_list, $1);
}
}

foreach $i (sort { $a cmp $b } @fav_user_list) {
if ($i eq $prev) {
$per++;
} else {
push (@sorted_favlist,
($per*3.33)."%\t$prev");
$prev = $i;
$per = 1;
}
}

push (@sorted_favlist, ($per*3.33)."%\t$prev");

foreach $i (sort { $b <=> $a } @sorted_favlist) {
print "$i\n";
if ($j == 10) {
last;
} else {
$j++;
}
}
exit;
213210-212:2006/10/04(水) 12:20:38 ID:t51HyLJW
何故か>>211-212に挙げたスクリプトでは

http://b.hatena.ne.jp/entry/rss/http://capsctrl.que.jp/kdmsnr/wiki/bliki/?cmd=view&p=UmlAsSketch&key=%A5%B9%A5%B1%A5%C3%A5%C1

に含まれている、<title>ユーザーID</title>の情報が抽出出来ないのです。

上のURLは自分のブックマークのRSSか正常に抽出されたもので、個別にget()してから<title>ユーザーID</title>の抽出を行うと問題なくユーザーIDの抽出が行えます。

現状、個別に抽出出来る状態にも関わらず、それをループさせると問題が出るという状況に陥っています。

原因がお分かりになる方、ご助言頂ければ幸いです。
214nobodyさん:2006/10/04(水) 12:56:10 ID:???
>個別に抽出出来る状態にも関わらず、それをループさせると問題が出る

じゃあループに問題があるのでは?
読んでないけどww
215nobodyさん:2006/10/04(水) 13:59:04 ID:???
これだけ長いといちいち追いかける気もしないので、途中結果を確認して
おかしい所を特定してから示してくれ。
216nobodyさん:2006/10/04(水) 16:14:40 ID:mTQmplV+
>>214-215
恐らく↓のルーチンでget出来ていないか
foreach $i (@splited_base) {
if ($i =~ m|a href="http://
b.hatena.ne.jp/entry/(.+?)"|) {
$data = get('http://
b.hatena.ne.jp/entry/rss/'.$1);
push(@splited_rss, split /
\n/, $data);
}
}

↓のルーチンで抽出が出来ていないか
foreach $i (@splited_rss) {
if ($i =~ m|<title>([a-zA-Z0-9].*[a-zA-
Z0-9])</title>|) {
push (@fav_user_list, $1);
}
}
のどちらかが問題だと考えています
217nobodyさん:2006/10/04(水) 16:18:48 ID:???
ただ、上のルーチンで応答コードを返させると全て200が返ってくるので連続取得で弾かれてる線は薄いんじゃないかんと自分では考えています。

下のルーチンは問題の有るURLを個別にgetしてから入れると問題なくユーザーIDを抽出してきます。

そうすると、上のルーチンも下のルーチンも正常に動作していることになり、原因が存在しないことになってしまっているのが現状です

長いコードを貼り付けて申し訳ありませんでした。
218nobodyさん:2006/10/04(水) 16:51:57 ID:???
だからお前がどう勝手に思い込んでるかはどうでもよくて、、変数の値が期待してる通りになってるか
ちゃんと表示させて追いかけろと....
219nobodyさん:2006/10/04(水) 18:01:45 ID:8AfjfVrQ
>>218
試してみます
ありがとうございました
220nobodyさん:2006/10/04(水) 18:53:53 ID:XYwup9WL
素人:perlってどうやってデバッグやんの

プロ:間接的には可能ですが厳密なデバッグはできません。仕様外です。w
221nobodyさん:2006/10/04(水) 20:30:23 ID:???
わざわざスクレイピングせずに XML::RSS とかCPANモジュール使えば?

#!/usr/bin/perl
use LWP::Simple;
use XML::RSS;

my $hatena_id = "Marathon";

my $rss = new XML::RSS;
$rss->parse( get("http://b.hatena.ne.jp/$hatena_id/rss") );
my $items = $rss->{items};

my %count;
for my $item (@$items) {
  my $item_rss = new XML::RSS;
  $item_rss->parse( get("http://b.hatena.ne.jp/entry/rss/$item->{link}") );
  $count{ $_->{title} }++ for (@{ $item_rss->{items} });
}

my @ranking = sort { $count{$b} <=> $count{$a} } keys %count;
for my $user (splice @ranking, 0, 10) {
  my $per = $count{$user} / @$items * 100;
  printf "%.2f%%\t%s\n", $per, $user;
}
222178:2006/10/04(水) 20:49:29 ID:???
正規表現で変数を使う際に、その変数の中に長音記号が入っている場合
についてお聞きします。
作っているCGIの内容というのは
入力画面→確認画面→登録完了画面という流れになっています。

入力画面ではラジオボタンで参加したいセミナーを選択します。
<INPUT type="radio" name="xxx" value="セミナー1">
<INPUT type="radio" name="xxx" value="セミナー2">
というようになっています。

そして確認画面に<!--xxx-->と記述しておき
valueの値と置換して選択したセミナーを表示するという処理を
行いたいのです。

CGIに下の記述をしています。

$seminar1 = "セミナー1";
$seminar2 = "セミナー2";

$seminar1 = quotemeta($seminar1);
$seminar2 = quotemeta($seminar2);

quotemetaを行っているので
value="\セ\ソ~\ナ\―[\2"
というふうになってしまい、

確認画面に「セミナー2」と表示できずに
「\セ\ソ~\ナ\―[\2」と表示されてしまいます。

何かいい方法ありませんでしょうか?

わかりづらかったらすみません。
223nobodyさん:2006/10/04(水) 20:56:06 ID:???
>>222
/\Q$seminar1\E/ とすれば quotemeta は必要ない

生で表示すると、パラメータとして xxx=<script>alert("Hello")</script> を渡したりしても大丈夫?
てか、テンプレートエンジン使おうよ...
224178:2006/10/04(水) 21:02:53 ID:???
>>223
アドバイスありがとうございます。
テンプレートエンジンて初めて聞きました。。
勉強してみます。
ありがとうございました。
225nobodyさん:2006/10/04(水) 21:30:47 ID:???
>>221 だとURL中の # がエスケープされなくてだめだね 直したら 100% になった

my %count;
for my $item (@$items) {
  my $item_rss = new XML::RSS;
  (my $item_link = $item->{link}) =~ s|([^\w:/.])| '%' . unpack('H2', $1) |eg;
  $item_rss->parse( get("http://b.hatena.ne.jp/entry/rss/$item_link") );
  $count{ $_->{title} }++ for (@{ $item_rss->{items} });
}
226nobodyさん:2006/10/04(水) 23:15:47 ID:1QuMr0io
>>221,225
助言有り難うございます!
&、#絡みの問題であることが把握出来ました
モジュールをLWPしか使用していないのは、公開を前提に組んでいたので少しでも動作を軽くしようと考えて正規表現をしようしてのが理由です。
XML::RSSを使用すると処理が重くなっていたので・・・
227nobodyさん:2006/10/05(木) 04:08:05 ID:???
(`-´).。oO(そういえば<title lang="ja">ってゆータグではまったことあったっけ…)
228nobodyさん:2006/10/05(木) 04:28:28 ID:???
>>226
XML::LibXMLでXPath試してみれば?
229nobodyさん:2006/10/05(木) 05:21:07 ID:2/YXra1Q
初めまして 質問させていただきます


$contentの中に相当な長さの文字列が入っていたとします。
この中に


http://〜(なんでも)〜.jpgや
http://〜(なんでも)〜.gifや
http://〜(なんでも)〜.pngや
ttp://〜(なんでも)〜.jpgや
ttp://〜(なんでも)〜.gifや
ttp://〜(なんでも)〜.pngや
http://pita.stで始まるアドレスや
http://imepita.jpで始まるアドレスや
http://pic.toで始まるアドレス


のアドレス部分だけを引き抜いて$OUTPUTに入れていって

http://〜(なんでも)〜.jpg
http://〜(なんでも)〜.gif
http://〜(なんでも)〜.png


といった具合に各行ごとに出力するにはどうコードを書けばいいですか?
230229:2006/10/05(木) 06:14:01 ID:???
VIPからきますた
231nobodyさん:2006/10/05(木) 06:20:48 ID:???
それくらいググればいくらでも出てくる
232nobodyさん:2006/10/05(木) 11:24:12 ID:???
print "http://$1\n" while $content =~ m[h?ttp://([[:ascii:]]+?\.(jpg|gif|png))]g;
233nobodyさん:2006/10/05(木) 11:44:39 ID:???
>>229
おまえmixiで同じ質問しただろ^^;
234nobodyさん:2006/10/05(木) 14:27:16 ID:ei8slwkX
質問させて頂きます、
$CGI->radio_group(-name=>'radiotest',-values=>['val1','val2','val3','val4'])
をヒアドキュメント内に直接(的に)展開したくて

#!/usr/local/bin/perl
use CGI;
print "Content-Type: text/html;\n\n";
$CGI=new CGI;
print $CGI->radio_group(-name=>'radiotest',-values=>['val1','val2','val3','val4']).'<hr>';
print $CGI->popup_menu(-name=>'poptest',-values=>['val1','val2','val3','val4']).'<hr>';
print <<"EOF";
$CGI->radio_group(-name=>'radiotest',-values=>['val1','val2','val3','val4'])<hr>
${\$CGI->radio_group(-name=>'radiotest',-values=>['val1','val2','val3','val4'])}<hr>
$CGI->popup_menu(-name=>'poptest',-values=>['val1','val2','val3','val4'])<hr>
${\$CGI->popup_menu(-name=>'poptest',-values=>['val1','val2','val3','val4'])}<hr>
EOF

な感じでやってみたところ
${\$CGI->radio_group(-name=>'radiotest',-values=>['val1','val2','val3','val4'])}
の部分がうまく展開されません。
この理由、または別の解法をご存知の方はぜひ回答をお願いします。
235nobodyさん:2006/10/05(木) 15:47:13 ID:???
>>234
<q cite="http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod">
radio_group()により返される値は実際にはボタン要素の配列です。
</q>

@{[ $CGI->radio_group(...) ]}
236234:2006/10/05(木) 17:10:48 ID:ei8slwkX
>>235
あ、しまった、コンテキスト・・・
ありがとうございました!
237nobodyさん:2006/10/06(金) 10:59:57 ID:tVeHJJaR
$dataの中に

dwdewdjewd
dewewd
dwedrgv
wdcsdc

といった具合に文字列がたくさん入ってて
一番最後の下の行だけ削除したいときは
どうすればいいですか
238nobodyさん:2006/10/06(金) 11:13:57 ID:???

$data=~ s/.+$//;
239238:2006/10/06(金) 11:16:22 ID:???
chomp($data);
$data=~ s/.+\z//;
240nobodyさん:2006/10/06(金) 11:26:07 ID:tVeHJJaR
>>238>>239
ありがとう
どっちがいいの?結果はどっちも同じ?
241238:2006/10/06(金) 11:47:58 ID:???
$data=~ s/.+\n?\z//;
これがいいかもね
242nobodyさん:2006/10/06(金) 12:02:34 ID:tVeHJJaR
>>241
どうしてですか?上の2つとどう違うの?
243nobodyさん:2006/10/06(金) 12:53:58 ID:???
>242
なんでそれぐらい自分で調べないんだ?
244nobodyさん:2006/10/06(金) 19:14:14 ID:PWke1HN3
どなたか、お願いします。
下のようなフレームを使ったページでA,B,Cそれぞれに
A-abcd.cgi
B-bcde.cgi
C-cdef.cgi
が動いてます。Bのフォームから送信ボタンを押したときに、Cのcgiにデータを送ろうと
色々と検索し、試したのですがうまくいきません。
  ┌───────┐ Bにはラジオボタン数個あり、送信が押されると
  │A            │ 選択された値をCで受け取り処理するようにした
  ├──┬────┤ いのです。最初はactionでCのcdef.cgiを指定したら
  │B  │C       │ Bの枠にcdef.cgiが展開されてww(当たり前でした)
  │    │        │
  └──┴────┘ お願いします。
245nobodyさん:2006/10/06(金) 19:54:33 ID:???
>>244
フレームやめろ
246nobodyさん:2006/10/06(金) 19:55:49 ID:???
試してないけど、targetでCのフレームを指定してあげれば良いんじゃね?
247nobodyさん:2006/10/06(金) 20:26:54 ID:???
perl関係ないじゃん
他所行けよ
248nobodyさん:2006/10/06(金) 20:39:09 ID:???
フレームが廃止の方向とあったのでやめることにした。
>>247
お前には聞いてないww
249nobodyさん:2006/10/06(金) 20:48:17 ID:???
これはHTMLの話なので確かにここでは板違い。

<form action="cdef.cgi" method="post/get" target="C">
(略)
</form>

で正解だとして、今後はWeb制作板の方に行きなさい。
250nobodyさん:2006/10/06(金) 21:08:45 ID:???
もうこねーよwwwwwwww
251nobodyさん:2006/10/06(金) 23:44:30 ID:1oLHpAqB
スレ違いだったらすみません
CGIで画像を表示させてるんですが、CGI設置してるサーバーとは別のサーバーに
アップロードしている画像を表示させようとしたらPCとVodafoneのみ画像が
表示されなくて・・・なぜでしょうか?

for($i = 1; $i < 画像枚数; $i++){
print "<img src=http://〜/$i.jpg>";
}

こんな感じで連番画像を表示させてます
252nobodyさん:2006/10/07(土) 00:44:13 ID:???
表示できる環境があるというのであれば
タグの書き方やファイルのパスに問題はなさそうだが…

その中の適当な一枚だけを表示するHTMLを吐くようなCGIを試しに設置してみそ。
こんなやつ。

print "Content-type: text/html\n\n";
print "<html><body>\n";
print "<img src=\"http://画像のパス.jpg\">\n";
print "</body></html>\n";
exit;
253nobodyさん:2006/10/07(土) 08:20:28 ID:582rzz9a
すみません、教えてください。

キーワード検索式でパターンマッチをperlにて組んでいます。
入力ボックスからしかインプットは受け付けないのですが

PERLソースの中身が見れた!、ソースきたねぇwww
って言う人がいます。
これってホラなんですか?それともPERLのソースの中身を見ることって
可能なんですか???
初心者過ぎて、ごめんなさい。
254nobodyさん:2006/10/07(土) 08:25:25 ID:???
>>253
if your code has weak point, that's possible.
255nobodyさん:2006/10/07(土) 08:26:01 ID:582rzz9a
>>254
ほんとに!??!?
具体的にいうと、入力された変数の部分にコマンド打たれるんですか?
256nobodyさん:2006/10/07(土) 08:34:03 ID:???
>>255
yes.

> キーワード検索式でパターンマッチをperlにて組んで

this can be a weak point.
use quotemeta function.
257nobodyさん:2006/10/07(土) 08:39:53 ID:582rzz9a
簡単に言えば読み込んでいる INPUTに関しては
すべて処理を施さないといけないってことですか?

他にもFORMからのINPUTで入れてるのがあるんですが

キーワード検索のみ

$in{'keyword'} =~ s/,/、/g;
$in{'keyword'} =~ s/</</g;
$in{'keyword'} =~ s/>/>/g;
$in{'keyword'} =~ s/\r\n/<br>/g; # Windows系(\r\n)
$in{'keyword'} =~ s/\r/<br>/g; # Mac系(\r)
$in{'keyword'} =~ s/\n/<br>/g;
$in{'keyword'} =~ s/\n/<br>/g;
$in{'keyword'} =~ s/&/&/g;
$in{'keyword'} =~ s/\|//g;

ってしてます
258nobodyさん:2006/10/07(土) 08:57:59 ID:???
キーワード検索以外にも入力あるんならそっちが悪いかもしれないしね。
きちんと注意して書けばそうめったにやられるものではないが。
259nobodyさん:2006/10/07(土) 08:59:20 ID:???
quotemeta しないとまずハックされると思うねえ
260nobodyさん:2006/10/07(土) 09:11:29 ID:???
ただのマッチならuse re 'eval'してなけりゃ大丈夫だろ。
問題は他のところにありそうな気がする
261nobodyさん:2006/10/07(土) 09:13:52 ID:???
鯖が不安定で、PerlがCGIとして扱われずソースが流れるとか。
262nobodyさん:2006/10/07(土) 09:15:02 ID:582rzz9a
みなさん、親身に相談にのってくれて、ありがとう T_T


もう既にハックされたかも。。。
なんかソースを見たって言われてるんです。

とりあえず>>257の keywordは検索入力ボックスからの受付ですが
その他にいろんな変数をクリックで選ばせて読み込ませています。

ちなみにGETでFORMデータは取得しています。


>>257の表記を全ての変数にかませば大丈夫ですか?
もしかしたらURLで

cgi?size=○○○ ←のような部分にコマンド打たれたのかも・・・
263nobodyさん:2006/10/07(土) 10:09:38 ID:???
ソース見れるってのは、どっちかっていうとサーバーの設定の問題じゃないの?
CGIが実行されずにテキストとして送られてるわけなんだから。

他には、パラメータでファイル名を受け取って、その内容を加工して表示したりするCGIに
好きなファイル名を渡せちゃう、みたいな脆弱性も考えられる。
264nobodyさん:2006/10/07(土) 10:48:31 ID:???
>>252
そのやり方だと表示されました・・・
265nobodyさん:2006/10/07(土) 10:50:01 ID:???
>>252
あっ
一回目は表示されましたがリロードしたら表示されなくなりました
266nobodyさん:2006/10/07(土) 10:58:54 ID:582rzz9a
>>263
ちがうんです。CGIは問題なく動いてますし
エラーが出たことも、いまのところまだないです。

またエラーがでたとしても、この鯖はエラーが表示されないで
他のエラーページに転送されるようになっていますよ。


>他には、パラメータでファイル名を受け取って、その内容を加工して表示したりするCGIに
>好きなファイル名を渡せちゃう、みたいな脆弱性も考えられる。
そんなことできるんですか?パラメーターには>>257みたいな
クォートメタは使わないで受信しています
267nobodyさん:2006/10/07(土) 12:00:38 ID:???
>>266
>>257 のコードによって安全性が得られると考えているなら、それは間違いです。
Perl の組込関数 quotemeta()、文字列に対する \Q エスケープ、そして CGI における外部データの安全な取扱、及び関連するモジュールについて調べましょう。

CGI で運用されるコードは一般にあらゆる (都合の悪い) 入力に備えておく必要があります。
なぜならそれは、そこにアクセスできる全ての人によって実行可能なプログラムだからです (あなたはそのようにパーミッションを設定したはずです。忘れたとは言わせませんよ?)。
268nobodyさん:2006/10/07(土) 12:15:43 ID:???
>>266
mixiだってCGIが実行されずにソースが表示されちゃったからねぇ〜
269nobodyさん:2006/10/07(土) 12:18:01 ID:???
昔々だと
http://〜〜.cgi/
のように最後にスラッシュを入れたらソースが表示されたアホな鯖があったねぇ〜
270nobodyさん:2006/10/07(土) 12:25:11 ID:582rzz9a
quotemeta調べてるのですが難しいですね。
要するにquotemetaをしないと、入力されたパラメーターとかキーワードは
取り入れちゃいけないのですね
271nobodyさん:2006/10/07(土) 12:31:33 ID:???
PerlのCGIは最低限汚染チェック(-t とか -T とか)を有効にしたほうが...

#!/usr/local/bin/perl -T
272nobodyさん:2006/10/07(土) 12:34:38 ID:???
>>271
そんなの初めて知った
どういう効果があるんですか?
273nobodyさん:2006/10/07(土) 12:47:57 ID:???
>>272
人に尋ねる前に調べる癖をつけましょうよ。
「Perl 汚染チェック」で検索すれば、解説しているページが山ほどでてきます。

簡単に言えば、外部からの入力が「汚染されているもの」という前提で
そのまま表示されていたり、正規表現に埋め込まれていたりしないか
チェックしてくれるオプションです。
(もちろん、機械的なチェックなので、頼りすぎるのは危険です)
274nobodyさん:2006/10/07(土) 12:51:19 ID:???
いくら汚染チェックしてもめんどくさいから/(.*)/なんてやって
汚染はずしてたら意味ないけど、まじめに使えばうっかりミスは
かなり防げる。オススメ。
275nobodyさん:2006/10/07(土) 13:52:56 ID:???
mixiはPerlだがCGIではない
276nobodyさん:2006/10/07(土) 14:12:12 ID:???
何言ってんだこいつ(´・ω・) ・・・>>275
277nobodyさん:2006/10/07(土) 14:17:31 ID:582rzz9a
はじめまして


目的のURL $url を使って
URL先の拡張子を取得する方法ってありますか?

また拡張子はrarとかになってても、実際クリックするとphpページ経由して
ダウンロードしろとかありますが、それにも対応できるのでしょうか?
278nobodyさん:2006/10/07(土) 14:22:31 ID:???
>>268
どうやったらそんなことできるん?
279nobodyさん:2006/10/07(土) 14:24:33 ID:???
>>276
mod_perlも知らんのか
>>277
>URL先の拡張子
意味がわからん
>対応できるのでしょうか
できます
280nobodyさん:2006/10/07(土) 14:24:33 ID:???
>>277
日本語でおk
281nobodyさん:2006/10/07(土) 14:26:30 ID:???
>>279
ちげえ。
そんなこと聞いてないのに知った風な口ぶりで
「mixiはPerlだがCGIではない (キリ+)」
とか得意げに言ってるから逆に恥ずかしいんだよw
282nobodyさん:2006/10/07(土) 14:27:15 ID:???
>>253
>PERLソースの中身が見れた!、ソースきたねぇwww
ライブラリ覗けちゃった みたいなノリなキガス
283277:2006/10/07(土) 14:27:58 ID:582rzz9a
すみません

意味としては

例えば http://www.uploarder.com/image9863.jpg

のjpg画像が存在しているかどうかを確認したいのです。
サーバーによっては
もし消えてたらerror.phpとかに飛ばされるので拡張子でjpgかどうか判定しようかと思ってます
284nobodyさん:2006/10/07(土) 14:32:19 ID:582rzz9a
>.282
ライブライリって私がつかってるlibrary.plですか?
285nobodyさん:2006/10/07(土) 14:37:40 ID:???
-tとか-TってSTDINを読み取ったら、速攻でs/</</gとかかけちゃう奴らには無意味じゃね?
286nobodyさん:2006/10/07(土) 14:52:36 ID:???
>>283
LWPでHEAD取得したらどうかな? それでも飛ばされるんだろか
287nobodyさん:2006/10/07(土) 14:53:56 ID:???
>>285
見事に判りやすいw
まさかそのライブラリが覗けちゃう訳じゃないでしょ?
自作じゃなかったり、見られても問題なければって話は置いとく。

汚染チェックもやってないようだから穴だらけ
全ての入力はチェックしとけ
とりあえず今すぐコードに修正加えるべき
288nobodyさん:2006/10/07(土) 14:54:45 ID:???
あ、HEADから Content-Type 取得して image/jpeg かどうか判断するってことね >>286 の件
289nobodyさん:2006/10/07(土) 15:04:21 ID:???
>cgi?size=○○○ ←のような部分にコマンド打たれたのかも・・・
で打たれて困るようなコード書いてるのか?
セキュリティに関する書籍一冊買って一から出直せ
290nobodyさん:2006/10/07(土) 15:09:33 ID:???
s/</&lt;/g
291nobodyさん:2006/10/07(土) 15:16:00 ID:???
>>265
そろそろ相手側のサーバに何かあるんじゃないのかと思うが…外部からの直接参照拒否を半端に実行してるとか。
まあ以下のスクリプトで画像が表示される時とされない時の違いを探してみそ。

print "Content-type: text/html\n\n";
print "<html><body>\n";
print "<img src=\"http://画像のパス.jpg\">\n";
print "<hr />\n";
print "<table border=\"1\">\n";
foreach $key (sort(keys(%ENV))) {
print "<tr><td>$key</td><td>$ENV{$key}</td></tr>\n";
}
print "</table>\n";
print "</body></html>\n";
exit;
292nobodyさん:2006/10/07(土) 15:37:41 ID:582rzz9a
>>286
どうなるんでしょうね。rarのヘッダがとれるんでしょうか


>>287
修正したいんだけど、どこをどうすればいいのか分かりません。
とりあえず外部から読み込むのは

パラメーターが $in{'size'}と$in{'refreshtime'}で

キーワードが $int{'keyword'}です
293nobodyさん:2006/10/07(土) 16:29:00 ID:???
>>292
とりあえず quotemeta はしなくちゃだめだね。
>>257 のエスケープ処理だと、例えば (??{ code }) を埋め込まれると実行しちゃうよね?
もちろん他の入力値も全部チェックしないと。

正直 CGI プログラム組むなら最低限のセキュリティは勉強したほうがいいよ。
CGI 入門の本が多いから、とっつきやすそうなイメージがあるけど、下手をすると
自分だけじゃなく、周り(サーバーの管理者、サーバーの他の利用者、サイト利用者)に迷惑をかける。

あと、質問を連投しているように見られるのが嫌だからって「はじめまして」はどうかと思う。
294nobodyさん:2006/10/07(土) 16:39:31 ID:???
>>291
リモートポートとか以外は違いがありませんでした
ちなみにCGI設置はロリピンク、画像をロリポップとFC2に置いて試してみたんですが
どっちも見れなかったんで参照拒否とかではないみたいです
あと画像が最初だけ見れたのはその前に画像URLに直接接続していて
キャッシュが残ってた?からみたいです
295nobodyさん:2006/10/07(土) 16:47:22 ID:???
perl の問題じゃないでしょそれ。
perl の問題は吐いたHTMLソースがヘンになるかどうかでしょ。それ見てヘンじゃなけりゃ他の問題。
296nobodyさん:2006/10/07(土) 16:54:37 ID:???
ロリポって直接呼び出すと403になるんじゃなかったっけ?
>どっちも見れなかったんで参照拒否とかではないみたいです
どっちも参照拒否っていう可能性は考えてないの?
297nobodyさん:2006/10/07(土) 17:07:48 ID:???
>>295
じゃぁやっぱりサーバーのほうに問題があるんですかね・・・

>>296
>どっちも参照拒否っていう可能性は考えてないの?
自分ではそういった設定?はしていなかったのでそう思いました
あと普通にHTMLにimgタグで呼び出したら見れましたので
そう思ったんですが・・・やはり何かしら設定されてるんですかね?
298nobodyさん:2006/10/07(土) 17:16:49 ID:???
ソース見ておかしなところがないのなら、このスレで言うことはもうないね。
そのperlが吐いたソースを丸々コピーして、HTMLに貼り付けてアップして、それ見たら見れたわけなんでしょ?

簡単なのだったら答えるかもだけど、そんなサーバの設定や挙動なんて調べなきゃわかるわけないし。
299nobodyさん:2006/10/07(土) 17:21:22 ID:???
> > どっちも見れなかったんで参照拒否とかではないみたいです
> どっちも参照拒否っていう可能性は考えてないの?

いやまて、そのロリピンクとやらが出力HTML中に外部サーバのファイルへの直接参照を検知すると
強制的にタグを書き換えて参照ブロックするようになっている可能性もあr(ry


まあ外のサーバにあるリソースを直接覗きに行くってのは
決してお行儀がよろしいとは言えんわね。
300nobodyさん:2006/10/07(土) 18:29:50 ID:???
Perlで、いわゆる注文フォームというものを作っています。
注文フォーム→確認画面→OKだったら(ボタン)→注文完了画面(データをログに保存)
という流れになるようにしたいのですが、確認画面から注文完了画面を表示するCGIへ入力されたデータを渡す方法がわかりません。
hiddenフィールドを使用しようかと思ったのですが、セキュリティの面でやや不安なので他の方法を探しています。
どうしたらできるのでしょうか。
301nobodyさん:2006/10/07(土) 21:29:33 ID:???
注文フォーム→確認画面 の所はどうしてるの?
302nobodyさん:2006/10/07(土) 21:52:15 ID:???
>>301
<form action=get.cgi target=_blank method=post>
・・・・としてフォームに入力された情報を確認画面を表示させるCGIに送っています。
303nobodyさん:2006/10/07(土) 21:59:18 ID:???
俺ならhiddenじゃない方がむしろ不安だ…
304nobodyさん:2006/10/07(土) 22:11:28 ID:???
こういう処で作り方質問するような奴が作ったショッピングカートを
使うことになるユーザの行く末が不安だ。
305nobodyさん:2006/10/07(土) 22:23:54 ID:???
>>302
そこはセキュリティーの不安は、ないの??
hiddenフィールどで送るのとの差はないんだけど。
306300:2006/10/07(土) 22:28:14 ID:???
このやり方自体に問題があったとは・・・。
教えてくれてありがとうございました。うっかり危険なミスをしてしまうところでした。

いったいどうしたらよいのでしょうか・・・。
307nobodyさん:2006/10/07(土) 22:45:49 ID:???
ここで簡単に説明できるようなことじゃないしまじめに勉強してわかるようになるか、
既にわかっている人に作ってもらうかどっちかじゃないか。
308300:2006/10/07(土) 23:04:15 ID:???
そのようなフリーのCGIを探してみますね・・。勉強はゆっくりと。
ありがとうございました。
309nobodyさん:2006/10/07(土) 23:35:19 ID:???
いや・・ショッピングカートつーか普通に注文→確認→完了の3段階だけなんでしょ?
hiddenでやって確認用にメール送信でもしておけばそれで良いと思うんだけど…。
310nobodyさん:2006/10/07(土) 23:43:40 ID:???
それじゃ、別のサイトからいたずらが出来そうですね
311300:2006/10/07(土) 23:49:32 ID:???
よさそうなCGIを見つけましたがやっぱり自分で作りたい・・・。
仕組みを知らないで使うのはちょっと・・・。
どこのサイトで紹介されてるのもform actionでinput type = text やらばっかりで・・・。
hiddenもダメらしいしなあ・・・。
312nobodyさん:2006/10/07(土) 23:58:32 ID:???
既存の公開されたものの方が、安定していて動作保障も付いていることを忘れるな
313nobodyさん:2006/10/08(日) 00:02:25 ID:???
>>310
いたずらって、具体的にはどのような?
314nobodyさん:2006/10/08(日) 00:03:20 ID:???
そもそもhiddenでダメってどこからの情報なんだ?
315300:2006/10/08(日) 00:06:51 ID:???
316nobodyさん:2006/10/08(日) 00:11:38 ID:???
そもそも、注文フォーム→確認画面までしか進めてない段階では注文とかは何もしてないんだろ?
リクエストを変なのに書き換えられても注文完了画面を出すCGIで変なリクエスト弾けばいいだけだじゃないのか?
317300:2006/10/08(日) 00:13:14 ID:???
>>316
その手があったか!
318nobodyさん:2006/10/08(日) 00:17:01 ID:???
あるサイトの特定部分の文字列を取得して、自サイトにHTMLで整形・出力する場合
相手サーバに負荷ってどのくらいかかるものですか?
319nobodyさん:2006/10/08(日) 00:20:26 ID:???
>>318
特定部分の文字列ってのがよくわからないけどHTMLだとすると
画像とか取得しない分ブラウザでアクセスするより負荷は小さい

複数回同じページを取得するような場合はキャッシュを使うことでさらに負荷が小さくなる
320nobodyさん:2006/10/08(日) 00:22:55 ID:???
/tmp/hoge/foo/bar.txtやC:\temp\a\bar.txtのような文字列から、ディレクトリが存在していなければ生成し、bar.txtを生成するようなモジュールはありますか?
321nobodyさん:2006/10/08(日) 00:23:46 ID:???
>>315
2個目で吹いた。
hiddenが『何故』危険と言われているのかをちゃんと理解しようね。

>>318
相手サイトの特定部分とやらを含む全てのファイルを
普通のブラウザで読み込みに行くくらいかかると思いねえ。
322319:2006/10/08(日) 00:24:42 ID:???
書き忘れた

特定部分の文字列ってのの開始位置がわかっているなら
レジューム(対応してない鯖もあるし対応しててもCGIとかだと無理)を使うとさらに負荷を小さくできる(かもしれない)
323318:2006/10/08(日) 00:25:33 ID:???
ありがとうございました。
324nobodyさん:2006/10/08(日) 00:26:41 ID:???
>>320
モジュールは知らんが簡単に書けると思うぞ。

if (ディレクトリ無い) {
ディレクトリつくーる;
bar.txtつくーる;
}

要はこれだけでしょ?
325318:2006/10/08(日) 00:27:27 ID:???
会社の上司がWikipediaの説明部分をPerlかなにかで取得して
2000以上もの用語集サイトを作って、それのデザインを頼まれまして。

2000以上のページにアクセスしたからこそ用語集が作れるわけで
そんときの負荷ってどんなもんだったのかなあ・・・と思い、質問しましたです。
326nobodyさん:2006/10/08(日) 00:38:49 ID:???
hiddenとCookieはどっちの方が糞ですか?
自分の手にかかればどっちも糞のような気がしますが、どうなんでしょ?
327300:2006/10/08(日) 00:41:15 ID:???
>>321
値段が改ざんされるから危険なのか。ただのフォームなら変な文字列にすることぐらいしか出来ないか。
個人情報を扱うから漏洩させてしまいそうで怖くて。
328nobodyさん:2006/10/08(日) 00:48:40 ID:???
>>325
そういう場合は一度にどれだけ連続的なアクセスをしたかが問題になる。
2000項目全てを一気に全部取りに行ったりしたら流石にどうかと思うけど、
数ヶ月かけて順番に2000ページにアクセスしたんじゃ負荷は全く些細なものだろう。

ところでその上司にはライセンスまわりは大丈夫なのかと聞いておいた方がいいw
329nobodyさん:2006/10/08(日) 00:52:55 ID:???
GFDLって結構ややこしいんだよなー
330nobodyさん:2006/10/08(日) 00:58:03 ID:???
>>327
相当テンパってるなあ…。話に出ている入力→確認→完了の流れで、
確認画面のhiddenの値をどう書き換えれば他人の個人情報を漏洩できるのかちょっと考えてみ?
331nobodyさん:2006/10/08(日) 01:21:27 ID:???
>>327
値段なんて鯖側に保存されているものだから外部からフォームで入力する意味が全くない
332nobodyさん:2006/10/08(日) 02:00:32 ID:???
>320
ttp://search.cpan.org/~dionalm/File-Recurse/

# CPANでFileとRecurse(再帰)で検索。
# ファイル生成は手動かな。これは再帰的にディレクトリを掘るだけみたい。
333nobodyさん:2006/10/08(日) 02:01:41 ID:???
httpとかの仕組みを理解してないからhiddenが危険とかいうところだけ拾って読んで
それが自分の場合にあてはまるかどうか判断もつかないんだろうな。Perl以前の
問題な気がする
334nobodyさん:2006/10/08(日) 03:11:24 ID:???
「hidden が危険」 ということでなく、単に 「hiddenが安全だと思ってると危険」 ってことなんじゃないかと思うんだがなあ。
hidden の安全性はページにtextなりで公開されてるのと同じだと思え、というだけでしょ。
そのときだけ本人に公開して困るもんじゃなけりゃいいと思うが。

つまり CGI で (クッキーから読んだ) パスワードなんかを method=get 内での hidden に入れるととても危うい。
335nobodyさん:2006/10/08(日) 03:24:01 ID:???
hiddenは危険だからCookieにすればいいってのも危険だよね?
336nobodyさん:2006/10/08(日) 04:10:27 ID:???
hiddenだろうとcookieだろうとなんでもいいけど
CSRF対策はちゃんとやっとけよ
337nobodyさん:2006/10/08(日) 05:05:23 ID:o6JUYv0D
すみません。MySQL内のあるカラムにutf-8で保存されていて、
16進数になっているデータをPerl を使って日本語にデコードし直すのはどうしたらいいでしょうか?
データの内容は「今日は晴れてるよ。」と入っていて、
16進数で
0xc3a4c2bbc5a0c3a6e28094c2a5c3a3c281c2afc3a6e284a2c2b4c3a3e2809ac592c3a3c281c2a6c3a3e2809ae280b9c3a3e2809acb86c3a3e282ace2809a
となっています。
データの内容が日本語でなければ、以下のようにやれば、見れる事がわかったのですが、
(例えば、16進数 0x54455354 で TESTと表示される)
#!/usr/bin/perl

$char = pack("H*",$ARGV[0]);

print "$char\n";

> ./test.pl 0x54455354
TEST

案の定日本語だと表示が上手くできません。jcode.pl でも使って、
#!/usr/bin/perl

require "jcode.pl";

$char = pack("H*",$ARGV[0]);

jcode::convert(\$char,'euc');

print "$char\n";

と記述すればいいのかと思ったのですが、できませんでした。
誰かご教授頂けないでしょうか?よろしくお願い致します。
338nobodyさん:2006/10/08(日) 05:27:53 ID:???
>>337
ちょっとまて、「今日は晴れてるよ。」がそんなに長くなるわけない。
その16進数をデコードしても、どの文字コードにも該当しないけど、本当にあってる?
339nobodyさん:2006/10/08(日) 05:30:11 ID:???
utf8 で c3a4 とかなわけないなあw
340300:2006/10/08(日) 09:50:04 ID:???
お騒がせいたしました。確かにフォームから入力する場合では、本人以外に見られないので
大丈夫ですね。もっと勉強しつつ作ることにします。ありがとうございました。
341nobodyさん:2006/10/08(日) 10:00:52 ID:???
わかったのかわかってないのかわからないけどまあいいかw がんばれw
342nobodyさん:2006/10/08(日) 10:19:55 ID:???
以下のソースはJavaですが、これをPerlで書くにはどうすればよいのでしょうか?
byte[] b = new byte[32];
b[0] = 45;
b[1] = 123;
b[2] = 0xAB;
for (int i=0; i<b.length; i++) System.out.println(b[i]);
文字と数字の自動変換や、byte配列の表し方などで詰まっています。
343momo:2006/10/08(日) 12:34:11 ID:psSjFhxx
単純にperlの質問になるとおもうのですが、

$REC1には予め"a,b,c"があるとする。(カンマのみで区切られたデータ)
$REC2には予め"あ,い,う"があるとする。(カンマのみで区切られたデータ)

これを
下記の様に出力したいのですが、どの様に記述すればできますか?

<table>
<tr>
<td>a</td><td>あ</td>
<td>b</td><td>い</td>
<td>c</td><td>う</td>
</tr>
</table>

どうぞ教えてください。
344nobodyさん:2006/10/08(日) 14:28:24 ID:???
>>342
それが意図する動作を説明しない限り
PerlもJavaもできてなおかつ親切な人の出現を永久に待ち続ける事になるぞ。

とCを勉強中の俺が言ってみた。
345nobodyさん:2006/10/08(日) 14:41:20 ID:???
>>343

$REC1 = "a,b,c";
$REC2 = "あ,い,う";

@abc = split(/,/, $REC1);
@aiu = split(/,/, $REC2);

print "<table>\n";
print "<tr>\n";
for ($n = 0; $n < @abc; $n ++) {
print "<td>" . $abc[$n] . "</td><td>" . $aiu[$n] . "</td>\n";
}
print "</tr>\n";
print "</table>\n";

# 出力:
# <table>
# <tr>
# <td>a</td><td>あ</td>
# <td>b</td><td>い</td>
# <td>c</td><td>う</td>
# </tr>
# </table>
346nobodyさん:2006/10/08(日) 14:58:40 ID:???
>>344
たんにバイナリデータを出力してクライアント側のソフトと通信したいだけなんです。
相手がC++のintで受けるので、それにあうバイナリを吐きたいです。
Cではこんな感じです。
#include <stdio.h>
int main(void) {
 int i;
 byte b[32] = { 45, 123, 0xAB };
 for ( i = 0; i < sizeof(b) / sizeof(b[0]); i++ )
  printf("%d", b[i]);
 return 0;
}
347nobodyさん:2006/10/08(日) 16:40:09 ID:???
hiddenに単価入れ込む設計って・・・

hiddenが悪いんじゃなくて設計がわるすぎw
348nobodyさん:2006/10/08(日) 18:30:13 ID:???
>>342
my @b = ();
$b[0] = 45;
b[1] = 123;
b[2] = 0xAB;
for( my i=0; i<=$#b; i++){ print $b[i]; }
foreach my $i(0..$#b){ print $b[i]; }
こんな感じ?
349nobodyさん:2006/10/08(日) 18:31:11 ID:???
壮大な勘違いしてた
packとかunpackつかえばいいんじゃね?
350ヽ(´ー`)ノ ◆.ogCuANUcE :2006/10/08(日) 18:48:38 ID:???
PrintStream に println(byte b) なんてあったっけ?…と思って試してみた。

public class Test {
public static void main(String[] args) {
byte b = 0x20;
System.out.println(b);
}
}

# => 32

これなら >>348 でいい気が…。

byte b = 0xAB に至っては、精度が落ちている可能性があると言われて
byte にキャストしないとエラー。多分、MSB が立ってるからだと思うが。
351ヽ(´ー`)ノ ◆.ogCuANUcE :2006/10/08(日) 18:52:14 ID:???
好意的に解釈するなら元プログラムがこう。

public class Test {
public static void main(String[] args) {
byte[] b = { 45, 123, (byte)0xAB };
System.out.write(b, 0, 3);
}
}

んで、Perl で書くとこう。

my @b = (45, 123, 0xAB);
print pack('C*', @b);

もうちょっと質問の仕方、考えような。
352nobodyさん:2006/10/08(日) 18:55:26 ID:???
pack/unpackの存在をすっかり忘れていました。
なんとかできそうです。ありがとうございました。
353momo:2006/10/08(日) 21:40:47 ID:psSjFhxx
343>>
本当に感謝です。
どなたか分かりませんがありがとうございます。
大好きです!
354nobodyさん:2006/10/08(日) 21:58:21 ID:???
結婚汁!
355nobodyさん:2006/10/08(日) 23:44:17 ID:???
use warningsでなぜエラーが出るのか教えてください。
[hoge.pl]
package Hoge;
our $moge = 'a';
[test.pl]
require "hoge.pl";
my $t = $Hoge::moge;

Name "Hoge::moge" used only once : possible typo at test.pl
356nobodyさん:2006/10/09(月) 00:04:48 ID:???
こんばんわ

PERLにてパターンマッチ処理をしたいのですが「 >>レス番 」をキーワードにしてパターンマッチしたとき
うまくひっかかりません

$KEYS=">>".$resno;

if ($data =~ /$KEYS/) {
処理・・・
}

としているのですが、どうすればいいでしょうか?
357nobodyさん:2006/10/09(月) 01:57:46 ID:???
>355
$Hoge::moge が 1 回しか使われてないから、ひょっとしたら打ち間違いじゃない?という警告が出ている。
hoge.pl 内で設定して require してるなじゃいか、と思うかもしれないが、test.pl の構文解析時には require は
評価されないので、hoge.pl の中身は perl には分からない。
ということで、$Hoge::moge が 1 度だけ使われているように見える。
use を使うようにするか、BEGIN { require 'hoge.pl'; } すると、構文解析時に評価されるようになるため、警告は出なくなる。

>356
引っかけたい文字列は元のデータ内で >> になってる?
DAT ファイルや HTML なんかだと &gt;&gt; になってると思うけど。
358nobodyさん:2006/10/09(月) 02:27:59 ID:???
>>356さん

ずばり、そのとおりでした^^;
>>になってますねw

ちなみに>>356ですると
$resnoが1で

>>1」のレスをひろってきたいのですが

>>123とかもひろってきます。
どう対処すればよいのでしょうか^^;
359nobodyさん:2006/10/09(月) 04:12:59 ID:???
>>358
http://ex16.2ch.net/test/read.cgi/news4vip/1160328561/

たまたまこちらに同じ質問とその回答があるので
参考にしてみてはどうでしょうか
360nobodyさん:2006/10/09(月) 05:48:14 ID:???
>>347
最初からセキュアプログラミングをしていない hidden に価格データ入れているプログラムで、
後付けの「サニタイズ」をするにはどうすればいいのだろうか…。

・hiddenに十分な強度の共通鍵暗号で暗号化した価格データを入れる。
→任意の価格データには詐称はできないけど、他の商品の価格とすり替えが可能に。

・hiddenに 「商品ID」 やら 「セッションID」 やら 「価格データ」 やらを全部まとめて十分な強度の共通鍵暗号で暗号化したデータを入れる。
→これで完璧、ですよね?
361nobodyさん:2006/10/09(月) 06:33:15 ID:???
>>360
その 「価格データ」 がユーザーが何やっても操作できないものならそれでいいんでない?
362nobodyさん:2006/10/09(月) 06:36:57 ID:???
>>361
強度の高い暗号化を導入していればユーザが何やっても操作できるわけないよね
256bit AES とか。

363nobodyさん:2006/10/09(月) 06:39:32 ID:???
いや、ってかページにいれるのは セッションID だけでいいやんそれ。
364nobodyさん:2006/10/09(月) 06:46:10 ID:???
>>363
それだと、アクセシビリティ上の問題が発生するじゃん

例えばセッションの保有期間が1時間だったとしよう。

個人情報の入力中にご飯を食べにいって、帰ってきてから続きいれて決定押して
「セッションの有効期間がすぎました。お手数ですが最初からやり直して下さい。」
なんて言われたら腹がたつだろ?

下手したら、その店には二度といかないかもしれない。

有効期限を延ばしすぎると、サーバ負荷が高まるし、例え2日にしたとしても
決算確認画面まで来てで「やっぱ、購入するのは3日後にしよ。それまでブラウザは開いたままにするか。」という客がいるかもしれない。

P2PやIRC、ネットゲームの露天、タブブラウザの普及も関係してか、PCつけっぱなしの人、ブラウザのタブを長期間開く人も予想以上に増えている。

情報を全て暗号化した上で hidden にいれとけば、

・セッション使用に比べてサーバ負荷が少ない
・強度の暗号を使用すればセキュリティ上の問題も無い
・セッションタイムアウトでユーザがいらつくことがない

というメリットがある
365nobodyさん:2006/10/09(月) 06:48:03 ID:???
>>360
鯖側で商品と価格が一致するかのチェックを再度すれば良いだけじゃない?
366nobodyさん:2006/10/09(月) 07:11:43 ID:???
>>364
(゜Д゜)
367355:2006/10/09(月) 09:37:13 ID:???
>>357
スッキリしました。
ありがとうございました。
368nobodyさん:2006/10/09(月) 11:27:54 ID:???
>>365
それじゃマジで何のためにhiddenに値段埋め込んでるのかわからないじゃねえか
商品IDだけで買う商品が特定できないわけじゃあるまいし
369nobodyさん:2006/10/09(月) 11:37:23 ID:???
だから普通は商品IDだけあればよくて、商品IDから引っ張れる情報は冗長だからもちまわらない
370nobodyさん:2006/10/09(月) 12:11:04 ID:???
>>368
だから設計が悪いんでしょ。
371nobodyさん:2006/10/09(月) 12:16:12 ID:???
>>369-370
IDから引っ張る設計にしたら、


太郎くんが買い物かごに 500円のお米をいれました。
そして購入確認画面で内容をじっくり確認していました。
その時にサイト管理者が商品の価格を80円値上げしました。
そんな時に 「購入」 ボタンを押すと、確かに500円で注文したはずなのに、580円太郎くんのクレジットカードから引き落とされました。


こんなことがおこるわけだが?

そして太郎くんは消費生活センターに苦情を申し立て、2chでそのショップを誹謗しまくり(詐欺だの価格詐称だの)、ついでに、
新聞に投書までしました、ってことにもなりかねないぞw
372nobodyさん:2006/10/09(月) 12:19:45 ID:???
値上げは別IDにしろよ
373nobodyさん:2006/10/09(月) 12:41:43 ID:???
まぁあれだ、小学生相手に例えて言うと商品IDっていうのはバーコードなんだよ。
わかったよな?
374nobodyさん:2006/10/09(月) 12:43:05 ID:???
>>373
なるほど
そういうことでしたか
よくわかりました>A<

375nobodyさん:2006/10/09(月) 12:45:25 ID:???
POSの話ならレジで値段調整するし、値段を変更する前に値札を変更するんだが。
376nobodyさん:2006/10/09(月) 12:46:54 ID:???
商品ID一つで値段別の複数IDを持ったっていい気がするんだがw
377nobodyさん:2006/10/09(月) 13:07:20 ID:???
その程度のことさえ考えずにやってるって、有る意味怖いな。
どんな実装されるやら・・・
378nobodyさん:2006/10/09(月) 13:50:24 ID:???
マジレスすると、期間と価格を設定したテーブルを作っておくから、
突然のセールでも対応可能。
379nobodyさん:2006/10/09(月) 13:52:28 ID:???
その500円を保持しているデータを持ってるってのは誰が保証してくれるんだ?
だいたい >>364 の理論でいくと、1ヶ月とか数ヶ月くらいそのデータ保持してても問題ないってことになるよな。
店で期間限定のチラシの値札もってきてその値段で買わせろってヤツがどこにいるんだ? 大陸か?
380nobodyさん:2006/10/09(月) 14:26:27 ID:???
xrea s201サーバです。

#!/usr/bin/perl
print "Hello" ;

この2行を記述してtest.cgiとしてアップロード・パーミッションは755に
でもScript Error
The script did not produce proper HTTP headers
って出ます。

対処法を教えてくださいまし
381nobodyさん:2006/10/09(月) 14:30:32 ID:???
>>380
headerがない
382nobodyさん:2006/10/09(月) 14:35:15 ID:???
>>381
その書き方を開設してるサイトかリファレンスありますか?
383nobodyさん:2006/10/09(月) 14:39:46 ID:???
二行目
print"<meta http-equiv='Content-Type' content='text/html'; charset='SHIFT-JIS'>";
384nobodyさん:2006/10/09(月) 14:40:46 ID:???
>382
ぐぐれ
あるいは適当な配布cgiスクリプトでもダウンロードして、
文字出力の前にどういうことをやってるかでも見てみりゃいい
385nobodyさん:2006/10/09(月) 14:42:59 ID:???
386nobodyさん:2006/10/09(月) 14:47:30 ID:???
>>383
( ´_ゝ`)

>>382
自分で調べようという努力をしない香具師、自力で調べる能力の無い香具師はプログラミングに向かない。
お前さんはどうやらプログラミングに向いてないようなので、さっさとやめましょう。
387nobodyさん:2006/10/09(月) 14:52:43 ID:???
print "Content-type: text/html\n\n";
これをつけたら直りました。
サンクス
388nobodyさん:2006/10/09(月) 14:58:07 ID:???
改行についてです

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello\n";
$count = 1;
print"$count\n";
$count = 100;
print"$count";

と、
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello<br>\n";
$count = 1;
print"$count\n";
$count = 100;
print"$count";

では、表示させたさい、Helloのあとに改行がつくかつかないかの違いなのですが
解説サイト等ではダブルクォーテーション内で\nをつかば改行とか書いてあるんですけど

実際には改行されず、スペースキーを打ったような状態になってます、
なんででしょうか?

389nobodyさん:2006/10/09(月) 15:10:18 ID:???
print "Content-type: text/html\n\n"; って指定してるんだろ?
『html』なら<br>でなきゃ改行にならない。
『html』ではない別の指定でなら、\nで改行になる。
その解説サイトの解説をすみずみまでよく読んだか?

あるいはその解説サイトがいいかげんな可能性もあるが。
390nobodyさん:2006/10/09(月) 15:12:58 ID:???
>>389
ほほー
ありがとうございました。
391nobodyさん:2006/10/09(月) 17:10:55 ID:???
>>389
その説明もかなりいい加減だと思うが...
392nobodyさん:2006/10/09(月) 17:40:17 ID:???
htmlの仕様を勉強した方がいいよ。
改行コードは半角スペースとして認識されるとか。
393nobodyさん:2006/10/09(月) 17:57:38 ID:???
は…?
394nobodyさん:2006/10/09(月) 19:24:19 ID:???
こんばんは。
モジュールを評価して欲しいのですが、
どこのスレがいいでしょうか?
395nobodyさん:2006/10/09(月) 21:05:59 ID:???
ここでいいよ
396nobodyさん:2006/10/09(月) 21:46:17 ID:???
ここか、「Perlについての質問箱 27箱目」 http://pc8.2ch.net/test/read.cgi/tech/1157874614/
397nobodyさん:2006/10/09(月) 22:11:45 ID:???
CGIが関わると拒絶されるところを紹介しても(ry
398nobodyさん:2006/10/09(月) 23:33:30 ID:???
>>397
このスレの最近の流れを遡ってみたよ。

>>388 # HTML の記法
>>380 # HTTP
>>318 # に至っては >>325「Perlかなにかで」
>>300 からの hidden 云々 # Web アプリに特有の安全性の問題
>>253 # Perl による Web アプリケーション実装における安全性の問題
      # (そして CGI の文脈でしか考えてくれないため >>270 のようなトンチンカンなことに)
>>251 # サーバ間のリソース参照

これ全部あっちでも取扱わなきゃダメかなあ?
できれば勘弁して欲しいなあ。
399nobodyさん:2006/10/09(月) 23:44:52 ID:???
嫌なら見なければいい
400nobodyさん:2006/10/10(火) 00:03:04 ID:???
WebProg板にあるのに何をw
401nobodyさん:2006/10/10(火) 00:05:22 ID:???
>>399
うん、もっともだけど、僕両方見てるのでそういうんでもないんだよ。
ただ僕は、あちらでは「Perl の話」をしたいと思っていて、こちらでは Perl/CGI を軸とした Web アプリケーション開発全般の話題を期待しているわけよ。
で、両方を混ぜちゃうと >>398 で挙げたようないわば「Perl 外」の話が「Perl の話」とごっちゃになってしまい、僕にとってあまりうれしくない、ということなんだ。だから決して「Perl 外」の話が嫌で見たくない、ということではないのよ。
402nobodyさん:2006/10/10(火) 00:40:47 ID:???
初歩的だと思うのですが質問させてください。

$hogeに1〜3の数字が入るのですが(「123」や「13」「2」だけのときもあります)
1がふくまれていたら「あか」、2が含まれていたら「あお」、3なら「きいろ」というような置換をしたいのですが、
s///; 1行でまとめて記述できますか?

できなければ
$hoge =~ s/1/あか/;
$hoge =~ s/2/あお/;
$hoge =~ s/3/きいろ/;
と書くしかないのでしょうか〜? 調べてみたのですがイマイチわかりません・・・。
403nobodyさん:2006/10/10(火) 00:43:08 ID:???
>>402
無理。
404nobodyさん:2006/10/10(火) 00:51:10 ID:???
!無理ですか・・・
即レスありがとうございました・・・orz
405nobodyさん:2006/10/10(火) 00:55:33 ID:???
>>402
できる。 s///ge を使いなされ。
406nobodyさん:2006/10/10(火) 00:58:12 ID:???
>>402
ごめん。準備に一行使ったので二行になっちゃった。

@colors = ('あか', 'あお', 'きいろ');
$hoge =~ s/([1-3])/$colors[$1 - 1]/eg;
407nobodyさん:2006/10/10(火) 01:00:49 ID:???
$hoge =~ s/([1-3])/('あか', 'あお', 'きいろ')[$1 - 1]/eg;
408406:2006/10/10(火) 01:03:57 ID:???
>>407
あ、そうか。^^;
409402:2006/10/10(火) 01:05:03 ID:???
>>405-407
ありがとうございます!!
変換文字列が結構あるので助かりました〜〜!
410nobodyさん:2006/10/10(火) 02:41:09 ID:???
>>406の方がいいと思うね。>>407はやりすぎ。
411402:2006/10/10(火) 03:00:05 ID:???
再びつまりました・・・。

$hogeに1〜3の数字が入るのですが(「123」や「13」「2」だけのときもあります)
if( $hoge =~ /1/){$check[1] = 'checked';}
if( $hoge =~ /2/){$check[2] = 'checked';}
if( $hoge =~ /3/){$check[3] = 'checked';}
これと同じようなことをできるだけ短い行でしたいのですが

ためしに
if ($c_hp =~ /([1-3])/){ $checked[$1] = 'checked';}
にしてみましたが、初めの数字しか反応しません・・・(あたりまえですが)
if以外を使えばいいのでしょうか、、、やり方が思いつきません。
412402:2006/10/10(火) 03:12:46 ID:???
↑$c_hp は $hoge の間違いで、さらに $checked は $check の間違いです・・・orz
413nobodyさん:2006/10/10(火) 03:36:42 ID:???
$hoge =~ /$_/ and $check[$_] = 'checked' for qw(1 2 3);
とか
$check[$1] = 'checked' while $hoge =~ /([1-3])/g;
とか?
二番目のほうは同じ数字が複数回出てくる場合無駄が出るね
逆に一番目のほうは三回別のパターンで頭から調べなおしだから、
それ以外の場合では効率が悪そうな気がする。
414402:2006/10/10(火) 03:57:19 ID:???
>>413
ありがとうございました!!
同じ数字は複数出ない設定なので2番目のほう利用させていただきます!
415nobodyさん:2006/10/10(火) 08:49:57 ID:???
>>405-407
おまえらハッシュの存在忘れてね? e なくてもできるほうがいいと思うんだが。

%colors = (1 => 'あか', ・・・);
$hoge = s/([1-3])/$colors{$1}/g;
416nobodyさん:2006/10/10(火) 10:39:50 ID:???
>>415
ハッシュにしなくとも >>406 なら /e は要らない。
変数展開コンテキスト中でも配列の添え字やハッシュのキーには
式を使える。
417nobodyさん:2006/10/10(火) 11:06:28 ID:???
うわ、ほんとだw しらんかったw
418nobodyさん:2006/10/10(火) 14:23:04 ID:M4r4Q87U
すみません教えてください。

$REC1 = (1,2,3,4,5);
@test1=split(/\,/, $REC1);
for($i=0; $i<@test1; $i++){
@aaa = $test1[$i]
}
とすると、わたしのイメージでは$iが変化する度に$test1[0]から$test1[4]
が@aaaに12345と代入されていくと
思ったのですが実際は一文字しか表示されませんでした。
変数が変化する度に配列に入れていく方法はどうしたらできますか。
419nobodyさん:2006/10/10(火) 14:28:22 ID:???
$REC1= '1,2,3,4,5';


push(@aaa, $test1[$i]);
420nobodyさん:2006/10/10(火) 14:53:37 ID:M4r4Q87U
419さん

早速できてしまいました。
おかげさまです。ありがとうございました。
421nobodyさん:2006/10/10(火) 16:10:54 ID:???
配列を別の配列に入れるのに添え字でループまわしてpushってしないだろ。
@aaa = @test1か@aaa=split ... で十分だと思うのだが。

ここで書いてない部分になにか必要な処理がはさまるのかもしれんけど。
422nobodyさん:2006/10/10(火) 17:40:59 ID:???
C言語の配列のアドレスは
int型4バイトの場合s[1]のアドレス = s[0]のアドレス+4という風に
順当に増えていきますが、Perlの配列の場合どうなっているのでしょうか?
@c = (1,2,3);のとき
SCALAR(0x804c380)、SCALAR(0x804c464)、SCALAR(0x804c494)となりました。

それどころか自分で作ったあるプログラム中の配列では
$ref2 = \@$ref[2];
$ref3 = \@ref[3];
$ref2 = SCALAR(0x8063634)
$ref3 = SCALAR(0x8063610)という風にインデックスは増えているのに
アドレスの値は減ってしまいました。
423nobodyさん:2006/10/10(火) 17:59:24 ID:???
気にしちゃいけません
424nobodyさん:2006/10/10(火) 18:23:51 ID:???
その辺に興味があるのなら処理系のソース読むか「実用Perlプログラミング」(第2版じゃなくて
Sriram Srinivasanが書いた方)の20章「Perlの内部構造」を読むといい。

かいつまんでいると、Perlの配列はCのようにいろいろな型を要素にもった配列ではなくて、全て
Perlのスカラー型をあらわす構造体へのポインタの配列になっている。アドレス順に並んでる
のはこのポインタが並んだ部分だが、君がリファレンスとって見ているのはポインタが入ったハコ
のアドレスではなく、そこに入ったポインタがさした先のスカラーのアドレスなので、これがどういう
順番になっているかはPerlのメモリ割り当てシステムの気分しだい。
425nobodyさん:2006/10/10(火) 19:24:30 ID:kpxOKRmy
youtubeのファイルを読み出してプレイヤーとサムネイルの表示がうまく出来ません。

http:// check 2ch.is.land.to/ 2chsea rcher.cgi?page=0&mobile=&view=10&category=youtube&keyword=&selecttype=all&TARGETADDRESS=http://pc7.2ch.net/streaming/dat/1155343107.dat



↑を保存してそれをhtmlで保存したもの はサムネイルが表示される!
http:// check 2ch .is.land.to/ testing.html


cgiからyoutubeファイルにアクセスするとサムネイルが取得できないのかと思って
上の保存したものを、ただcgiで吐き出すページでも サムネイルが表示できる

http:// check 2ch .is.land.to/ testing.cgi



なんで一番上のcgiだけサムネイルが表示されないか分かる方いたら教えてください。
426nobodyさん:2006/10/10(火) 19:32:45 ID:???
上のとき、画像のプロパティで見れる画像のアドレスは何になってるん?
427nobodyさん:2006/10/10(火) 19:35:49 ID:kpxOKRmy
>>426
アドレスとかタグに関して全く同じ記述なんです
428nobodyさん:2006/10/10(火) 19:38:04 ID:kpxOKRmy
>>426

表示したての1ページ目は真っ黒でサムネイルは表示されず
2ページ目からはサムネイル表示されます

そして、また1ページに戻るをしたら1ページ目も表示される
なんででしょう^^;
謎すぎです
429nobodyさん:2006/10/10(火) 19:53:08 ID:???
じゃーyoutube側で何かしてるとかじゃね?
情報少ないんでなんともいえないけど、違うのがアドレスだけ、ってことなら、
とりあえずその長いアドレスをどうにか直してみたら?
430nobodyさん:2006/10/10(火) 19:54:09 ID:kpxOKRmy
>>429
一度
index.cgiに変えましたけど 同じでした
なのでソースの中身なのかもしれません。
431nobodyさん:2006/10/10(火) 20:12:14 ID:???
とりあえずブラウザからyoutubeに対して同じリクエストを出しているかどうかを
切り分けた方がいいんじゃないか。
432nobodyさん:2006/10/10(火) 20:15:37 ID:kpxOKRmy
>>431
どういう意味ですか?
何と何を切り分けるの?
433nobodyさん:2006/10/10(火) 20:22:15 ID:???
>>432
で、どこがPerlの質問なの。
434nobodyさん:2006/10/10(火) 20:25:54 ID:???
youtube話題は終了
去れ
435nobodyさん:2006/10/10(火) 20:39:31 ID:???
>>434
お前みたいなキモいのがいるから俺らまで勘違いされちまうじゃねーか!
436nobodyさん:2006/10/10(火) 20:41:57 ID:???
スレ違い指摘されただけでムキなるなやチョン
437nobodyさん:2006/10/10(火) 21:18:05 ID:???
>>436
まぁまぁムキになるなよチンク
438422:2006/10/10(火) 21:55:48 ID:???
>>424
@a = (1,2,3);
と宣言した時点で1、2、3が適当なアドレスに振り分けられて
配列の要素の中にそのスカラー値へのポインタが格納されているのですかー
ありがとうございましたm(_ _)m
439nobodyさん:2006/10/11(水) 00:16:26 ID:???
めんどくせーから youtube-dl でも落として、`youtube-dl` しとけ。
440nobodyさん:2006/10/11(水) 20:14:04 ID:???
質問です。
アップローダーのCGIなどよくありますが、
これらにアップロード中の進行状況表示(転送速度あるいは転送済量)
を表示する機能を追加することが出来ないかと考えております。
javaなどの可能性も含めて
どなたか知恵を拝借させてください。
よろしくおねがいいたします。
441406:2006/10/11(水) 20:46:56 ID:???
>>411
すごい勢いで遅れたけどこれで。e にこだわる係。未テスト。
$c_hp =~ s/([1-3])/ $checked[$1] ||= 'checked'; ('あか', 'あお', 'きいろ')[$1 - 1] /eg;
442nobodyさん:2006/10/11(水) 20:59:56 ID:???
>440
java アプレット
Flash (MX以降かも)
ActiveX

で実装可能
上から順番に汎用性は高いかと思う
443nobodyさん:2006/10/11(水) 21:00:39 ID:???
>>440
javascriptかjavaかflashでも使えばなんとかなるかもしれん。
特に鯖側に機能はいらないのでそれらのスレで聞いたほうが
いいよ。

444nobodyさん:2006/10/11(水) 21:09:07 ID:???
鯖側は通常のあぷろだスクリプトのままでOK(若干の手直しは必要かも)

まぁftp開けて転送しちゃうのも手
445nobodyさん:2006/10/11(水) 21:40:36 ID:???
Ajax
446440:2006/10/12(木) 02:52:06 ID:???
多くのレスありがとうございます。
やはりjavaが実用的かと思うので
試行錯誤してみたいと思います
ありがとうございました。
447nobodyさん:2006/10/12(木) 13:35:56 ID:???
mod_uploader
448nobodyさん:2006/10/12(木) 13:58:23 ID:???
ご主人様?
449nobodyさん:2006/10/12(木) 14:23:54 ID:???
mod_uploaderが原因不明の暴走起こして
apacheはもちろん
全てのサービスが通信不能になった私が来ましたがなにか。
ちなみに原因判明まで1週間もかかった自分も自分だがなorz
450nobodyさん:2006/10/12(木) 16:14:36 ID:???
>>449
怖くて使えない自分よりも漢だ。
元気出せ!
451nobodyさん:2006/10/12(木) 21:29:47 ID:???
snアップローダを使用しているのですが、
投稿者がファイルをアップするとIPなどのログが記録されるのですが、
投稿者がアップしたファイルを削除するとログも削除されてしまいます。

ファイルを削除した時にログが削除されないようにするにはどこを変更したらいいのでしょうか?
よろしくお願いします。

snアップローダ
ttp://sugachan.dip.jp/download/uploader.php
452nobodyさん:2006/10/12(木) 21:54:06 ID:???
>>451
スレ違い。こちらへドゾー

【 スクリプト改造依頼スレ 】(丸投げ) part6
ttp://pc8.2ch.net/test/read.cgi/php/1157787046/
453451:2006/10/12(木) 22:04:51 ID:???
>>452
失礼しました
移動します
454nobodyさん:2006/10/12(木) 22:49:49 ID:???
ヒアドキュメント内でコメントアウトすることできますでしょうか?
455nobodyさん:2006/10/12(木) 23:02:48 ID:???
>>454
Perl処理系が認識するコメントにはできないが、ヒアドキュメントで得られた文字列を適当に加工する
コードを追加する、という手はなくもない。


print strip_comment(<<FOO);
hoge
# hoge
hogehoge # hoge
FOO

sub strip_comment {
my($s) = @_;

$s =~ s/\s*#.*$//gm;

return $s;
}


456nobodyさん:2006/10/12(木) 23:16:34 ID:???
>>454
答えようとしたら同ネタが既に出てたので正規表現だけ。
$s =~ s/(^)?[\t ]*#.*(?(1)\n)//gm;

>>455
大昔にベンチ取った時、サブルーチン末で値を返す場合は
陽に return しない方が有為な差が出る程度に速かったんだけど、
今の環境だとどうなんだろうね。興味あったら計ってみて下さい。
457nobodyさん:2006/10/12(木) 23:29:52 ID:???
変に最適化するより分かりやすいコードを書く方がいいと思うなぁ
458nobodyさん:2006/10/12(木) 23:48:01 ID:???
そんな処理速度が問題になるようなところはXSで書けばいいのに。
459nobodyさん:2006/10/12(木) 23:58:15 ID:???
>>458
XSってなんでしょう…。
XSSなら知ってますが、XSなんて聞いたことないですね〜。
460nobodyさん:2006/10/13(金) 00:09:26 ID:???
>>449
ご主人様と呼ばれて喜んでいるようなキモい人間が書いたソフトを
よく自分のマシンで動かせたね。w
461nobodyさん:2006/10/13(金) 00:09:28 ID:???
ググれ
462nobodyさん:2006/10/13(金) 00:47:42 ID:???
>>455-456
サンクス。
463nobodyさん:2006/10/13(金) 22:52:20 ID:???
引数みたいにしてある @ は何でしょうか?

sub md5_hex(@) {
unpack 'H*', &md5;
}
464nobodyさん:2006/10/14(土) 01:07:07 ID:???
>>463
perlsub の Prototypes 参照。
465nobodyさん:2006/10/14(土) 10:12:43 ID:???
>>464
引数の型を定義しているということですか。
サンクス。
466nobodyさん:2006/10/15(日) 22:29:10 ID:???
掲示板での投稿の処理で現在
$FORM{$name} = $value
でフォーム内容をわけていますが、
hp だけ情報を結合したいのですが

if($name eq 'hp'){$FORM{'hp'} .=$value;}
else{$FORM{$name} = $value;}

としてみましたがうまく動きません。(hpの最後の情報だけ取得されます)

if($name eq 'hp'){$FORM{'$name'} .=$value;}
else{$FORM{$name} = $value;}

としてみても結果は同じです(当たり前ですが・・・)
どのようにすればいいのでしょうか。orz
467nobodyさん:2006/10/15(日) 23:41:25 ID:???
>>466
そのコードにおかしい所はない
468466:2006/10/15(日) 23:57:14 ID:???
レスありがとうございます・・・(・ω・`)
しかし、思いのとおりに入っていないのですが…
ちなみにhpの指定をせずに $FORM{$name} .= $value; にすると
ちゃんとhpに連結したデータが入ることは確認しています。。
469nobodyさん:2006/10/16(月) 00:04:58 ID:???
たぶん、 $name が純粋に 'hp' ではないんじゃないかな。
後ろにスペースが入ってるとか、改行がついてるとか、大文字小文字が違うとか。

if($name =~ /\bhp\b/i){$FORM{$name} .=$value;}
else{$FORM{$name} = $value;}

だとどう?
470466:2006/10/16(月) 00:20:30 ID:???
>>469
できました・・・!!
=~ //i はわかるのですが、\bは何を意味するのか
調べてみたのですがいまいちわかりません…!
よければなんと言う呼び名か教えていただけませんか?
自分で調べたいので…!
471nobodyさん:2006/10/16(月) 00:42:19 ID:???
>>470
動いたようでよかったです。
\b は正規表現での単語境界を表すメタシンボルです。
472nobodyさん:2006/10/16(月) 00:42:18 ID:???
>>470
できたのかよw
>>468 の現象を見ると >>469 でもできなそうだと踏んだのになあ。
473466:2006/10/16(月) 00:49:49 ID:???
ちなみに/iは無くてもできましたが、>>469を使うと
後にでてくる
if ($FORM{'hp'} !~ /[1-5]/){&error("hpwo選択してください");}
が反応しなくなってしまいました…。
>>468の場合だと動いていました)
hpには1から5の数値がランダムで入るのですが…
連投すいません。
474nobodyさん:2006/10/16(月) 00:57:33 ID:???
>>473
そのコードだと、

> hpには1から5の数値がランダムで入るのですが…

が真である限り、$FORM{'hp'} !~ /[1-5]/ は必ず偽になるため &error() が実行される事はありません。
そういうことではなくて?
475466:2006/10/16(月) 01:01:49 ID:???
>>474
あぁ、書き方がわるかったです、申し訳ない!
必ず偽になるようにテストしているのですが
&error() が返されてしまうのです。
476nobodyさん:2006/10/16(月) 01:03:41 ID:???
あー、そういう風に使うつもりなら $name からスペースや改行などをとりのぞいて小文字で統一するなりして
ちゃんと 'hp' になるようにしたほうが、バグにはならないね。chomp、s///、lcとかでやってみて。

てか、条件の後出しはやめましょう。
477466:2006/10/16(月) 01:07:01 ID:???
>>476
そうですね、色々ややこしくなってそうです。
改めて内容の見直ししてみます。
>>466の状態でできていれば問題なかったのですが・・・(・ω・`)
レスありがとうございました。助かりました。
478Perl初心者の中学生:2006/10/16(月) 19:34:27 ID:1M63qM8/
はじめまして。PerlでCGIを作成したのですが疑問があったので質問にきました。
スレ違いなら誘導してくれるとありがたいです。
質問の内容はカウンターを作っていたのですが、作成途中にできた二つのソースが
同じ内容なのに動作に違いがあることに気づき、原因がわからない。ということです。
以下のソースを見てください。
http://love.meganebu.com/~freedomworld2006/count.txt
このソースはCGI形式にして実行すると、
<img src="img/0.png" alt="0> <img src="img/0.png" alt="0> <img src="img/0.png" alt="0> <img src="img/1.png" alt="1>
と、そのまんまブラウザに表示されてしまいます。ですがカウントはしているようです。
http://love.meganebu.com/~freedomworld2006/count2.txt
しかし、こちらは上の失敗したソースと同じなのにちゃんと画像が表示され動作します。
違いといったら半角のスペースや改行があるかないかです。
なんでこんなことが起こるのか全くわかりません。ちなみにインタプリンタパスは省略してあります。
わかる方、どうか教えてください。お願いします。
479nobodyさん:2006/10/16(月) 20:07:39 ID:???
今帰宅中だから帰ったら見てみるよ
480nobodyさん:2006/10/16(月) 20:13:00 ID:???
>>478
count.txt 19行目:
 alt=\"$n\>\n";
count2.txt 18行目:
 alt=\"$n\">\n";
481nobodyさん:2006/10/16(月) 20:48:00 ID:???
>>480
やはりソースミスでしたか・・・こういうのは人に言われて初めて気づくんですよね・・・。
ご指摘ありがとうございました。
本当に助かりました。
482nobodyさん:2006/10/16(月) 23:51:46 ID:ZHxCJrpx
すみません。ネットショップを運営してるのですが、
掲示板とショッピングカートはレンタルのサーバーをかりて、
HPからリンクして使っています。ところが掲示板荒らしで困っています。
改行を繰り返し、とても見にくくて、アクセス拒否してもネットカフェなどから
投稿してきたりで、どうしようもありません。
文字数の制限は設定サービスにあるのですが改行制限はサービスにないといわれ、
$value =~ s/\r\n/<BR>/g;
$value =~ s/\r/<BR>/g;
$value =~ s/\n/<BR>/g;
$value =~ s/(<BR>){5,}//g;

これを使えと言われたのですが、本当に初心者でよくわかりません。

サーバーを代えたほうが早いですか??
483nobodyさん:2006/10/17(火) 00:14:01 ID:???
てーか、ショップってことは掲示板とかもどこかに作ってもらったものなんでしょ?
そのひとが 「改行制限はサービスにない」 とかゆってんの? ワロスww
そしてこれを使えの例がひどくてさらにワロスwww

参考までに作者のサイトおしえてください><

〜.cgi のソース内を 「$value =~ s/\r/<BR>/g;」 で検索すればそれっぽいとこがあるから追加すればいいんじゃない? kwskはわからんけど
あとサーバ変えても同じだと思うんだけど。
484nobodyさん:2006/10/17(火) 00:25:20 ID:???
えっと、作ってもらったんじゃなくて掲示板をかりています。
ttp://advenbbs.net/

ここのです。

$value =~ s/\r\n/<BR>/g;
$value =~ s/\r/<BR>/g;
$value =~ s/\n/<BR>/g;
$value =~ s/(<BR>){5,}//g;


コレを使えと言ったのは、元PCの先生なんですが。

なんか、自分が無知すぎて恥ずかしいので、
他に対策をとってみます。

すぐレス下さり本当に有難うございました。
まずは、勉強してみます。

485nobodyさん:2006/10/17(火) 00:44:46 ID:???
うすうすそうかとは思っていたが・・・

>ベースはKENT-WEBの人気レス式アイコン掲示板YY-BOARDで見た目も使いやすさはバツグン!

(ノД`)アチャー
486nobodyさん:2006/10/17(火) 00:46:25 ID:???
まあ、「レンタル掲示板」 じゃソース書き換えもできないので、
他の、しっかり対応してくれるとこから借りるのをオススメしますー。
487nobodyさん:2006/10/17(火) 00:54:00 ID:???
有難うございました
m(__)m

PS.なんでみなさん、IDが???なんでしょう???
488nobodyさん:2006/10/17(火) 10:22:16 ID:???
>>481
普通はdiffとるから、自ら気付く。
489nobodyさん:2006/10/17(火) 13:31:46 ID:???
動作が違うなら内容が違う→同じかどうかチェック→diffって流れね、たぶん。
490nobodyさん:2006/10/17(火) 15:22:14 ID:???
diffとは何でしょうか。
調べてみたのですがよくわからない部分もあったのです。
できたらやり方を教えてくれませんか?
491nobodyさん:2006/10/17(火) 15:23:22 ID:???
>>490
>>調べてみたのですがよくわからない部分もあったのです。

調べてみたのですがよくわからない部分もあったので。
に訂正します。。。
492nobodyさん:2006/10/17(火) 15:26:48 ID:???
「diff コマンド」
493nobodyさん:2006/10/17(火) 15:32:39 ID:???
>>492
コマンドプロンプト使うんですか?
494nobodyさん:2006/10/17(火) 15:36:53 ID:???
>>493
windowsには付属してないから、diffとかでぐぐってwindowsで使えるそれっぽいのを使ってみるといいよ
495nobodyさん:2006/10/17(火) 16:17:37 ID:???
某秀○とかでも内容比較できるけどスレ違い
496nobodyさん:2006/10/17(火) 19:57:46 ID:???
>>490
目視でのチェックは必ず見落とすからdiffというプログラムを使って比較する。
Windowsだったら、FCというコマンドがある。MSDOSの頃からある古いプログラムだけど、
目視より100万倍まし。

コマンドプロンプトで
fc file1 file2
497nobodyさん:2006/10/17(火) 22:20:48 ID:???
>>490
いっそ Perl で書いてしまえ。
498nobodyさん:2006/10/17(火) 22:59:43 ID:???
499497:2006/10/17(火) 23:55:16 ID:???
>>498
あ、……ああ、ほら、練習も兼ねて、な?
500nobodyさん:2006/10/18(水) 00:00:02 ID:???
> あ、……ああ、ほら、練習も兼ねて、な?

ゴミ生産して何かいいことあんの?
501nobodyさん:2006/10/18(水) 00:08:11 ID:???
それなりに経験になる。
502nobodyさん:2006/10/18(水) 01:08:00 ID:???
> それなりに経験になる。

K*NT 的な人間を増やしてどうなるんかね。w
503nobodyさん:2006/10/18(水) 01:11:56 ID:???
色々と検索していたらDFというよさそうなソフトを見つけたのでこれを使っていきたいと思います。
機会があったらPerlで作ってみたいです。
スレ違いの話題になってしまいましたが皆さんお答えしていただきどうもありがとうございました。
504nobodyさん:2006/10/18(水) 17:13:18 ID:ZtKQFgfZ
お小遣いサイトを作りたいんだすが、お小遣いサイトにあるような
ユーザー登録、マイページ、広告サイトに登録するとポイントがあがる、
クリック広告をクリックするとポイントがあがる。
などそのような機能のスクリプトがわかりません・・。

どうしたらいいでしょうか??^^;
505nobodyさん:2006/10/18(水) 17:16:31 ID:???
しねばいいとおもうよ
506nobodyさん:2006/10/18(水) 17:28:12 ID:???
マルチだから死んでいいよ。つーか死ね。
507nobodyさん:2006/10/18(水) 23:41:22 ID:???
>>495
Rekisaとか使ったほうがよくね?
508nobodyさん:2006/10/19(木) 11:04:42 ID:???
$site = '(?:www.yourfilehost.com)';
$ext = '(?:zip)'

while($data~ m/((mms|h?ttp):\/\/(?:[\w\/\.\?\=\-\&\:]*($site)?(\/)?([\w\/\.\?\-\=\&\:]*|[\w\/\.\?\=\-\&\:]*\.$ext[\w\/\.\?\=\-\:]*)))/g) {
$output = $1;
}

だと $dataに入っている ttpから始まるどのようなアドレスでも抽出して$1に入れてしまいます。

そうではなく

mms://アドレス;ポート番号 ←や
http://アドレス;ポート番号 ←や
ttp://アドレス;ポート番号 ←や
$siteに含まれてるサイト先 や
$extに含まれてる拡張子が あるときだけ $outputには入れられないですか?
509nobodyさん:2006/10/19(木) 11:51:43 ID:???
できますよ。

それよりまずバックスラッシュとか見通しがひどいんで、 m/〜/ → m{〜} にして
[\w\/\.\?\=\-\&\:]* とかも $変数 = qr/〜/ にして書き直してきて。
510nobodyさん:2006/10/19(木) 12:15:36 ID:???
>>508
スキームが http, ttp, mms の何れかで、且つ
$site のドメインで、且つ
$ext の拡張子を持つファイルの URL という意味なら

$scheme = qr{(?:h?ttp|mms)};
$site = qr{(?:www\.yourfilehost\.com)};
$ext = qr{(?:zip)};
@output = $data =~ m{$scheme://$site(?:\d+)?/[\w!\$&-;=@-\[\]~]+\.$ext}g;
511510:2006/10/19(木) 12:17:14 ID:???
訂正。正規表現中の @ の前に \
512nobodyさん:2006/10/20(金) 08:06:25 ID:???
>>509-510

亀レスすみません。
一応↓のようにして出来たには出来たのですが

http://203.111.199.131:8080/test.m3u  ←を拾ったとき、test.m3uまで含めたいのですが 8080の後ろで切れてしまい
それを$outputの中に入れてしまいます。

                                            ↓ここの表記に問題がありますか?
while ($data=~ m/(((?:$site_m)[\:\d\w\-\.\/\=\?\!\-\%\&\_\#]+\:[\d]+)|h?ttp:\/\/(?:[\w\/\.\?\-\%\&\=]*$site\/[\w\/\.\?\-\%\&\=]*|[\w\/\.\?\-\%\&\=]*\.$ext[\w\/\.\%\&\-\?\=]*))/g) {
$output = $1;
513nobodyさん:2006/10/20(金) 12:26:37 ID:???
>512
問題ありません。
514nobodyさん:2006/10/20(金) 22:07:24 ID:???
エスケープしすぎだろ常識的に考えて・・・
515nobodyさん:2006/10/20(金) 22:15:15 ID:???
>>509にレスはしてるが読んでないんだね
質問してるのに何でアドバイスは無視してるの?
516nobodyさん:2006/10/20(金) 22:39:35 ID:???
ブラケットの中はエスケープしなくていいだろ常識的にk(ry
517nobodyさん:2006/10/20(金) 23:33:13 ID:???
質問させてください

私がPERLで作ったCGIをPCにて閲覧している時、「戻る」ボタンを押したら
前ページのキャッシュを読み込むので、ロード時間がかからず表示が速いのですが
携帯電話で「戻る」をすると毎回CGIをロードしなおして時間がかかります。
携帯電話でも前ページを表示した時にキャッシュを読み込ませる方法はありますか?
518nobodyさん:2006/10/20(金) 23:48:49 ID:???
質問です。
AAA
BBB
CCC
というファイルがあります。
一行目がAAAであるときのAAAとCCCを
AAA CCCというならびで抽出したい場合

foreach(<STDIN>){
if(/(AAA)/){
print "$1";
foreach(<STDIN>){
if(/(CCC)/){
print " $1\n";
     last; 
}
}
}
}
で上手くいきません。
ご教授お願いします。

519nobodyさん:2006/10/21(土) 01:08:52 ID:???
>>517
携帯電話のブラウザにキャッシュ機能があるのかどうかによる。
ヘッダーに Cache-Control を追加してみるとか。

>>518
http://pc8.2ch.net/test/read.cgi/tech/1157874614/784
マルチ乙
520nobodyさん:2006/10/21(土) 02:29:15 ID:???
>>519
魔法のiランドとかaspとかですよね?
魔法のiランドとかなら 戻るしても キャッシュが読み込まれてるっぽいので

携帯電話にはキャッシュ機能はついてそうですね
521nobodyさん:2006/10/21(土) 03:37:50 ID:???
Perl の話じゃなくて、携帯電話向けの開発の話だから、
他のスレでやった方が御互いのためだと思うが。
522nobodyさん:2006/10/21(土) 04:03:30 ID:???
>>521
PERLで組んでてそうなってるんだから
ここでもいいんじゃね?
523nobodyさん:2006/10/21(土) 05:03:26 ID:???
教えて下さい
文字コードをjisからeucに書き直したのですが
GETで送る文字が受け取り側で化けてしまいます。
いろいろやってみたのですが上手くいきません
対処法ありましたら教えて下さい。
524nobodyさん:2006/10/21(土) 05:33:46 ID:???
>>523
特別なこと書いてないからFORMからの送信だと思うけど
送信側の文字コードは確認したのですか?ヘッダの指定はしてありますか?
525nobodyさん:2006/10/21(土) 06:08:17 ID:???
>>524
説明不足ですみません。
送信側の文字コードはEUCです。
FORMからではなくhtmlリンクに *.cgi?abc=あいうえお と記述しています。
(本当はpostしたいのですが別窓を開いて表示させたいので仕方なく)
526523:2006/10/21(土) 06:16:03 ID:???
正確に書くと<a href="javascript:openwin('*****.cgi?title=$aaaa[1]')">です。
スクリプトや格納してあるデータは全てEUCにしてあります。
527nobodyさん:2006/10/21(土) 06:33:32 ID:???
すみません^^;
受け側のヘッダもEUCです。
528nobodyさん:2006/10/21(土) 07:00:16 ID:??? BE:596111696-BRZ(3600)
直接、日本語を入れてるんですか?
それは文字コードやPerlの問題ではないですよ
URLエンコードしないと駄目ですよ
529523:2006/10/21(土) 07:51:25 ID:???
すみません勉強してきます^^;
ありがとうございました。
530nobodyさん:2006/10/22(日) 01:38:10 ID:???
アクセスカウンタを製作しています。

動くには動くのですが、ほんのたまにリセットされてしまい、また0からカウントしはじめます。
対処方法などご存知でしたら教えてください
531nobodyさん:2006/10/22(日) 01:54:52 ID:???
>>530
排他制御を正しく行う。
専用スレ http://pc8.2ch.net/test/read.cgi/php/1024795138/
532nobodyさん:2006/10/22(日) 01:55:36 ID:???
>>531
ありがとうございます
見てみます
533nobodyさん:2006/10/22(日) 02:09:49 ID:Wr8nDhA3
タイムスリップなんてことになってる...。

@array = qw(0 1 2 3);

foreach my $hoge(@array){
push @new_array,$hoge
}

my $x_array =[];
foreach my $hoge(@array){
push @$x_array,$hoge
}


print @new_array;
print @$x_array;

どなたか、これらの違いを教えてください。
速度?

予約済み変数とかいろいろ調べてみたんですが、
"[]"って何か知ってる方がいらっしゃったら
よろしくお願いします。

print [];
->ARRAY(0x274f18) ナニコレ?
534nobodyさん:2006/10/22(日) 02:16:46 ID:???
>>533
man perlref
535nobodyさん:2006/10/22(日) 02:25:22 ID:???
無名配列へのリファレンス
536nobodyさん:2006/10/22(日) 02:50:36 ID:Wr8nDhA3
>>534 >>535
サンクス、勉強不足なのが把握。
537nobodyさん:2006/10/22(日) 13:54:06 ID:envKHppf
シロートですが、どなたか教えて下さい。

if ( @list1[2] eq @list2[3] ){

とやってて、@list1[2]と@list2[3]にはそれぞれ"00001"が入っているのですが、
条件に一致しません。

if ( @list1[2] == @list2[3] ){

とすると一致します。

この例では値が"00001"ですが、実際は文字の場合もあるので、eq をつかいたいのですが、
どうしたらよいでしょうか?

Perlは文字とか数値とかあんまり意識せずに使えると思ってましたが、こういう場合は
別なんでしょうか?
538nobodyさん:2006/10/22(日) 14:00:48 ID:???
>>537
シロートなら>>3で勉強してこい
539nobodyさん:2006/10/22(日) 14:12:59 ID:???
すみません、質問です。

ppmでモジュールをインストールしたいです。

モジュールはSOAP::Liteです。
>search SOAP::Lite
から調べていくと、以下まで達しました。

ppm> search ResourcePool-Resource-SOAP-L
Using cached search result set 7.
1. ResourcePool-Resource-SOAP-~ [1.0101] SOAP::Lite bindings for ResourcePool
2. ResourcePool-Resource-SOAP-~ [1.0101] ResourcePool-Resource-SOAP-Lite


ここで、正式名称が分からないので、インストール/確認ができない状態です。
チルダで省略されている部分を参照するにはどうすれば良いでしょうか?

宜しくお願いします。
540nobodyさん:2006/10/22(日) 15:10:43 ID:???
541nobodyさん:2006/10/22(日) 15:35:24 ID:???
ここまでマルチが多いのは、誰かが質問を転載してるんだろうな。
恐らくマルチして指摘された奴が腹いせでやってるんだろう。
542nobodyさん:2006/10/22(日) 15:39:31 ID:???
ここまでマルチが多いのは、誰かが質問を転載してるんだろうな。
恐らくマルチして指摘された奴が腹いせでやってるんだろう。
543nobodyさん:2006/10/22(日) 15:55:00 ID:???
必死だな
544nobodyさん:2006/10/22(日) 15:56:17 ID:???
コピペウゼー('A`)
545nobodyさん:2006/10/22(日) 16:03:05 ID:???
ID表示して質問するようにすればいいよ。
546nobodyさん:2006/10/22(日) 17:34:00 ID:???
CGI::Sessionを使用したいのですが

1, ユーザ→CGI だと上手くいくのですが、

2, ユーザ→CGI→モジュール→CGI 

のモジュールで

my $session=CGI::Session->new(undef,$sid,{Directory=>'../session'})

でデータを取得出来ないのですが、どうすれば取得出来るのでしょうか?
547nobodyさん:2006/10/22(日) 21:34:28 ID:???
> 1, ユーザ→CGI だと上手くいくのですが、
> 2, ユーザ→CGI→モジュール→CGI 
これが意味不明だけど、$sidにはなにが入ってるの?
第2引数ってCGI.pmのオブジェクトじゃ駄目なの?
548nobodyさん:2006/10/23(月) 05:27:20 ID:???
549nobodyさん:2006/10/23(月) 16:44:05 ID:???
質問です。

$MOJIRETSU="<太字>テスト1</太字><太字>テスト2</太字><太字>テスト3</太字><太字>テスト4</太字>";

とあったときに<太字>〜</太字>を→<b>〜<b>にして出力したいです。

そこで
$MOJIRETSU =~ s/<太字>(.*)/太字/<b>$1<\/b>/;

にして実行したら

<b>テスト1</太字><太字>テスト2</太字><太字>テスト3</太字><太字>テスト4</b>

というように最初の「太字」と最後の「/太字」を参照にして置き換えをします。
それぞれで置き換えを行って

<b>テスト1</b><b>テスト2</b><b>テスト3</b><b>テスト4</b>
という結果が欲しいのですがどうすればよいでしょうか?
550nobodyさん:2006/10/23(月) 17:03:34 ID:???
/太字/b/
//b/\/b/
551nobodyさん:2006/10/23(月) 17:11:54 ID:???
>>549
$MOJIRETSU =~ s|<\Q太字\E>(.*?)<\Q/太字\E>|<b>$1</b>|g;
552nobodyさん:2006/10/23(月) 17:24:23 ID:???
>>550->>551
ありがとうございました。その方法だと出来ました。

もう1つ質問させていただいてもいいですか?
553nobodyさん:2006/10/23(月) 17:26:07 ID:???
ダメです! って言ったらどうすんだろ
554nobodyさん:2006/10/23(月) 17:28:38 ID:???
>>553
あきらめますorz
555nobodyさん:2006/10/23(月) 17:32:21 ID:???
         ,. ‐''三ヾ´彡シ,=`丶、
     /'".:=≡ミ_≧_尨彡三:ヽ、
    //.:;:彡:f'"´‐------ ``'r=:l
    /〃彡_彡′,.=、 ̄ ̄ ,.=、 |ミ:〉
   'y=、、:f´===tr==、.___,. ==、._ゞ{
   {´yヘl'′   |   /⌒l′  |`Y}
   ゙、ゝ)       `''''ツ_  _;`ー‐'゙:::::l{   あきらめたら
.    ヽ.__     ,ィnmmm、   .:::|!   そこで試合終了ですよ・・・・
  ,.ィ'´ト.´     ´`"`"`゙″ .::::;'
イ´::ノ|::::l \         "'   :::/
::::::::::::|:::::l   ヽ、      ..::  .:::/.、
:::::: ::: |:::::ヽ    ヽ、.......::::/..:::/!\\
::::::::::: |::::::::ヽ    ``''‐--ァt''′ |!:::ヽ:::\
:::::::::::::|::::::::::::ヽ、       /i|iト、  |l:::::::ヽ:::::\
:::::::::::::|::::::::::::::/:ヽ、   ∧|i|i|i|〉. ||::::::::::ヽ:::::::\
556nobodyさん:2006/10/23(月) 17:42:02 ID:???
すごい初心者なことなんですが^^;

フォーム入力から取得した

$in{'address'}の最後が「 .zip 」で終わっているか確認するためには

if($in{'address'}){
# .zipで終わってないときのエラー処理
}

どういうふうにifを組めばいいですか?
557nobodyさん:2006/10/23(月) 17:45:58 ID:???
if( $in{'address'} !~ /zip$/){
558nobodyさん:2006/10/23(月) 17:49:33 ID:???
>>557
ありがとうございました^^
559nobodyさん:2006/10/23(月) 18:09:10 ID:???
>>551さんの方法でうまくいったのですが

逆に
<a href="http://hoge.com/hoge.cgi?keyword=test">test</a>

を 開始test終了 に戻すときにはどうすればいいでしょうか?

$data =~ s/\Q<a href=(.*?)>\E(.*?)\Q<\/a>\E/開始$2終了/g;

では出来ませんでした
560nobodyさん:2006/10/23(月) 18:29:17 ID:???
$data =~ s/<a href=(.*?)>(.*?)<\/a>/開始$2終了/g;
561nobodyさん:2006/10/23(月) 18:48:22 ID:???
>>559
$data =~ s|<a\b[^>]*>(.*?)</a>|開始$1終了|g;

http://www.kt.rim.or.jp/~kbk/perl-5.8/perlretut.html
562nobodyさん:2006/10/23(月) 19:12:11 ID:I2ot/ZmI
>>560-561
出来ました!ありがとうございました
563nobodyさん:2006/10/24(火) 07:41:17 ID:???
昨日質問させていただいた>>562です


>>549 の内容と>>559の内容を

合わせて


$MOJIRETSU="リンク青字テスト/青字/リンク";   #←結果としては<a href=http://hoge.com/hoge.cgi?keyword=テスト><font color=blue>テスト</font></a>が返ってきてほしい


$SEARCHADD="http://hoge.com/hoge.cgi?keyword=";
$MOJIRETSU =~ s/\Qリンク\E(.*?)\Q/リンク\E/<a href=$SEARCHADD$1>$1<\/a>/g;
$MOJIRETSU =~ s/\Q青字\E(.*?)\Q/青字\E/<font color=blue>$1<\/font>/g;
$MOJIRETSU =~ s/\Q赤字\E(.*?)\Q/赤字\E/<font color=red>$1<\/font>/g;


とすると文字列が
$MOJIRETSU="<a href=http://hoge.com/hoge.cgi?keyword=テスト><font color=blue>テスト</font></a>"が返ってきてほしいのですが

リンク〜/リンクの中身までをURLのkeyword以降に入れて
$MOJIRETSU="<a href=http://http://hoge.com/hoge.cgi?keyword=<font color=blue>テスト</font>><font color=blue>テスト</font>"となってしまいます。
解決方法を教えてください。
564nobodyさん:2006/10/24(火) 09:02:56 ID:???
これは酷い
565nobodyさん:2006/10/24(火) 10:04:02 ID:???
3日ぐらい考えてくれ
566nobodyさん:2006/10/24(火) 11:06:32 ID:???
おれから言えることは

まず煮詰まったら外の空気に触れながら景色を見ろ
567nobodyさん:2006/10/24(火) 15:01:35 ID:???
>>563
おまえmixiで同じ質問してるだろ。死ねよ。
568nobodyさん:2006/10/24(火) 17:56:30 ID:S0nwA48Z
Perlを始めて間もなくて、分からないことがあって困っています。質問させてください。
現在ウェブメーラーを自作しようとしておりまして、POP3サーバにアクセスしてメールの差出人のメールアドレス、件名、受信時刻、本文を表示しようとしているんですが、件名だけがデコードの仕方が分からずに困っています。本文は
Encode::from_to($body,"iso-2022-jp","shiftjis");
だけでなんとかなってしまったのですが、件名はこれだけだとうまくいかず、デコード前の
=?ISO-2022-JP?B?〜〜〜?=
と表示されてしまいます(〜〜〜は任意の内容)。調べたところヘッダー部はエンコードの方法が異なっているというようなことを見たので、
$Subject = decode_base64($Subject);
としてみたのですが正しい表示はされません。どうしたらうまくいくでしょうか。初心者ゆえくだらない質問かもしれませんが、どうかご教示ください。
569nobodyさん:2006/10/24(火) 18:05:43 ID:???
shut the fuck up and search around http://search.cpan.org/
570nobodyさん:2006/10/24(火) 19:44:51 ID:FUbqOCaM
ここで尋ねていい物かどうか迷ったんですが質問。
掲示板CGIについて。

2ちゃんねるでは半角カタカナを使っても文字化けってしないですよね。
でも私の掲示板(ベースはKENTのMiniBBSとか、PrismWebのテンプレ掲示板とか)
では、半角カタカナを投稿すると???などという風に化けてしまいます(ログに記録する時点で化けてる)。

この違いって、どこから来るんでしょう?
エンコード方法?それともサーバの問題?jcodeモジュールの問題?
571nobodyさん:2006/10/24(火) 19:53:56 ID:???
2chはSJIS以外は受け付けない
572nobodyさん:2006/10/24(火) 19:55:02 ID:???
エンコードとデコードが一致してない
573nobodyさん:2006/10/24(火) 20:10:58 ID:myoH6Gq+
ここには能力が足らず答えられない奴ばかりですか?まぁ自分もわからんが、>>568の質問放置で可哀想
574nobodyさん:2006/10/24(火) 20:23:38 ID:???
メールの仕様をちょっと調べれば済むような事で質問するから放置されるのだよ。
575nobodyさん:2006/10/24(火) 20:31:40 ID:???
>>568
キーワードはMIME header
詳細はスレ違い

これでいいのか?
576nobodyさん:2006/10/24(火) 21:13:31 ID:/nLWiTuI
perlにてtxtファイルを生成しています。
perlソース自体はEUCで記入しており、生成されたファイルも
EUCコードなのですが、このファイルをブラウザ(IE)で開くと
SJISエンコードで開いてしまい文字化けしてしまいます。
ブラウザがEUCエンコードで表記されたファイルという事を
認識していないようなのですが、どのようにすればEUCとして
認識してくれるのでしょうか?
577 ◆TWARamEjuA :2006/10/24(火) 21:29:18 ID:??? BE:5881469-BRZ(6667)
>>576
IEを窓から投げ捨てる♪
か、適切なcharsetを指定してあげる♪
578nobodyさん:2006/10/24(火) 21:35:09 ID:???
> IEを窓から投げ捨てる♪

なにそれ?
579nobodyさん:2006/10/24(火) 21:38:31 ID:???
なにって、そのままの意味にしかとれんが…
580nobodyさん:2006/10/24(火) 21:41:27 ID:???
イミフ。
581nobodyさん:2006/10/24(火) 22:13:55 ID:???
>>576
EUC-JP のファイルを IE で確実に読みたいなら、IE のエンコード設定を EUC に固定すると良いでしょう。
方法は、あらかじめ IE のメニューから「表示」→「エンコード」→「日本語 (EUC)」を選んでおくだけです。

できれば次は Perl の質問をしに来てください。待ってます。
582nobodyさん:2006/10/24(火) 22:19:35 ID:Aum0PYqJ
Content-type: text/html; charset=euc-jp
583nobodyさん:2006/10/24(火) 22:26:53 ID:???
>>582
「txtファイル」言うとるで?
584nobodyさん:2006/10/24(火) 22:28:54 ID:???
> EUC-JP のファイルを IE で確実に読みたいなら、IE のエンコード設定を EUC に固定すると良いでしょう。

なんで固定するの?バカじゃね?
585581:2006/10/24(火) 23:26:18 ID:???
>>584
ローカルファイルを開く場合には HTTP レスポンスヘッダによるメタ情報の供給を期待できないからです。
また HTTP 越しに text/plain なファイルを直接要求する場合であって、サーバの設定が原因で文字化けする場合には、サーバの設定変更が必要になるでしょう。
その権限が与えられていないか、または方法がわからない場合、「文字化けしないようにブラウザでファイルを開く」確実な方法はやはり >>581 で述べたとおりになります。

そろそろ Perl の質問をしてくれるとうれしいです。
586nobodyさん:2006/10/25(水) 01:27:54 ID:???
保存してエディタで開けばいい
ただそれだけじゃないか・・・
587nobodyさん:2006/10/25(水) 07:32:20 ID:???
他人にネット上で見せたいんでしょ。
588nobodyさん:2006/10/25(水) 07:42:09 ID:JgcYGtyQ
ただ出力時に見る人の環境に合わせて文字コード変換するだけでいい
589nobodyさん:2006/10/25(水) 07:45:17 ID:???
return >>583 if >>588;
590nobodyさん:2006/10/25(水) 07:46:42 ID:???
goto じゃw
591nobodyさん:2006/10/25(水) 13:09:45 ID:???
公開してるならSJISで出力するcgi組んでそこを叩かせればいい
ローカルなら画面右クリック→エンコード

文字化け相談スレはここですか?
592nobodyさん:2006/10/25(水) 14:04:42 ID:???
ひがみ根性まるだしの奴が
このスレは多いね


見てて、すっげぇ香ばしいw
593nobodyさん:2006/10/25(水) 14:15:28 ID:???
誤爆?
594nobodyさん:2006/10/25(水) 15:29:36 ID:???
VIPから出張してきてるやつがいるのな
ごくろうさまですお
595nobodyさん:2006/10/25(水) 15:46:40 ID:???
>>592

そんなの業界ではあたりまえ
プログラマでまともな性格になれるわけねーじゃん
596nobodyさん:2006/10/25(水) 15:53:43 ID:???
自演乙
質問の仕方が悪いだけ。
597nobodyさん:2006/10/25(水) 16:01:11 ID:???
VIPからキマスタ
598nobodyさん:2006/10/25(水) 16:08:37 ID:???


    VIPPERLER最強
599nobodyさん:2006/10/25(水) 16:31:24 ID:???
ν速でやれ
600nobodyさん:2006/10/25(水) 16:41:05 ID:???
このスレVIPで晒されてるんだが
601nobodyさん:2006/10/25(水) 16:58:38 ID:???
お?どこ?
602nobodyさん:2006/10/25(水) 17:34:36 ID:???
VIPからキマスタ
603nobodyさん:2006/10/25(水) 17:50:16 ID:??? BE:132469362-BRZ(3696)
遊びにきましたお
604nobodyさん:2006/10/25(水) 18:03:17 ID:???
俺も俺もwwwwうぇうwっうぇww
605nobodyさん:2006/10/25(水) 18:31:16 ID:???
VIPから来た?


         だ  か  ら  ど  う  し  た
606nobodyさん:2006/10/25(水) 18:44:41 ID:???
まあ折角来てくれたんだからお茶でもどうぞ。

つ旦
607nobodyさん:2006/10/25(水) 18:54:59 ID:???
どうみても自演だwほっとけw
608nobodyさん:2006/10/26(木) 17:17:15 ID:QapkI+o5
ファイル名の一部のみを調べて、一致するファイル全てを一度に削除する
方法はあるのでしょうか?

$delfile = "../test/test_*";
unlink($delfile)
上記ではもちろん成功しませんが、行いたい事はこのような事です。
609nobodyさん:2006/10/26(木) 17:25:48 ID:???
readdir
610nobodyさん:2006/10/26(木) 17:31:44 ID:???
unlink foreach(glob($delfile));
611nobodyさん:2006/10/26(木) 17:40:41 ID:???
open(DIR, TARGET);
while(my $file = readdir(DIR)){
 next if -d $file;

 unlink($file) if $file =~ /DELFILES/;
}
適当すぎるなこれ (;´д`)
612nobodyさん:2006/10/26(木) 17:58:01 ID:???
open じゃなくて opendir だし、対応する closedir がないので留年。
613nobodyさん:2006/10/26(木) 18:12:33 ID:???
閉じ忘れは投稿したあとには気が付いたんだけどね
614nobodyさん:2006/10/26(木) 18:41:40 ID:???
rm rf/
615nobodyさん:2006/10/26(木) 21:44:45 ID:???
掲示板に返信したら親記事が消えてしまったと言われたのですが、
以下のファイルロックでは何か不備があるのでしょうか?
フリーから取ってきた掲示板なのでファイルロックなどは良くわからないんですが・・・。

sub filelock {
foreach (1 .. 5) {
if (-e $lockfile) { sleep(1); }
else {open(LOCK,">$lockfile");close(LOCK);return;}
}
&error("只今他の方が書き込み中です。");
}
616nobodyさん:2006/10/26(木) 22:05:58 ID:???
>>615
一目でわかるほど明確な不備がある。
-e $lockfileとopen(LOCK,">$lockfile");の間に他のプロセスが割り込めて、それが検知できない。

具体的な安全な方法については色々あるからこの辺でも読んでくれ。
ttp://homepage1.nifty.com/glass/tom_neko/web/web_04.html
617nobodyさん:2006/10/26(木) 22:06:55 ID:???
>>615
ロックファイルの存在テストと作成がアトミックでないので全然だめだな。
618nobodyさん:2006/10/26(木) 22:07:31 ID:???
>>615

sub filelock {
foreach (1 .. 5) { # 以下の処理を5回繰り返す。
if (-e $lockfile) { # もし$lockfileが既に存在したら(A)
sleep(1); # 1秒待機して(A)に戻る。
} else { # そうでなければ
open(LOCK, ">$lockfile"); # $lockfileを
close(LOCK); # 作って
return; # サブルーチンを抜ける。
}
}
&error("只今他の方が書き込み中です。"); # 5秒待っても$lockfileが存在し続ける場合は諦める。
}

このサブルーチン自体に問題があるとは思えないな。
ファイルロック処理の挿入場所に問題があるかたまたま起こった事故か或いは他の何かだと思う。
というか普通はファイルロックに失敗したくらいで親記事は消えないだろう。
619nobodyさん:2006/10/26(木) 22:09:15 ID:???
あ、あれ(´・ω・)
620nobodyさん:2006/10/26(木) 22:16:33 ID:???
うわほんとだ、よく見たらifの中でファイル作って茄子。俺恥ずかし…
621nobodyさん:2006/10/26(木) 22:18:30 ID:???
こことかどうなん?

ロックファイルを考える
http://www.tryhp.net/lock.htm
622nobodyさん:2006/10/26(木) 22:26:27 ID:???
>>621
そこはやめとけ。ネタ?

623nobodyさん:2006/10/26(木) 22:44:18 ID:???
>>622
ロックファイルでググったら、これがトップだったからどうなのかな?と思って。
624nobodyさん:2006/10/26(木) 22:48:56 ID:???
【Perl】ファイルロック(排他処理)について語ろう
http://pc8.2ch.net/test/read.cgi/php/1024795138/

こっちは参考にならナイン?
625nobodyさん:2006/10/27(金) 00:05:23 ID:???
とりあえずflockしとけばいい
626615:2006/10/27(金) 00:30:08 ID:???
レスありがとうございます。
自分ではif文が程度の知識しかないのでとりあえず
>>616さん参考になんとかできないか考えて見ます。
627nobodyさん:2006/10/27(金) 00:46:20 ID:???
大学の課題で、「ある言葉を入力したらこれこれこういう言葉を返すようにしたい」プログラムを作りたいのですが上手く行きません。
サンプルはこんな感じです。

#!/usr/bin/perl
@a = ('kon','hazimemasite','gennki','gennkidesu','baka','bakatohananiyo','sayonara','jaane');

for(;;){
print "Please input sentences :";
chomp($n=<STDIN>);
if($n eq $a[0]){
print $a[1],"\n";
redo;
}elsif($n eq $a[2]){
print $a[3],"\n";
redo;
}elsif($n eq $a[4]){
print $a[5],"\n";
redo;
}elsif($n eq $a[6]){
print $a[7],"\n";
exit;
}else{
print "What is 「$n」?\n";
exit;
}
}
628627:2006/10/27(金) 00:47:04 ID:???
で、これをハッシュを使って上のプログラムと同じ実行結果にしたいのですが・・・
指定された文字を入力しても上手くいきません。

#!/usr/bin/perl
%a = ('kon','hazimemasite','gennki','gennkidesu','baka','bakatohananiyo','sayonara','jaane');

for(;;){
print "Please input sentences :";
chomp($n=<STDIN>);
if($n eq $a[0]){
print $a{kon},"\n";
redo;
}elsif($n eq $a[2]){
print $a{gennki},"\n";
redo;
}elsif($n eq $a[4]){
print $a{baka},"\n";
redo;
}elsif($n eq $a[6]){
print $a{sayonara},"\n";
exit;
}else{
print "What is 「$n」?\n";
exit;
}
}

自分ではif文内の「$a[x]」がおかしいのかなとは思ったりしてますが・・・
どなたかご教授お願いします。
629nobodyさん:2006/10/27(金) 01:17:45 ID:???
>>628
配列をハッシュにしてるんだから、
$a[0]は未定義を参照しようとしてる。
use strictすればすぐ分かる間違いなので、使い慣れておくことお勧め。
で、書き直すならこんな感じ。
#!/usr/bin/perl
%a = ('kon','hazimemasite','gennki','gennkidesu','baka','bakatohananiyo','sayonara','jaane');

while (1) {
  print 'Please input sentences :';
  chomp ( $n = <STDIN> );
  print "$a{$n}\n" if $a{$n};
  exit if $n eq 'sayonara';
  unless ($a{$n}) { print "What is 「$n」?\n" }
  redo;
}
exit;
630nobodyさん:2006/10/27(金) 01:19:02 ID:??? BE:112944454-BRZ(5753)
if (exists $a{$n}){ print $a{$n},"\n"; }
else { print "What is [$n]?\n"; }
631nobodyさん:2006/10/27(金) 01:19:03 ID:???
こっちがスマートだったか。
while (1) {
  print 'Please input sentences :';
  chomp ( $n = <STDIN> );
  print "$a{$n}\n" if $a{$n};
  unless ($a{$n}) { print "What is 「$n」?\n" }
  exit if $n eq 'sayonara';
}
632nobodyさん:2006/10/27(金) 01:30:03 ID:???
>>621
うわ。。。 いつの間にかterra大先生復活してたのか。
セキュリティホール開けっ放しのCGI配って逃亡した前歴のある人ね。
633nobodyさん:2006/10/27(金) 03:06:18 ID:???
>>629-631
ありがとうございます。usetstrict参考にします。

ですが実行するとコマンドプロンプトが終了されてしまいます。

何より、>>630
  print "$a{$n}\n" if $a{$n}; #ここと
  exit if $n eq 'sayonara';  
  unless ($a{$n}) { print "What is 「$n」?\n" } #この行

が理解できませんf- -;)

『print "$a{$n}\n";』は
「配列aの$n番目?を参照する」という意味でしょうか?
634nobodyさん:2006/10/27(金) 04:04:22 ID:???
print "$hoge{$foo}\n";

print $hoge{$foo}, "\n";

print $hoge{$foo};
print "\n";
と同じ。

print "$name君はオナニー大好き";

print $name, "君はオナニー大好き";

print $name;
print "君はオナニー大好き";
が同じであるように。
635nobodyさん:2006/10/27(金) 09:43:28 ID:???
@aは配列
%aはハッシュ
書き直したほうが見やすいかも
%a = (
  kon => 'hazimemasite',
  gennki => 'gennkidesu',
  baka => 'bakatohananiyo',
  sayonara =>'jaane'
);
$a{$n}はchomp($n=<STDIN>)より、
入力された文字をキーにしてハッシュを参照する。
636633:2006/10/27(金) 10:25:36 ID:???
>>634-635
ありがとうございます。

ですが、「chomp($n=<STDIN>)」で文字を入力する画面にすら行かず終了してしまいます
コマンドプロンプトだからいけないのでしょうか?
637633:2006/10/27(金) 12:32:36 ID:???
全角じゃ駄目なんですね・・・勉強になります


exit if $n eq 'sayonara';  
  unless ($a{$n}) { print "What is 「$n」?\n" }

この部分をもう少し無駄のある(これなら省略できるだろうってくらい)表現にするには
どうすればいいでしょうか?
出きればunlessを違う形に出来たらいいなとは思ってますが・・・

638nobodyさん:2006/10/27(金) 13:59:20 ID:???
セミコロンを省略しちゃ駄目でしょ
639nobodyさん:2006/10/27(金) 14:18:36 ID:???
>>637
if(!$a{$n}){}
>>638
{}の中では省略可能
640nobodyさん:2006/10/27(金) 15:10:04 ID:???
while (1) {
print 'Please input sentences :';
chomp ( $n=<STDIN> );
if ( $a{$n} ) { print "$a{$n}\n" }
else { print "What is 「$n」?\n" }

if ( $n eq 'sayonara' ) { last }
}
641nobodyさん:2006/10/27(金) 16:13:39 ID:???
>>639
> {}の中では省略可能
正確にはブロックの最後のステートメントな
642nobodyさん:2006/10/27(金) 16:27:26 ID:???
気持ち悪い
643nobodyさん:2006/10/27(金) 17:02:56 ID:???
大丈夫?吐いたほうが楽だよ
644nobodyさん:2006/10/27(金) 17:07:42 ID:???
初心者の俺から見ても、これ以上ないぐらいわかりやすい書き方なんだけど・・・
645633:2006/10/27(金) 21:25:59 ID:???
できました!!

>>640のがすさまじくわかりやすかったです。
最終的に
------------------------------------------------------------
%a = qw( kon konnnichiwa
gennki gennkidesu
baka bakatohananiyo
sayonara jaane
);

while (1) {
print "Please input sentences :";
chomp ( $n=<STDIN> );
if ( $a{$n} ) { print "$a{$n}\n" }
else { print "What is 「$n」?\n" }
exit if ($n eq "sayonara");
}
--------------------------------------------------------------------
と、しました。
色々と教えてくださった方、本当にありがとうございました。
646nobodyさん:2006/10/27(金) 21:43:39 ID:???
ハッシュの書き方例
%a = (
kon => 'konnnichiwa',
gennki => 'gennkidesu',
baka => 'bakatohananiyo',
sayonara => 'jaane',
);
647nobodyさん:2006/10/27(金) 21:51:05 ID:???
決して間違った書き方じゃないからいいじゃん
648nobodyさん:2006/10/27(金) 22:27:39 ID:???
他の書き方の"例"を書いただけど?
649nobodyさん:2006/10/28(土) 00:54:50 ID:???
csvからユーザIDと情報を読み込んで、自分のサーバ領域内のユーザ名.txtに反映させる
cgiを作ろうと思うのですが。

(1)forかwhileで中でcsvの一行ずつopen関数で書き込む
(2)ハッシュに一度格納しておいて後で書き込むか(foreachを使いますが)
どちらの方がサーバに負担が少ないでしょうか?

ユーザが重複している場合、後ろのやり方の方がopen関数を使うのが少なくて済みます。
650nobodyさん:2006/10/28(土) 01:13:11 ID:???
残念ながら、openでは書き込めない。
651nobodyさん:2006/10/28(土) 02:53:28 ID:???
ユーザーが何万も居て、秒間何回も実行するわけじゃないんだから好きに組めばいいじゃん
652nobodyさん:2006/10/28(土) 12:09:18 ID:???
ハッシュに格納しておいてDBI使って書き込むのがいいんじゃないでしょうか
653633:2006/10/28(土) 15:46:29 ID:???
ゼミの先生に提出したら
「お前、どっかのサイト見たんちゃうか?」って言われました・・・
まあ、その通りなんですがorz
>>627を素直に配列二つ使って表してみろといわれました。
んで、一応
----------------------------------------------------
@a = ('kon','gennki','baka','sayonara');
@b = ('hazimemasite','gennkidesu','bakatohananiyo','jaane');

for(;;){
print "Please input sentences :";
chomp($n=<STDIN>);
if($n eq $a[0]){
print $b[0],"\n";
redo;
}elsif($n eq $a[1]){
print $b[1],"\n";
redo;
}elsif($n eq $a[2]){
print $b[2],"\n";
redo;
}elsif($n eq $a[3]){
print $b[3],"\n";
exit;
}else{
print "What is 「$n」?\n";
exit;
}
}
----------------------------------------------------------
に、したのですが、もう少しまとめた感じにするにはどうすればいいでしょうか?f- -;)
654nobodyさん:2006/10/28(土) 15:56:42 ID:???
@a = qw/kon gennki baka sayonara/;
@b = qw/hazimemasite gekkidesu bakatohananiyo jaane/;

OUTER: while (1) {
print 'Please input sentences: ';
chomp($n = <STDIN>);
for ($i; $i <= @a ; $i++) {
if ($n = $a[$i]) {
print $b[$i];
redo OUTER;
}
}
print "What is $n?\n";
exit;
}

がんばって自分で書けよ。そのほうがお前のためだ。
655nobodyさん:2006/10/28(土) 15:58:05 ID:???
>>653
宿題だったのかよw 金輪際きくなw

ヒントとしては、@a と @b から %a 作ればおk
656nobodyさん:2006/10/28(土) 19:05:34 ID:???
>>655
>>627

それでもヒントを出すお前が好きだ。
657nobodyさん:2006/11/01(水) 03:26:38 ID:???
ttp://www.dab.hi-ho.ne.jp/sasa/biboroku/perl/session.html
を参考にして、CGI::Sessionを使用したシステムを組んでるのですが、
.sessionフォルダのcgisess_セッションidファイルがたまっていく一方です。
これをうまく消す方法は無いのでしょうか?
658nobodyさん:2006/11/01(水) 11:24:25 ID:???
cronか必ずアクセスするcgiから時間見て消す
659657:2006/11/01(水) 12:17:05 ID:???
>>658
うーん やっぱり、そういう手法しかないんですかねー
660nobodyさん:2006/11/01(水) 13:05:08 ID:???
ぐぐれ
661nobodyさん:2006/11/01(水) 21:01:16 ID:???
コマンドプロンプトから環境変数を見てもIPアドレスが出てこない
のはなぜなんでしょうか?
662nobodyさん:2006/11/01(水) 21:22:05 ID:???
氏ねよお前www
663nobodyさん:2006/11/01(水) 21:46:50 ID:???
>>661
スタンドアロンでの起動って事?
端末間の通信って事ならソケットに何かあったような希ガス
664657:2006/11/01(水) 23:34:18 ID:???
opendir(SESSDIR, "./.session");
my @filelist = readdir(SESSDIR);
closedir(SESSDIR);

foreach (@filelist) {
if (/^cgisess_(\w)+$/ && $1 ne $sid) {
unlink("./.session/$_");
}
}

多分これで解決しました
665657:2006/11/01(水) 23:35:57 ID:???
あ、同時にログインするユーザーは1人だけのものを想定してたので……
666nobodyさん:2006/11/02(木) 00:17:07 ID:???
え?CGI::Sessionってセッションファイルの後始末しないの?
クソじゃん
667nobodyさん:2006/11/02(木) 01:22:11 ID:???
>>664
今回は確認が不要だったようだけれど、
ちゃんと有効期限を管理するなら、掃除するためのモジュールもあるよん
http://search.cpan.org/~rsavage/CGI-Session-ExpireSessions-1.08/lib/CGI/Session/ExpireSessions.pm
668nobodyさん:2006/11/02(木) 14:41:12 ID:CDbXzZTv
一日以上更新されてないディレクトリとそのディレクトリに入ってるファイルを一括して削除するperlスクリプトが欲しいんですが、
どういう風に書いたらいいのか全く想像も付きません。どうか作っていただけないでしょうか?
669nobodyさん:2006/11/02(木) 14:52:52 ID:???
ここは質問スレ
670nobodyさん:2006/11/02(木) 15:06:31 ID:???
>>668
Perlでリクに答えるスクリプトを作るスレ
ttp://pc8.2ch.net/test/read.cgi/tech/1086143976/
671nobodyさん:2006/11/02(木) 15:14:36 ID:???
作っていただけないでしょうか? ってのが質問なんだろ。
672nobodyさん:2006/11/02(木) 15:25:31 ID:???
ここは質問スレ?ってのが質問なんだろ。
673661:2006/11/02(木) 21:04:15 ID:???
>>662
 すみませんわかりにくくて。

ttp://pc8.2ch.net/test/read.cgi/php/1137614836/l50#tag230

これをローカルで実験したくてperl5.6.1をダウンロードしてきてまず
while(($key,$value)=each(%ENV)){print "$key=$value\n";}
をコマンドプロンプトで実行したのですがIPアドレスとかが出ません。
web上でやったらうまくいったのですが、関数に制限があるらしく
BBQの方は試せません。どうやったらローカルでできるのでしょうか。
674nobodyさん:2006/11/02(木) 22:00:31 ID:???
>>673
>>663を無視するな

というか、押したら開かないドアを引いたら開きました。どうやれば押したら開きますか?って質問してるんだぞ。
675661:2006/11/02(木) 23:06:07 ID:???
>>674
いまだに例えの意味がわかっていないのですが
use strict;
use Socket;
を入れたらBBQが動くのを確認できました。ヒントありがとうございました。
676nobodyさん:2006/11/02(木) 23:39:27 ID:???
>>675
自分で出来ない理由をしっかり書いておいて、なぜ出来ないかを聞いてたから。

まぁ、動いたなら一歩前進だ。乙。
677nobodyさん:2006/11/03(金) 19:30:08 ID:4xbbPPPU
こんばんは。質問です。
現在ホームページを作っていて、CGIでHTMLとCSSとJavaScriptを出力しようと思っているんですが。
何故かエラーが出ます。
因みに出力の方法はヒアドキュメントでくくって出力しています。
エスケープの問題でしょうか?
それともCGIスクリプトの中にJavaScriptを記述すること自体が不可能なんでしょうか?
どなたか教えてください。
678nobodyさん:2006/11/03(金) 19:51:29 ID:???
>>643
これでいいんか?

open my $fh, ">>count.dat";
print $fh "\n";
close $fh;
print "Content-Type: text/plain\n\n";
print -s "count.dat";
679nobodyさん:2006/11/03(金) 19:52:45 ID:???
>>678は誤爆スマヌ
680nobodyさん:2006/11/03(金) 19:59:44 ID:???
>>668
sub{$_[0]->(@_)}->(sub{
my($code,$path,$del)=@_;
if(-d $path){
my $del2 = time-(stat$path)[9]>60*60*24;
opendir my $dh,$path;
while(my $dir = readdir $dh){
if($dir ne '.' && $dir ne '..'){
$code->($code,"$path/$dir",$del2);
}
}
closedir $dh;
rmdir $path if $del2;
}else{
unlink $path if $del;
}
},$_) for @ARGV;
681nobodyさん:2006/11/03(金) 20:11:29 ID:???
>677
とりあえずコード晒してみ?
682nobodyさん:2006/11/03(金) 20:19:39 ID:4xbbPPPU
>>681
長すぎてここには貼れません。
とりあえずCGIでJacaScriptが出力可能かどうか教えてください。
683nobodyさん:2006/11/03(金) 20:25:52 ID:QgsncqtF
>>682
Javascriptといってもただのテキストデータだろ
もちろん可能
684nobodyさん:2006/11/03(金) 20:37:01 ID:???
どうせ単にエスケープのミスしてるだけだろ。
$とか@とか%とか\とか。全部確認してみな。
685nobodyさん:2006/11/03(金) 23:05:08 ID:???
>>677
エラーというのが、perl実行時のエラーなのか。
ブラウザに出力はされるが、javascriptの実行エラーなのか。
どんなエラーなのか。エラーメッセージはなにか。
ヒアドキュメントの内部で出ているエラーなのか。
などをまずは書きなされ。
「なぜかエラーが出る」といいなさるが、
プログラムは、意図したとおりにではなく、書いたとおりに動くのじゃ。
686nobodyさん:2006/11/04(土) 00:20:52 ID:h08SADSk
意図した通りに動かない。これを「なぜか」と表現。
エラーメッセージはline5に書かれたヒアドキュメント
print >>END;
の部分。恐らく既に上がっているがエスケープをしてない文字列によるもののエラー。
実はエスケープは全くしてなかったのでerrorになるのは必然。
今回ここで聞きたかったのはそこではなくCGIでもJavaScriptは動くだろうというあやふやな知識を
確立しはたかった為。
問題は解決された。協力してくれた諸君に感謝する。
687nobodyさん:2006/11/04(土) 03:39:17 ID:P6wQxe1H
sjisに変換する処理なのですが、Jcodeを使って下記のようにしています。

$value2 = Jcode::convert(\$value1, 'sjis');

これを、Encodeを使って書き直したいのですが、上記のように変換前の文字コード
を指定せずに処理する方法がわかりません。
検索して探したりしてみると、たとえば、utf8からeuc-jpに変換するコードとして、
Encode::from_to($text, "utf8", "euc-jp" );
などといったものがありますが、第一引数(この場合utf8)を省略しての記述方法
はありませんでしょうか?
688nobodyさん:2006/11/04(土) 03:51:21 ID:???
>>687
Encode::Guess
省略というかエンコーディング名に"Guess"を指定する
689nobodyさん:2006/11/04(土) 04:26:21 ID:???
>>688
とりあえずうまくいったようです。
ありがとうございました!
690nobodyさん:2006/11/04(土) 13:39:03 ID:???
php で HTMLのヘッダーなどを require_once するようなことを、Perl でやりたいと考えています。
理由は、今まで Perl + SSI でやっていたので、2重に実行環境が呼び出されて負荷が高いと思われるので、(SSIの負荷はPerlに比べれば少ないですが) Perlのみでやってみたいからです。

----- test.cgi -----
#!/usr/bin/perl
print 'Content-Type: text/html' . "\n\n";
require 'test.html';
exit;

----- test.html -----
print << '_HTML_';
<html>
<head>
<title>テスト</title>
</head>
<body>
<h1>テスト</h1>
<p>ちゃんと表示されるかな。</p>
</body>
</html>
_HTML_
1;

ヒアドキュメント部分を print << "_HTML_"; では無く、print << "_HTML_"; にしたら、
文字コードが Shift_JIS であっても、駄目文字が使えてこのままでも結構いいのですが、
test.html に HTML以外のPerl命令 (上1行と下2行) をいれないといけないのが、
美しくないかなーと思いまして。

綺麗なコードでこのようなことをやる方法をご存知の方がいたら教えてください。
691nobodyさん:2006/11/04(土) 13:52:42 ID:???
HTML::Templete
692nobodyさん:2006/11/04(土) 13:58:02 ID:???
>>690
意図が今一つかめんのだが以下の方法じゃあかんのか?
----- test.cgi -----
#!/usr/bin/perl
print 'Content-Type: text/html' . "\n\n";
print <DATA> ;
__DATA__
<html>
<head>
<title>テスト</title>
</head>
<body>
<h1>テスト</h1>
<p>ちゃんと表示されるかな。</p>
</body>
</html>
693690:2006/11/04(土) 14:05:18 ID:???
>>691
ありがとうございます。
そのモジュールにも興味が出てきたので、機会があったら使ってみます。

>>692
多数のCGI (とHTMLファイルに含まれるSSI) から include したいので、別ファイルにしたいと思ってたんです。
教えていただいた通りのコードで、やりたいことができそうです。
ありがとうございました。

----- test.cgi -----
#!/usr/bin/perl
print 'Content-Type: text/html' . "\n\n";
open DATA "test.html";
print <DATA>;
exit;

----- test.html -----
<html>
<head>
<title>テスト</title>
</head>
<body>
<h1>テスト</h1>
<p>ちゃんと表示されるかな。</p>
</body>
</html>
694nobodyさん:2006/11/04(土) 14:09:19 ID:???
そういや、ファイルを開く目的では open じゃなくて sysopen 使えって話もあるんですが、どうなんでしょう。

http://www.ipa.go.jp/security/awareness/vendor/programming/a04_01_main.html

負荷が同じ程度なら sysopen でもいいですが、OSの関数ダイレクトってことなので
sysopenのが重いんじゃないかな、と思ったんだけどちゃうかな
695690:2006/11/04(土) 14:44:33 ID:???
実行したらエラーにorz
test.cgi のソースに問題があったようです。

修正版は次の通りです。

----- test.cgi -----
#!/usr/bin/perl

print 'Content-Type: text/html' . "\n\n";

open(DATA, "< test.html");
print <DATA>;
close(DATA);

exit;

696nobodyさん:2006/11/04(土) 17:03:05 ID:???
>>694
結局どちらもOSのopenに行くところは一緒で余計な機能がない分
sysopenの方が軽いともいえるが普通は気にするほどの差はない。

しかしこれ書いた人3引数open知らないのだろうか?
697nobodyさん:2006/11/04(土) 21:40:25 ID:foW9asSJ
ホームページをcgiで全てのページを表示していますが、
mixiのようにhttp://〜.plの様にしたいのです。
そのままperlを表示しようとするとダウンロードになったしまいます。
よろしくお願いいたします。
698nobodyさん:2006/11/04(土) 21:54:00 ID:???
>>697
それはPerlではなくサーバー側の設定によります。
例えば Apache の場合 .htaccess で設定できる可能性があります。
詳しい方法は、検索するなり、お使いのサーバーソフトウェアのスレにいくなり、
借りているウェブスペースの管理者に問い合わせるなりしましょう。
699nobodyさん:2006/11/04(土) 22:59:12 ID:foW9asSJ
>>698 さん
有難うございます。
結構調べたんですが、全く出てきませんでした。
サーバーはApacheなんで調べてみます。
700nobodyさん:2006/11/04(土) 23:31:40 ID:???
つ AddHandler cgi-script .cgi .pl
701nobodyさん:2006/11/06(月) 14:38:08 ID:???
アクセスの多いサイト (10万PV/day) で CGI のマルチバイトXSS対策したらその時期から負荷(uptime) が一気に倍近くなりました。
(因果関係はまだはっきりしていませんが、時期が一致したし、CGIの負荷が増えたと思われるので、その可能性が高いと考えてます。)
Perl のバージョンは v5.8.6 で OS は Fedora Core 4 です。

CGI に加えたコードは、モジュール "Encode" の読み込み (use Encode;) と、
POST時に送信されたデータに対して "$_ = encode('sjis', decode('sjis', $_));" を加えたぐらいです。
後者のロジックではせいぜい10程度のデータに対して encode と decode をしているだけだし POST数はそんな多くないんで、
"use Encode;" が負荷の原因だと思われます。

DoCoMoのケータイからのアクセスで最後の方に Shift_JIS として不正なデータが含まれてしまったりすることもあるんで、(DoCoMoのブラウザのバグか電波が不安定なのかは知りません。)
Shift_JISとして不正なデータが含まれた場合にも「エラー処理」でなく「不正な文字列の削除(エスケープ)」としての対処を行いたいです。

"use Encode;" を使わずに、低負荷でこの処理を行う方法はないでしょうか?
>>116 で大丈夫ですかね。
702nobodyさん:2006/11/06(月) 15:51:19 ID:???
>>701
> CGI のマルチバイトXSS対策
前スレか前々スレでその話題があったので参考にするとよろし
703nobodyさん:2006/11/06(月) 16:04:47 ID:???
>>701
たとえ10万PV/dayであろうとも、POST数がそんなに多くないのならCGIの負荷が
多少かわったところで影響は大きくなさそうなものだ。それともPOST以外でも
CGIがkickされまくっていて不要なuse Encodeをしているという話だろうか??

性能問題は本当に性能のボトルネックになってるところを突き止めて対策しないと
骨折り損になるよ。
704nobodyさん:2006/11/06(月) 16:18:18 ID:???
「不正な文字コードが見つかれば、以降の文字はすべて無効」でOKなら116で問題ないかと。
場合によっては \t \r \n も不正な文字として扱う必要があるかもしれないけど。

use Encodeって結構コストが高いからなぁ。
まぁ、因果関係がまだはっきりしてないんだったら、もう少し調べてみたほうがよいかもね。
705nobodyさん:2006/11/06(月) 16:30:09 ID:???
ちょいと調べてみたがuse EncodingはうちのP3-1GHzといういささか時代遅れなPCで50msぐらい
CPU食うようだ。これはちょうどuse CGIと同じぐらい。無視できる量ではないがとてつもなく大きい
わけでもないな。もとがぎりぎりならきびしいかもしれないが。
706nobodyさん:2006/11/06(月) 16:30:59 ID:???
ごめん、use Encodingじゃなくてuse Encode。
707nobodyさん:2006/11/06(月) 16:51:09 ID:???
Win+Active Perlで、コマンドプロンプトを開いて、
Encode、Jcode、CGI、GD、IO::Handle、Time::HiRes…
とどんどんuseしていくと一気に遅くなるのが分かる
708nobodyさん:2006/11/06(月) 17:10:00 ID:???
これでTemplate Toolkitなんか使った日にはCGIじゃ重すぎなわけだが、
モジュール削って不便なプログラミングで苦労するよりはmod_perlなり
fastcgiなり使ったほうが幸せになれる気がする。
709701:2006/11/06(月) 17:45:18 ID:???
>>702
このスレにあったようなので読みました。

>>703
> それともPOST以外でもCGIがkickされまくっていて不要なuse Encodeをしているという話だろうか??
#!/usr/bin/perl の次の行で use Encode; をしています。(10万PV/日の CGIで)

マルチバイトXSSの対策前の部分で use Encode; しても大丈夫なんでしょうか? 試してみます。
use は一番上でやるもんだと思ってました。

ただ、ループ内でやると、use Encode が何度も実行されることになるので、変数でフラグたてて1回のみやるようにしてみますね。
それでうまく動かなかったら正規表現でやってみます。


> 性能問題は本当に性能のボトルネックになってるところを突き止めて対策しないと
> 骨折り損になるよ。
ですね。
さっき当該部分(マルチバイトXSS対策)のコードを消してしばらく動かしているんですが、負荷は少し減っているような気がします
グラフのデータが少なくてまだ確実とはいえないので、1日ぐらいこのまま動かしてMRTGのグラフで比較してみますね。

>>705
もとがぎりぎりではないんですが、MRTGのグラフ (Load Average 5min 15min) でいままでピークでも60%ぐらいが上限だったのに、
ピークで100%ぐらいにいくようになったんです。面積をよくみると、2倍まではいってなくて、もとの1.5倍ぐらいかも。

>>707
なるほど

>>708
自分が作ったのではないコードが含まれていてぐちゃぐちゃなので mod_perl はきびしそうです
グローバル変数多用、同じようなコードを関数を使わずに何度もかいていたり同じエスケープ処理を何箇所かでやってたりで
とにかくぐちゃぐちゃです;;
710nobodyさん:2006/11/06(月) 17:58:01 ID:???
>>709
CGIはたくさん起動されているが本当にEncodeモジュールを必要とする場合が少ないのならば、
確かにもったいないね。可能なら機能ごとに別のプログラムに分離したほうがいいんじゃないか
とも思うが、いまさらそれも無理なら小手先の対策として、Encodeモジュールを必要とするとき
のみuseするのがいいだろう。

ただし普通にuse書いてしまうとどこに書いてあっても最初にプログラム読み込むときにuseされて
しまうので、必要なときだけ eval 'use Encode;';するのがいいと思われる。ブロックではなく
文字列のevalを使うのが肝。
711nobodyさん:2006/11/06(月) 20:29:39 ID:???
>>701
これはPHPの中の人のブログだが、一度読んでおくことを勧める
ttp://blog.ohgaki.net/index.php/yohgaki/2006/06/12/
712701:2006/11/06(月) 20:56:58 ID:???
>>711
レスありがとうございます。
教えていただいたサイトを読ませていただきました。

不正なデータを 「サニタイズ」 した結果、他の有害なデータになってしまうということは良くありますね。
上位のファイルの読み出しを禁止するために 「../」 を削除するコードにしたら、「..././」 → 「../」 となってしまうというのが有名な例です。
こういった問題が発生しないよう良く考えてみることにします。

不正な文字コードが含まれていたらエラーを返す、というのが理想かもしれませんが、それをやるとアクセシビリティ上の問題が発生してしまいます。
例えば、そのサイトで推奨している mb_check_encoding 関数の場合でもそうですが、「@」とか「T」が含まれていただけでも、エラーになりますし、
ケータイからですと顔文字が1つ含まれただけでエラーになります。(Shift_JISの場合に確認、他の文字コードでも発生すると思われます。)

データベースは使っていないし、データベースについての知識はないのでそれについては分かりませんが、HTMLとして出力したりファイルに出力したりする
普通のCGIで入力段階 (他のチェック前) で不正な文字列を 「削除」 した場合には、発生するおそれのある脆弱性がおもいあたりません。
勿論、他のチェックのあとでやればそれによって、他のチェックが無効になり危険ですが…。
713nobodyさん:2006/11/06(月) 21:21:16 ID:???
壊れた文字は「絶対」に削除しない。ってのは誤解を招きそうな表現だね。
正常な文字以外は通すな。
削除しただけで正常な文字になると思うな。
って、言いたかったんでないかの。

文字コードのチェック→(不正文字は排除済みとみなした上で)サニタイズ。
この流れで十分でしょう。
714701:2006/11/06(月) 21:31:38 ID:???
>>713
解説ありがとうございます

UTF-8 の構造は複雑でまだ理解できていませんが、Shift_JIS や EUC-JP の場合には
バイナリレベルで 「2バイトで1文字となる範囲のバイナリデータが1文字目にある(単独で存在する)」 場合にそれを削除すれば、
マルチバイトでのXSS問題に限れば完璧に回避できますね。(2バイト連結文字の1バイト目の文字がなければ問題は発生するわけがないので。)
また、1バイト=8bit を区切りにして操作を行えば、削除によってまた他の不正なマルチバイト文字列ができあがることはないはずです。

715nobodyさん:2006/11/06(月) 22:54:18 ID:???
eucには3バイト文字もあるわけだが
716nobodyさん:2006/11/07(火) 00:30:07 ID:???
○の1をEUCにすると3バイトじゃなかったか

XSS脆弱性はそんなに単純じゃない。たとえば、0x5Cの問題。
717nobodyさん:2006/11/07(火) 20:13:30 ID:???
>>716
> たとえば、0x5Cの問題。
それについて興味があるので詳細を教えていただけないでしょうか?
もし、無理ならば Shift_JIS の問題か EUC-JP の問題かだけでも教えていただけたらさいわいです。
718nobodyさん:2006/11/07(火) 20:50:37 ID:???
0x5C でググれ
719nobodyさん:2006/11/07(火) 22:21:56 ID:???
ありえないぐらい低レベル
720nobodyさん:2006/11/07(火) 23:25:16 ID:???
初心者質問スレなんだからイインダヨ
721701:2006/11/08(水) 00:25:38 ID:???
>>715-716
EUC-JPには3バイト文字もあったんですか・・・。
EUC-JPに関する知識が不十分で申し訳ありませんでした。
お詫び申し上げます。
722nobodyさん:2006/11/08(水) 00:31:45 ID:???
謝る必要はないだろ…
723nobodyさん:2006/11/08(水) 00:34:30 ID:???
>>716
> XSS脆弱性はそんなに単純じゃない。たとえば、0x5Cの問題。

0x5C 問題 (表示が文字化けするなど) は、XSS (マルチバイト文字列でのXSSも含む) には全く関係ないと思うんですけど・・・。
そもそもこの問題は、エスケープシーケンス (\) が解釈される場所のみで問題が発生するわけで、エスケープシーケンスを解釈しないWebブラウザでは問題無いですよね。

そして、エスケープシーケンスを解釈するブラウザなんて見たことないし、あったとしたら問題です。
<strong>この商品は \1000だよ</strong> って書いただけで不具合起こすんです?

データベースなどのエスケープシーケンスを解釈する場所に、>>714 の処理をしたデータを突っ込んだ場合には問題は発生するかもしれないけど、Perl単独ではありえない。
(ファイルに出力したPerl文を実行するなどの特殊な場合を除く)

$hoge = "テスト\\"; // $hoge に "test\" が入る。
print "$hoge"; // $hoge を出力する。

たとえば、こう書いた場合に、$hoge が test\ に書き換わって、
print "test\";
となって、" が排除されエラーになることはないからね。

「2バイトで1文字となる範囲のバイナリデータが1文字目にある(単独で存在する)」 場合にそれを削除 でマルチバイトXSS問題は完璧に解決すると思う。(Shift_JIS限定)
不正な1バイトデータが残ったところで、それがマルチバイトとして扱われることはないから、問題ない。
724723:2006/11/08(水) 00:36:38 ID:???
もちろん、DBの連携なども考えれば、不正な文字列が少しでも含まれていたらエラーを返すのが理想ですね
725nobodyさん:2006/11/08(水) 01:29:59 ID:???
簡易HTTPブラウザを作っています。
以下のHTMLを受け取った時に解析して 送信 を送信するといった処理を望んでいますが、
今のソースでは 取り消し が送信されます。
送信、取り消しの違いはokの有無ですが、これを区別する方法を教えてください。

<FORM ACTION="hoge.cgi" method="POST">
<INPUT TYPE=HIDDEN NAME=huga VALUE="huge">
<INPUT TYPE=SUBMIT NAME=ok VALUE="送信">
<INPUT TYPE=SUBMIT VALUE="取り消し">
</FORM>

use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
$string = "上のHTML";
$url = 'http://hoge/hoge.cgi';
$string =~ /NAME=huga\sVALUE="(.*?)"/;
%formdata = ('huga' => $1);
$ua = LWP::UserAgent->new;
$req = POST($url, [%formdata]);
res = $ua->request($req);
726nobodyさん:2006/11/08(水) 03:11:43 ID:Z752EjWS
>>725
すまん。質問の意味わかんね
727nobodyさん:2006/11/08(水) 04:32:08 ID:CtUHOCOJ
$string =~ /NAME=huga\sVALUE="(.*?)"/;
%formdataはhugeが入ってるんじゃね?
728725:2006/11/08(水) 04:32:26 ID:x1PlsJ4C
>>726
submitボタンが複数ある時の選択方法を教えてください。
729725:2006/11/08(水) 04:33:59 ID:???
>>727
はい。そうです。
730nobodyさん:2006/11/08(水) 04:38:11 ID:???
>>728
prog板から来たよんw

submitも普通のエレメントと一緒だよ。
nameがあってvalueがある。
submitの場合は押された部品のname&valueが渡される。
押されていないsubmitは渡されない。

この説明で分かるかしら。
731725:2006/11/08(水) 04:43:05 ID:x1PlsJ4C
>>730
できましたw
ありがとうございました。
732nobodyさん:2006/11/08(水) 04:46:44 ID:???
ある画像掲示板に画像を自動アップロードするスクリプトを作っています。

例として、http://some.kind.of.uploader/upload.phpのページにある
<form enctype="multipart/form-data" action="upload.php" method="post">
<input type="file" name="userfile" size=50>
<input type="submit" value="SUBMIT">
</form>
というフォームに対して、ローカルの/path/to/file/にあるtest.jpgをアップロードす
るとします。
my $url = 'http://some.kind.of.uploader/upload.php';
my $ua = LWP::UserAgent->new();
my $response = $ua->post($url, ['userfile' => '/path/to/file/test.jpg']);
としてみましたがうまくアップロードできません。
できない理由として考えられることは何がありますでしょうか?
また、同様の趣旨でもっといい方法がありましたら御教授お願いします。
733nobodyさん:2006/11/08(水) 05:34:44 ID:???
どう、うまくないのかを書け。
つ php.ini
734nobodyさん:2006/11/08(水) 06:47:20 ID:???
>>732
ファイルデータじゃなくて"/path/to/file/test.jpg"って文字列で飛んでるんじゃ
735nobodyさん:2006/11/08(水) 08:08:20 ID:???
>>733
サーバーからのメッセージとしては、手動で行なった場合にファイル名を入力しなかっ
たのと同じ「アップロードするファイルを入力してください」というものです。

>>734
そんな感じですね。

と、言うわけで自己解決しました。requestを使用します。
my $file = '/path/to/file/test.png';
my $response = $ua->request(POST $url,
Content_Type => 'form-data',
Content => ['userfile' => [$file]]
);
736nobodyさん:2006/11/08(水) 22:57:15 ID:???
特定のIPを拒否したい場合に以下を記述したら一応機能したんですけど、
何か問題ありますか?


@deny = ("0.0.0.0","1.1.1.1");
$addr = $ENV{'REMOTE_ADDR'};

foreach $ip (@deny) {
     if ($addr eq $ip) {print "エラー";
     last;}
}
737nobodyさん:2006/11/08(水) 23:08:19 ID:???
my $addr = $ENV{'REMOTE_ADDR'};
my @deny = (
"0.0.0.0",
"1.1.1.1",
);

foreach my $ip (@deny) {
if ($addr eq $ip) {
print "error";
last;
}
}
738nobodyさん:2006/11/08(水) 23:17:40 ID:???
http://www.futomi.com/lecture/local/ これですな

Perl5以降は local でなくて my を使うのが推奨されているようだ
739736:2006/11/08(水) 23:41:20 ID:???
|
|⌒σ   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
|冫、) < >>737-738 ありがとう。 |
|` /    \_________/
|  |
|/| |
| ∪
|

|  / ̄ ̄ ̄ ̄\
|<  さらばじゃ |
|  \____/
|)彡 サッ
|
|
|
|
740nobodyさん:2006/11/08(水) 23:51:59 ID:???
禁止IPが多いなら、ハッシュ使った方がよさそう

my %deny = (
  "0.0.0.0" => 1,
  "1.1.1.1" => 1,
);
if ($deny{ $ENV{'REMOTE_ADDR'} }) {
  print "error";
  last;
}
741nobodyさん:2006/11/08(水) 23:57:39 ID:???
ハッシュだとlast;が不要な予感。
742nobodyさん:2006/11/09(木) 00:02:09 ID:???
exitと書きたかったんだろ
743nobodyさん:2006/11/09(木) 09:09:18 ID:???
CGIでprint "error"だけなのには誰も突っ込まないのか?
744nobodyさん:2006/11/09(木) 10:28:57 ID:???
そこまで面倒見きれんw
745nobodyさん:2006/11/09(木) 15:33:45 ID:???
$deny = '0.0.0.0/1.1.1.1';
error() if index($deny, $ENV{REMOTE_ADDR}) >= 0;
746nobodyさん:2006/11/09(木) 18:25:08 ID:???
|
|⌒σ  
|冫、)
|` / 
|  |
|/| |
| ∪
|
747nobodyさん:2006/11/09(木) 19:33:08 ID:???
コーディングとはちょっと違うんですが・・・
WindowsでGDを使いたいのですが、同時にインストール必要なモジュールって他にありますか?
ppmでGDをインストールして、サンプルを参考に
画像を読み込んで表示するだけのスクリプトを書いてみたのですが
GD::Imageで指定したサイズの黒い四角は表示されるものの、画像そのものは表示されません。
UNIXでは他にも複数のライブラリのインスコが必要という記事を見つけたので調べているんですが
Windows(ActivePerl)ではどうなんでしょうか。
748nobodyさん:2006/11/09(木) 19:36:56 ID:???
確かMRTGはGD突っ込んで難なく動いてたから、それを参考にしてみれば?
749nobodyさん:2006/11/09(木) 19:37:47 ID:???
あっ、ごめん。
MRTGでグラフを書いてるのはEXEバイナリだったorz
750nobodyさん:2006/11/09(木) 20:23:24 ID:???
うちでは普通に動いてるし、入れ方かサンプルソースが悪いんじや?
751701:2006/11/09(木) 20:52:58 ID:???
ご回答いただきありがとうございます。

use Encode; と $_ = encode('sjis', decode('sjis', $_)); を外しただけで、
サーバ全体の負荷(5min, 15min uptime) が MRTG のグラフで目視して明らかに分かる程度に減ったので、
CGI負荷の増大の原因はそれにあったことがほぼ決定しました。

>>116 の方法を採用してみます。
752747:2006/11/09(木) 20:56:36 ID:???
>>748-749
どもです。余裕見て参照してみます。

>>750
ホントですかー。動いてるんですね。
でもそれがわかっただけでも大助かりです。
おかげで絞り込めてきましたので、なお見直してみます。
ありがとうございました!
753701:2006/11/09(木) 21:29:43 ID:???
実際に >>116 の方法を実装してみました。

>>704
> 「不正な文字コードが見つかれば、以降の文字はすべて無効」でOKなら116で問題ないかと。
とありましたが、

116の方法では、不正な文字列(マルチバイト文字列の1バイト目が単独で存在) が 文の中央付近に入っていた場合でも、
その不正な文字列の除去のみが行われて、それ以降の文字列は正常に受け取れました。
(※不正な文字列はきちんと除去されていました。)

ちなみに、$_ = encode('sjis', decode('sjis', $_)); 方式と違って、丸付き文字 @AB なども正常に受け取れるようです。
(よいか悪いかは別にして…)

負荷の問題はもうちょっと運用してみて結果が出たら報告させていただきます。

回答してくださったみなさまありがとうございました
754nobodyさん:2006/11/09(木) 22:17:24 ID:3KxQ4Dio
すでに動作しているコードを、-wオプションをつけて修正してるのですが、
local宣言して別パッケージから参照している変数がtypoと言われて
しまいます。

現在、
> local $main::upload_dir = './attach_file/';

と書いてあるものを

> local $main::upload_dir;
> $main::upload_dir = './attach_file/';

とすると警告が出なくなります。typoだけ警告をきるようなことは可能でしょうか。
よろしくお願いします!
755nobodyさん:2006/11/09(木) 22:18:46 ID:???
>>752
ごめん、>>748-749は本当に無視して〜orz 時間ももったいないし。
756nobodyさん:2006/11/10(金) 05:24:46 ID:???
perlで会員全員にメールを送信したいのですが、sendmailで送信した場合負荷はどのくらいかかるのでしょうか。

プログラムの概要は、
フォルダ内の「会員ID.txt」(中身はメールアドレス)をopendirで会員IDの配列を作る。
forの中で、open(会員ID)→メールアドレス格納→sendmailで送信。
会員IDの配列分だけ繰り返し。

といった感じです。

メールの内容にも会員IDを埋め込みたいのでこのような方法にしています。

ブラウザからアクセスして実行してみましたが、現在会員数は20人足らずにもかかわらず
少し重そうだったので他にいい方法はないかと質問させていただきました。
757nobodyさん:2006/11/10(金) 08:34:04 ID:???
それは負荷がかかってるわけじゃない 時間がかかってるだけ
送信先メールサーバの名前解決をしてユーザがそんざいするかとか
今送れるかどうか問い合わせたり
相手が忙しいと待たされたり
とにかくメール送信が負荷よりも時間のほうがかかる
もし自サーバになんらかの負荷がかかってればsendmailは自動的に待ち状態になる設定になってるはず
758nobodyさん:2006/11/10(金) 09:16:39 ID:???
>>754
no warnings 'once';
759nobodyさん:2006/11/10(金) 15:57:59 ID:???
>>757
なるほど。ありがとうございました。
760nobodyさん:2006/11/10(金) 23:09:40 ID:???
>>758 ありがとうございます!!
761nobodyさん:2006/11/11(土) 17:04:01 ID:jBOZHEcG
ファイルハンドルからファイル名をgetする方法を押しててください。
762nobodyさん:2006/11/11(土) 18:16:33 ID:???
うんとこしょー!(押
763nobodyさん:2006/11/11(土) 18:37:34 ID:???
そもそもファイル名もわからないファイルハンドル使う処理があるのか?
764nobodyさん:2006/11/11(土) 18:45:16 ID:???
□ orz
765nobodyさん:2006/11/11(土) 19:51:38 ID:???
どんなファイルを開いてるか不明になれるのか?
それはそれですげぇな
766nobodyさん:2006/11/11(土) 20:25:29 ID:???
>>761
発想を変えて、open したファイル名を保存しておいてはどうかな。
うーん、ぼくってしんせつ!
767766:2006/11/11(土) 20:43:59 ID:???
で、それもやってくれる FileHandle::Deluxe を CPAN からインストール。
768nobodyさん:2006/11/11(土) 20:44:20 ID:???
statすればデバイスとinode番号がわかるので、File::Findを使うなりして
探せばわからなくもない。ただしopenしたあとに削除されてたらアウト。
769nobodyさん:2006/11/11(土) 21:39:58 ID:srC1L817
$foo->hoge(
   aaa => @aaa,
   bbb => @bbb,
   ccc => @ccc
);

のように、fooオブジェクトのhogeメソッドに配列を渡す時、

sub hoge {
   my $self = shift;
   my %args = @_;

   $self->{aaa} = ?; // @aaaを入れたい
   $self->{bbb} = ?; // @bbbを入れたい
   $self->{ccc} = ?; // @cccを入れたい
   ・
   ・
   ・
}

とした場合、%argsからどのようにして@aaa、@bbb、@cccを受け取るのでしょうか。
770nobodyさん:2006/11/11(土) 21:51:54 ID:???
いや、それもう呼び出し方からしてダメだし。

$foo->hoge(
 {
  aaa => ¥@aaa,
  bbb => ¥@bbb,
  ccc => ¥@ccc
 }
);

sub hoge {
 my $self = shift;
 my $args = shift;
 $self->{aaa} = $args->{aaa};
 ・
 ・
}

まあ実際の処理ではこんな事しないと思うよ。
してたら設計ミスを疑った方が。
771nobodyさん:2006/11/11(土) 21:59:26 ID:???
別にハッシュのリファレンスとして渡す必要はないような。

my $self = shift;
my %args = @_;
$self->{aaa} = $args{aaa};
772nobodyさん:2006/11/11(土) 22:01:07 ID:srC1L817
>>770
ありがとうございます。
では、OOPにおいてメソッドの呼び出し時に配列を渡す場合の受け渡しはどうなるのでしょうか?m(_ _)m
773nobodyさん:2006/11/11(土) 22:04:15 ID:srC1L817
>>771
ありがとうございます。
その方法は試しましたが、受け取り側($self->{aaa})が配列の要素数を受け取ってしまいました。。。
774nobodyさん:2006/11/11(土) 22:15:26 ID:dAHcCPkr
残念だが>>771はうまくいかない。
>>772
>>770のとおりで良いと思う。
hashの要素としてlistを直接持てないから、listのリファレンスにするわけ。
775nobodyさん:2006/11/11(土) 22:25:12 ID:srC1L817
>>774

$self = {
   aaa => undef
};

として受け取った場合、$self->{aaa}を配列として扱うことは可能なのですか?
776nobodyさん:2006/11/11(土) 22:26:23 ID:???
ああ、ごめん、ちゃんと読んでなかった>< >>771 では
$self->{aaa} = @{$args{aaa}};
と配列変数のリファレンスを受け取るって書いたつもりでした。
そうすれば、引数のリストを>>770のように匿名ハッシュで囲わなくてもいいんじゃないか、と。
777nobodyさん:2006/11/11(土) 22:48:53 ID:???
>>775 $self->{aaa}を配列として
配列として、は無理。配列のリファレンスとして、扱う。

ちなみに>>770氏は引数全体をhashのリファレンスにし、且つ個々のlist(@aaa とかの部分)も
listのリファレンスにしてるけど、後者は必須だが、前者はただのhashにもできるね。

$foo->hoge(
  aaa => ¥@aaa,
  bbb => ¥@bbb,
  ccc => ¥@ccc
);

sub hoge {
 my $self = shift;
 my %args = @_;
 foreach my $key (keys %args) {
  $self->{$key} = $args{$key};
 }
}
# @{$self->{$key}} で配列全体を、$#{$self->{$key}} で要素数-1を、$self->{$key}->[0] で個々の値を参照できる
>>776
I see.
778nobodyさん:2006/11/11(土) 22:55:37 ID:???
>>769
@_ にはサブルーチンの引数がフラットなリストとして展開・格納されます。
また "=>" は本質的に "," のエイリアスに過ぎません。
すなわち @aaa = ( 'xxx', 'yyy', 'zzz' ) である時、hoge( aaa => @aaa ) は hoge( 'aaa', 'xxx', yy'y', 'zzz' ) と等価です。
さらには %args = ( aaa => @aaa ) とやってしまうと、

$args{aaa} == 'xxx'
$args{yyy} == 'zzz'

という内容のハッシュが出来上がります。これは恐らくあなたが望むものではないでしょう。

サブルーチン引数やハッシュ代入における配列 (より正確には全ての非スカラー) の独立性を保つには、偶然にも同じ解決策が使えます。
「リファレンス」がそれで、>>770 で実装の一例が述べられています。

perlref, perllol, perlsub などのマニュアルが役に立つでしょう。
# 他の言語から Perl に移行する場合は混乱するよな、実際。
779nobodyさん:2006/11/11(土) 23:07:00 ID:5mpuYPBZ
なるほど・・・上記の方々、ご返信ありがとうございます!
理解するまでしばらくかかりそうなので、理解してまた返信させていただきますm(_ _)m
780nobodyさん:2006/11/11(土) 23:28:01 ID:t9lEuzhq
つまり、ハッシュのvalueを配列として渡すと渡す側のkeyも渡ってしまい意図しない値を受け取ってしまう、という訳でしょうか。
(なんか良く分からなくなってきましたが・・・)
質問に答えていただいた方、ありがとうございました。

ところで、こういう細かいことが書かれているオンラインのマニュアルなどはあるのでしょうか?
781nobodyさん:2006/11/11(土) 23:44:57 ID:???
>>780
>>779
特に perlref。ぐぐればいいよ。
listもhashも、複数の値でできてる。複数の値なんで、それを一つの値であるかのように、
$a{'aaa'} = @aaa;
とすることはできない。
しかし、リファレンスっていうのはそれ自体は一つ。なので、
$a{'aaa'} = ¥@aaa;
は可能なんですよ。

%aa = ('aa' => 'AA', 'aaa' => 'AAA');
%bb = ('bb' => 'BB', 'bbb' => 'BBB', 'bbbb' => 'BBBB');
hoge(%aaa, %bbb);
はhogeに10個の引数を渡していることになるけど、
hoge(¥%aaa, ¥%bbb);
は2個の引数を渡してるんですよ。
782nobodyさん:2006/11/11(土) 23:48:10 ID:???
まちがった orz

%aa = ('aa' => 'AA', 'aaa' => 'AAA');
%bb = ('bb' => 'BB', 'bbb' => 'BBB', 'bbbb' => 'BBBB');
hoge(%aa, %bb);
はhogeに10個の引数を渡していることになるけど、
hoge(¥%aa, ¥%bb);
は2個の引数を渡してるんですよ。
783nobodyさん:2006/11/12(日) 01:13:46 ID:???
質問

Perlで作られた日本語版のWEB CGIゲームを
英語版に改造しようとしているのですが、(作者の許可は取得済み)
作業の進め方がわかりません。

どうしたらいいですか?
二人のチームでやるのですが、
自分が翻訳担当で、もうひとりが技術担当です。

まず日本語の用語を全部リストに洗い出して、
それをかたっぱしから英語に直していって、
翻訳が終わった分から、技術者に渡して、
技術者はできあがった翻訳を受け取ったら、
正規表現か何かでガァーーっと
英語に置換していけばいいのですか?
784nobodyさん:2006/11/12(日) 01:19:07 ID:???
てか英語版に改造するも何も翻訳するだけやん
785nobodyさん:2006/11/12(日) 01:34:08 ID:???
>>784
ソースの中の日本語部分を英語に翻訳すればいいだけなのか。

あるいはCGIで生成される日本語も英語に翻訳しなければならないのか、

あと、一つの用語を翻訳して、それを28のファイル全部に
行き渡らせるにはどうしたらいいのか。
786nobodyさん:2006/11/12(日) 01:46:37 ID:???
改造が許されてるなら、テンプレートシステムなりなんなり導入してリソースを分離したら?
それが難しいってなら、普通にソース中の文字列リテラルを地道に翻訳するしかないだろうね。
787nobodyさん:2006/11/12(日) 01:55:13 ID:???
>>786
ようはいきなりソース中にべた書きされてる日本語を英語訳するよりも、
「言語パック」
みたいのをつくって、エンジン部分は翻訳者はまったくさわらずに
すむような状況を作ってから、翻訳者に仕事をさせたほうがいいと?
788nobodyさん:2006/11/12(日) 01:57:45 ID:???
>>784
↑って>>783か?
なんか質問の仕方がなってない。
「〜いのか。」

> ソースの中の日本語部分を英語に翻訳すればいいだけなのか。

他に何かする必要あるのかよ。

> あるいはCGIで生成される日本語も英語に翻訳しなければならないのか

それって「ソースの中の日本語部分を英語に翻訳」じゃないの?

> あと、一つの用語を翻訳して、それを28のファイル全部に
> 行き渡らせるにはどうしたらいいのか。

行き渡らせるの意味が不明。
28のファイルなんて言われてもこっちは知らない。
もし、28個のファイルに同じ用語(日本語)があってそれを
英語に置き換えたいというのなら正攻法でひとつひとつ
やってけ。
もしくは http://akky.cjb.net/download/speeeeed.html みたいなソフト
使って置き換えれば?

> 技術者はできあがった翻訳を受け取ったら、
> 正規表現か何かでガァーーっと
> 英語に置換していけばいいのですか?

技術者なのにそんなことも分からんのかい。
日本語に依存する処理(例えばjcode.plやJcode.pmによる文字コード変換)
をしているところは削ったりとか英語用に変えるとかも必要になったりするでしょ。
789nobodyさん:2006/11/12(日) 02:06:52 ID:???
>技術者なのにそんなことも分からんのかい
らめぇええええ

漏れ技術者じゃないぃいいいい
ただの翻訳者ぁああああ
790nobodyさん:2006/11/12(日) 02:09:52 ID:???
>>789
技術者出てこい、じゃないかな。
ハードコードしてあるリテラルを翻訳者が訳して地道に修正するのか、
リソースとして外出しにするにか、ってのは技術者が判断しなきゃないんじゃ?
791nobodyさん:2006/11/12(日) 07:43:27 ID:???
何で翻訳者がここに居るんだ?
792nobodyさん:2006/11/12(日) 09:13:18 ID:???
plファイルについて質問です

使用中の掲示板のスクリプトに、ログ機能を追加するためplファイルを作り、
読み込み開始直前に require 'xx.pl '; を挿入しました

このままだと自分の記録も入ってしまうのでキャンセルするようにif条件で
ログ記録を部分を以下のようにしたところエラーが出てしまいました

if($name ne "自分"){
--ログファイルへの読み書き部分-- }

仕方なくjcode.plの最後を参考にし、

}
1;

としました、これで動作しました
この最後の1;はどうして必要なのでしょうか?
793nobodyさん:2006/11/12(日) 10:00:19 ID:???
'〜が'.$n.'個あります'
みたいなのは順番も変えなくちゃだから、
ただリテラルを直すだけじゃ足りないかもしれない。
794nobodyさん:2006/11/12(日) 12:11:30 ID:JI5vE2Zg
>>781-782
ありがとうございます!
本当にPerlって奥が深いですね・・・もっと勉強しますm(_ _)m
795nobodyさん:2006/11/12(日) 12:13:16 ID:???
まずは翻訳してから改造しれや
ただそれだけだろ?
で、何人かが書いている通りリソースを分離できるなら

(1)分離できるところは分離する
(2)(1)の作業中に分離できないところを翻訳
(3)分離後ソースを改造開始し、(2)で分離したリソースの翻訳

これがベストか?
796nobodyさん:2006/11/12(日) 12:22:19 ID:???
>>792

> ログ記録を部分を以下のようにしたところエラーが出てしまいました

Internal Server Errorだったら文法ミスとかでしょ。
鯖のエラーログ見るか文法チェックしてみ。
肝心な部分が省略されてるから答えられるのはこの程度しかない。

> この最後の1;はどうして必要なのでしょうか?

"requireしたファイルの最後"を明示しないとエラーになることがあるから。
1;がその役割。
797nobodyさん:2006/11/12(日) 13:02:21 ID:???
>>796
if構文を入れなければ、「1;」を省略しても実行されるので
文法ミスではないと思いますが、if(){}を使ったことで
>ファイルの最後"を明示しないとエラーになる
が発生したものと思われます

有り難うございました
798nobodyさん:2006/11/12(日) 13:41:44 ID:???
>>797
細かいとこなんだけれど一応。スルー力不足を露呈してみる。

>>796 の説明には若干の誤解があります。
require が読込むファイルは最後に真を返す必要があります。
より正確には、require されるコードが正しく実行されたかどうかの真偽を、そのコードから返す機能の名残ですが、今では誰も覚えていませんし、覚える必要もありません。
require はファイルが偽を返した場合、require されたコードの初期化に失敗したものと見なし、例外を吐いて死にます。
799nobodyさん:2006/11/12(日) 13:44:17 ID:???
>>791
ここで解決できたら Perl のドキュメントを和訳して公開してくれるんだよ。
800nobodyさん:2006/11/12(日) 21:22:52 ID:???
なんで1なんだろう?と思ってたけど納得できた。
ありがとう、胸がすっとしたぜ!
801nobodyさん:2006/11/13(月) 04:13:23 ID:???
いつもお世話になっています。

CGI/Perl のデバッグをしたい (phpのWARNINGのような詳細なエラーを出したい) のですが、良い方法は無いでしょうか?

エラーが出たときにApacheのエラーログを見ても、「Premature end of script headers: example.cgi」 程度の記述しか表示されません。
サーバは、Fedora Core 4 + Apache 2.2.0 + Perl 5.8.6 (SuExecは使っていません。) と一般的な構成です。

ご教示お願いします。
802nobodyさん:2006/11/13(月) 04:19:09 ID:???
次のようなスクリプトを実行すると、「CGI開始」 は出力されますが、「CGI終了」 は出力されません。

このCGIには問題点があり、if ("検索対象文章" =~ /$hoge/i) の $hoge が "+" なので、正規表現として不正になっています。
本来ならば、500 Internet Sever Error となるべきだと思うのですが、何故かエラーにならず、スクリプトが強制終了されるだけになります。
これは何故でしょうか?

if ("検索対象文章" =~ /+/i) と書けば、当然 500 Internet Sever Error になります。

--------------- test.cgi ---------------
#!/usr/bin/perl

print "Content-Type: text/html\n\n";
print "CGI開始";

$hoge = "+";
if ("検索対象文章" =~ /$hoge/i) {
print "マッチしました。";
} else {
print "マッチしませんでした。";
}

print "CGIエンド";
exit;
----------------------------------------

ちなみに、この $hoge は実際にはCGIのユーザ入力の値です。
OSインジェクションやSQLインジェクションは聞いた事がありますが、Perl正規表現インジェクションという話は聞いた事はありませんが、
もしこの実装に、スクリプトの強制終了以外のセキュリティ上の問題点がありましたら教えていただけたら幸いです。
また、ようするに検索エンジンのように文章の検索を行いたいわけですが、ユーザ入力の正規表現のメタ文字の無効化方法がありましたら
教えて下さい。

お願いします。
803802:2006/11/13(月) 05:00:38 ID:???
> ユーザ入力の正規表現のメタ文字の無効化方法

これに関しましては、自分で知っているメタ文字をエスケープするコードを書いてみました。
もし、エスケープ漏れがあったら教えて下さい。

$_ =~ s/\\/\\\\/g;
$_ =~ s/\^/\\\^/g;
$_ =~ s/\./\\\./g;
$_ =~ s/\$/\\\$/g;
$_ =~ s/\*/\\\*/g;
$_ =~ s/\?/\\\?/g;
$_ =~ s/\|/\\\|/g;
$_ =~ s/\(/\\\(/g;
$_ =~ s/\)/\\\)/g;
$_ =~ s/\[/\\\[/g;
$_ =~ s/\]/\\\]/g;
$_ =~ s/\{/\\\{/g;
$_ =~ s/\}/\\\}/g;
$_ =~ s/\+/\\\+/g;
804nobodyさん:2006/11/13(月) 05:01:40 ID:???
>>801
use CGI::Carp qw(fatalsToBrowser);
をCGIファイルの先頭付近に。他にもKCatchとかあるから探してみそ

>>802
ヘッダを吐き出していればdieしようが何しようが表示されるのね。
/+/だと500エラーになるのは、解釈段階でエラーが発生するため。
対して/$hoge/だと$hogeの値は評価段階にならないと決定されないから
先にヘッダが出力される。よって500エラーにならない。

Perlは正規表現中に任意のコードを含めることが可能なのは事実だけれど(?{ ... })、
それなりに安全対策がしてあるので、許可しなければ外部コードが
実行されてしまうということは無いと思われる。
see also: perlre, ttp://search.cpan.org/~nwclark/perl-5.8.8/ext/re/re.pm
強制終了しないようにするためにはevalブロックを用いるといい。

そのユーザの入力というのは正規表現を期待してるのだよね?
正規表現的に意味のある文字を全てエスケープしてしまうという意味なら、
quotemeta関数なり、/\Q$hoge\E/なりがあるけれど。その場合ならindex関数を使う手もある。
805804:2006/11/13(月) 05:12:29 ID:???
>>801
スマソ、思いっきり勘違いした警告か。
use warnings;
もしくはShebang行にこのように-wをつける。
#!/usr/bin/perl -w

で、さっきのと組み合わせて
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
...
warningsToBrowser(1);
のようにすると出力上にコメントとして出てくる。
806802:2006/11/13(月) 05:46:37 ID:???
>>804-805
ご丁寧な回答ありがとうございます。
#!/usr/bin/perl -w
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
を試してみます。

また、evalブロックについてのページも参考になりました。

> Perlは正規表現中に任意のコードを含めることが可能なのは事実だけれど(?{ ... })、
これはちょっと気になるので、もしよろしければ参考URLを教えていただけたら幸いです。

> その場合ならindex関数を使う手もある。
結局それに気がついて index 関数使っちゃいました。
大文字小文字を区別することができなくなりましたが、そこは諦めます。
807nobodyさん:2006/11/13(月) 09:26:04 ID:???
>>806
(?{ ... })については参考URLをさがすまでもなくperldoc perlreにちゃんと書いてあるが。
808802:2006/11/13(月) 11:06:39 ID:???
>>807
ありがとうございます。
見つかりました。
http://www.kt.rim.or.jp/~kbk/perl5.005/perlre.html

正規表現中でのコードの実行機能は use re 'eval'; と宣言しない限り、使用できないようです。
ってことでユーザ入力値の値をいきなり代入したところでセキュリティ上の問題は無さそうですね。

# ただし、処理に時間のかかる正規表現をいれることにより、
# DoSに使えるかも。
809nobodyさん:2006/11/13(月) 14:35:35 ID:???
SQLインジェクションみたいな脆弱性?
810nobodyさん:2006/11/13(月) 14:40:31 ID:???
>>801
てゆかapacheのログ見れる立場にいるならLogLevelの設定変えられないの?
811nobodyさん:2006/11/13(月) 14:52:19 ID:???
apacheのエラーログみて「Premature end of script headers: example.cgi」 しかないのなら、
いくらwarningsToBrowserやfatalsToBrowserしてもやっぱり何もでないんじゃないか。
ログみられなかったり見るのが面倒な人がつかうもんだろ?

処理系が検出するようなエラーはないがそもそもロジックがおかしい予感。
812nobodyさん:2006/11/13(月) 14:54:42 ID:???
>>809
ようするに任意のコマンドが実行できる脆弱性ってことでしょ

use re 'eval';
$a =~ /$GET['search']/

こういうことしていると、「(?{open("| cat /etc/passwd > [email protected]"})」 を送信されたときに
/etc/passwd がクラッカーに渡ってしまう。

正規表現インジェクションとでも呼べばいいだろうか
対策は正規表現のメタ文字のエスケープだね。

813nobodyさん:2006/11/13(月) 16:20:57 ID:???
最新のActivePerlを入れたらppmがGUIになっててビビった。
コンソール版はなしですか?
814nobodyさん:2006/11/13(月) 17:01:43 ID:???
>>813
以前の対話形式はppm-shell
コマンドラインなら
ppm command arg
でも行ける
# 殆どGUI版使ってないや
815nobodyさん:2006/11/13(月) 19:14:27 ID:???
>>814
サンクス。
816nobodyさん:2006/11/13(月) 20:06:21 ID:???
ppm ってインストール済のモジュールを一括してアップグレードできないんですか?
817nobodyさん:2006/11/13(月) 21:12:11 ID:???
>>816
ppm upgrade -install
818nobodyさん:2006/11/14(火) 00:35:27 ID:???
Perlは入門書を一冊読んで簡単な掲示板がやっと作れる程度のかなりの初心者なのですが、
CGIその1内のデータを、CGIその2に受け渡すにはどうしたらいいのでしょうか?

「アドレス?パラメータ」の形で、フォームのデータをやり取りするようにデータが渡せると
書いてあったので、「アドレス?a=$a&b=$b&c=$c」というようにすれば、CGIその1で
変数aに代入したデータをCGIその2に送ることが出来るかと思ったので、

require 'cgi-lib.pl';
&ReadParse( *form );
$a = $form{'a'};
$b = $form{'b'};
$c = $form{'c'};

として、

print "${a}${b}${c}\n";

と表示してみようとしても、どの変数も空のままなのか何も表示されません。

どうすれば、変数データ等はやり取りできるようになるのでしょうか?
819nobodyさん:2006/11/14(火) 01:02:20 ID:???
>>818
<input type="hdden" name="a" value="value of a">
みたいにフォームに仕込むのが簡単かな。
クライアント側でいじれちゃうというデメリットがあるけどね。
820nobodyさん:2006/11/14(火) 01:58:17 ID:???
>>819
早い回答ありがとうございます。
それでやってみます。
821nobodyさん:2006/11/14(火) 04:24:01 ID:???
質問です
my $file = "no001.jpg";
print -s $file;
上記のようにファイルサイズを出力するスクリプトで
正規表現を用いて no???.jpg にマッチするファイルのサイズを表示させたいのですが
方法が思いつきません
分かるかたいましたらご指導お願いいたします。
822nobodyさん:2006/11/14(火) 07:25:09 ID:???
言っとくがオレはopendir派だ
823nobodyさん:2006/11/14(火) 13:15:59 ID:???
CGI出力時の改行コードは指定するにはどうすればよいのでしょう。
LFにしたいのですが、どうやってもCRLFになってしまいます。
自宅のwindows上でも、xreaでもCRLFで出力されてしまいます。
824nobodyさん:2006/11/14(火) 13:38:15 ID:???
自己解決しました。
ちゃんと出力されていました。
ブラウザでの保存時に勝手に改行コードが変えられていたようです。
825nobodyさん:2006/11/14(火) 14:07:32 ID:???
>>821
loopで回して同じことして加算すれば。loopは opendir 派でなければ
foreach $hoge (<no???.jpg>) {
}

コマンドラインでなら ls -l と awk で One Liner するけどね
826nobodyさん:2006/11/14(火) 15:06:38 ID:???
Perlで特定のHTMLファイルの一部を抜き出して出力したいと考えています。

随時更新される Yahoo! のトップのソースぐらいぐちゃぐちゃ (文法もぐちゃぐちゃでテーブルレイアウト、勿論適切なidはついていません) なHTMLから
特定の場所のデータを抜き出して、変数に代入したいといった感じです。

<table>
<tr>
<td>AAA</td>
<td>BBB</td>
<td>CCC</td>
</tr>
<tr>
<td>DDD</td>
<td>EEE</td>
<td>FFF</td>
</tr>
</table>

例えば、上のようなテーブルのBBBの部分が随時かわるとして、それを動的に取得するかんじですね。
実際には外部のサーバのデータとなりますが、wget+cronで取得するつもりなのでそこはいいんですが、HTMLから
一部のデータを抜き出すのに便利なモジュールなどはありますでしょうか?

なかったら地味に自分でロジック組んで見ます。
827nobodyさん:2006/11/14(火) 15:37:42 ID:???
$n= 1;
$get=($html=~ m#<td>(.*?)</td>#g)[$n];

そんなもんわざわざモジュール使わなくて書いたほうがシンプルじゃん
828nobodyさん:2006/11/14(火) 15:49:46 ID:???
そんな単純なHTMLソースなわけないだろwww
でも正規表現でひっぱってくるしかないと思う
ソースの書き方が変わったら終わりだけど。
HTML::Parserみたいなのではないだろうし・・・
829nobodyさん:2006/11/14(火) 22:30:15 ID:???
それpla(ry
830nobodyさん:2006/11/15(水) 11:31:14 ID:???
miyagawa乙
831nobodyさん:2006/11/15(水) 22:37:01 ID:???
自作のライブラリ、またはモジュールを用意しまして、
呼び元から利用可能なサブルーチンの一覧を得る方法はありますか?
832nobodyさん:2006/11/16(木) 01:05:15 ID:???
オブジェクト指向を勉強するためにムーバブルタイプのソース見てるんですが、
これってお手本にしていいんでしょうか。
お手本的なコードを紹介してもらえないでしょうか。
833nobodyさん:2006/11/16(木) 01:52:46 ID:???
my $name= 'test';
&$name;
sub test {
print 'test';
}
2行目ゎうそんこ。$nameを使って&testを実行することはできますか?
834nobodyさん:2006/11/16(木) 01:54:54 ID:???
>831
main.plからFoo.pmを呼んでいるとして、
@Foo::EXPORTと@Foo::EXPORT_OKを確認したらいいんじゃないかと思う。
存在するとは限らないけど。オブジェクト指向なモジュールとかだとなにもエクスポートしないしね。
そうでなかったら直接シンボルテーブルを覗くとか。

>832
ttp://search.cpan.org/
835nobodyさん:2006/11/16(木) 01:59:33 ID:???
>>833
それ自分で書いて、実行してみた?
use strict 'refs' してなければそれでいけるよ。
文字列をデリファレンスすると、自動的にシンボルテーブルからひっぱってくる。
836nobodyさん:2006/11/16(木) 02:04:27 ID:???
>>833
$name = ¥&test; # use strict 'refs' OK
$name->();

$name = 'test'; # use strict 'refs' NG
$name->();

$name = 'test';
eval "$name()";

$name = 'test()';
eval $name;
837nobodyさん:2006/11/16(木) 02:11:57 ID:???
>>835 ありがとうございます!!ちなみに3件ともわたくしでした。

833はuse strictしてる場合、エラーになりました。
'refs'はよくわからないので調べてみます。
そこだけno strictするのは素人ですか?
838nobodyさん:2006/11/16(木) 02:12:25 ID:???
>>832
オレの書いたソース。



悪い例としてな。
839nobodyさん:2006/11/16(木) 02:19:01 ID:???
いっそ無名で
my $name = sub {
print "test";
};
$name->();
840nobodyさん:2006/11/16(木) 02:20:04 ID:???
ああ、意味わかんないや。837=831=832=833で834=835と決め付けてました。
834さんと836さんありがとう!!
841nobodyさん:2006/11/16(木) 02:22:36 ID:???
>>837
'refs' を付けると、シンボリックリファレンス(文字列をデリファレンス)だけを制限できる。
この辺は perldoc strict 参照。

ちゃんと理解してて no strict するなら問題ないと思うよ。むしろ常套手段。
842nobodyさん:2006/11/16(木) 02:40:44 ID:???
>>841 詳しいご説明、ありがとうございます!

外部ファイルからプラグイン的なものを自動取得する方法を考えてたんですが、
できそうな気がしてきました。サブルーチンを全部飲み込もうかと。
後から間違いだったと気づくかも知れませんが。
843nobodyさん:2006/11/16(木) 03:59:26 ID:???
プラグイン使うようなコードかくんなら、Module::Plugableとか検討してもいいかもね。
844nobodyさん:2006/11/16(木) 11:46:04 ID:???
プラグインで思い出した。
perl で作られた FreeStyle Wiki(ttp://fswiki.poi.jp/wiki.cgi)にもプラグインの機能が
あるけど、もしかしたら参考になるかも。
845nobodyさん:2006/11/16(木) 14:35:02 ID:???
Plaggerもプラグイン使えるから参考になるかもね
846nobodyさん:2006/11/17(金) 01:51:27 ID:???
わぉ、たくさん情報ありがとうございます!
今回たくさんWIKI系を参考にしてたんですが、FreeStyleはコメントが日本語なのもあって
見やすいですね。そしてざっと見ただけでも参考なるコーディングがすでに沢山見つかってます。
847nobodyさん:2006/11/17(金) 11:32:42 ID:???
質問なのですが、>>827
(.*?) はどういう意味でしょうか?

「perl ".*?"」で5個以上の検索エンジンで検索したのに、全部記号部分が無視されましたorz

. = 任意の文字
* = 直前の文字を0回以上にマッチ
? = 直前の文字を0又は1回にマッチ

ですが、「.*?」 にする意味が分からないです。
848847:2006/11/17(金) 11:46:48 ID:???
ついでに "m#" "#g" と囲ってあるのも意味が分からない…。

m は 改行無視、gは繰り返しマッチ、だと思うんですが /mg をかっこよく左右に分離させて
バランス良く美しく書いている感じでしょうか?

何かいい解説サイトがありましたら教えていただけたら幸いです。
849nobodyさん:2006/11/17(金) 11:52:51 ID:???
さんこーしょに普通に載ってるでしょ、、正規表現のとこ
ネットでも「Perl 正規表現」で複合検索かければイパーイあるでし
850nobodyさん:2006/11/17(金) 12:45:57 ID:???
>>848
$get=($html=~ m#<td>(.*?)</td>#g)[$n];
$get=($html=~ /<td>(.*?)<\/td>/g)[$n];
同じ。
セパレータが違うのと、m演算子はセパレータが/の時だけ省略できる
(.*?)は任意の文字列
検索しても、読まないと意味が無いぞ!!
851nobodyさん:2006/11/17(金) 13:00:08 ID:???
ふぅ…
852nobodyさん:2006/11/17(金) 13:08:37 ID:???
任意の文字列なら .* でいいんじゃないの?

853852:2006/11/17(金) 13:09:29 ID:???
あ、量指定子での最短マッチか。
そまそ。
854nobodyさん:2006/11/17(金) 19:14:27 ID:???
最短マッチってそうやるんだ・・・
([^<]+)<とかやってたよ
855nobodyさん:2006/11/17(金) 20:02:23 ID:3ps2NDUf
my と local の違いをおしえてください
856nobodyさん:2006/11/17(金) 20:46:15 ID:???
localのつかいかた
$hoge = 'ぺにす';
{
local $hoge; # ちょっとどいてね
$hoge = 'わぎな';
}
print $hoge;

myのつかいかた
{
my $hoge = 'ちんぽ'; # ぶろっくの中だけ使えるね
}
print $hoge;
857nobodyさん:2006/11/18(土) 00:00:27 ID:???
卑猥だな
858nobodyさん:2006/11/18(土) 01:14:14 ID:gJVNJgdH
SQLの話になってしまうのですが、SQL総合やSQL初心者的なスレッドがなかったので、
ややスレ違いかもしれませんが質問させてもらいます。

Perl+MySQLでプログラムを書いていまして、IDとしてオートインクリメントされる
フィールドを設けているのですが、INSERTでレコードを挿入したあとに、
オートインクリメントされた値を知りたい(変数に格納したい)のですが、何か簡単
な方法はありますか?
859858:2006/11/18(土) 02:19:05 ID:gJVNJgdH
自己解決しました。
860nobodyさん:2006/11/18(土) 14:01:48 ID:???
>>856
わかりやすくてサンキュー
861nobodyさん:2006/11/18(土) 18:58:43 ID:???
LWPを使ったリンクチェッカーを作りたいのですが、どの関数を使ったらいいか迷っています。
404だけでなく、ファイルが無ければ特定URLに転送される場合にも対応したいと思っています。

LWP::Simpleを使ってgetとheadで実験してみたところ、
共にリンク先が無い場合、転送先のページに飛んでそれを取得してきました。

head関数では($content_type, $document_length, $modified_time, $expires, $server)の配列が
返されるとのことですが、
$document_length→body部分の文字数
$modified_time→取得にかかった時間
という理解でよいのでしょうか?(質問1)

現在$document_lengthでリンク先の状態を判別しようと思っていますが、さらに精度のよい判別が
できる関数がありましたらご教授願いたいです。(質問2)
862nobodyさん:2006/11/18(土) 19:34:29 ID:???
document_length ヘッダ除く本文の長さ
modified_time 最終更新時間

$response -> status_line;
863861:2006/11/19(日) 02:39:50 ID:???
LWP::UserAgentを使ってみました。
こんな感じのソースです。

#!/usr/local/bin/perl

# モジュールを保存した場所を指定
use lib qw(../../../perl/lib/perl5/site_perl/5.8.4);

# モジュールを使う
use LWP::UserAgent;

$ua = LWP::UserAgent->new;
$req = HTTP::Request->new('GET', 'http://yahoo.co.jp/');
$res = $ua->request($req);

$res->content;

print "Content-type: text/html\n\n";
print "<html><head><title></title></head><body>";
print "$res";
print "</body></html>";

すると、画面に「HTTP::Response=HASH(0x8309728)」とだけ表示されました。
16進数で何かしらのデータが受信して表示されていると思うのですが、$resが何なのか分かるように
表示するにはどうしたらいいのでしょうか?
864nobodyさん:2006/11/19(日) 02:44:49 ID:???
perlのオブジェクト指向に慣れてないね。$resはオブジェクト。
だからrequestでgetしたデータは「$res->content」で返される。
つまりこうすれば良い↓

print "Content-type: text/html\n\n";
print "<html><head><title></title></head><body>";
print $res->content;
print "</body></html>";
865861:2006/11/19(日) 03:35:42 ID:???
なるほど、できました。
ご丁寧にありがとうございます。

$ua = LWP::UserAgent->new;
$req = HTTP::Request->new('GET', 'http://yahoo.co.jp/');
$res = $ua->request($req);

この場合だと、ここのスレッドが完了した時点で$res(物理的にはメモリ)に
http://yahoo.co.jp/」からのソースが保持されていて、
$res->contentその中からbody部分のデータを持った変数。

という理解でいいでしょうか?
866nobodyさん:2006/11/19(日) 04:01:31 ID:???
オブジェクトと変数はだいぶ違うが、まぁ流れはそんな感じ。ただ、

>$res->contentその中からbody部分のデータを持った変数。

これは「$resの"content"に入ってるデータを引っ張り出す」と考えたほうが良い。
あとbody部分だけじゃなくて、head含めて全部だから。
867nobodyさん:2006/11/19(日) 11:27:48 ID:???
オンメモリじゃなくて、LWPはファイルにも書き出せたはずだよ
868nobodyさん:2006/11/19(日) 15:38:26 ID:???
質問させて下さい。

package Hoge;
use IO::File;
sub load {
my $fh = IO::File->new('test.txt','r');
my @tmp = $fh->getlines();
$fh->close();
}
1;

#!/usr/bin/perl
use IO::File;
my $fh = IO::File->new('test.txt','r');
my @tmp = $fh->getlines();
$fh->close();

パッケージだと $fh->getlines(); でエラーになります。
パッケージにする時って何か特殊な事をしないと駄目ですか?
869nobodyさん:2006/11/19(日) 17:06:20 ID:???
>>868
どんなエラーですか?
Hogeパッケージの方はload()というサブルーチンのようですが、呼び出している部分がないので
どう使っているかわかりません。

Can't call method "getlines" on an undefined value

というエラーなら、newに失敗しているということでしょう。$fhをチェックすべきです。
870nobodyさん:2006/11/19(日) 17:19:22 ID:Hl3UB+5J
Template-ToolKitで、一つのhtmlテンプレートの中で
FOREACHによるループ部分とそれ以外の差し替え部分を
同時にprocessするにはどうしたらいいんでしょうか?
871868:2006/11/19(日) 17:53:17 ID:???
>>869
>Can't call method "getlines" on an undefined value
このエラーです。

呼び出しは
#!/usr/bin/perl
use Hoge;
Hoge->load();
です。
872nobodyさん:2006/11/19(日) 21:19:45 ID:???
>>871
私のところで動作させてみたら、エラーは出ずに動きましたよ。
IO::File->new の返り値を確かめましたか?

Hoge.pm
--------
package Hoge;
use IO::File;

sub load {
my $fh = IO::File->new('test.txt','r') or die $!;
my @tmp = $fh->getlines();
$fh->close();
return @tmp;
}
1;
--------

hoge.pl
--------
use Hoge;
print Hoge->load();
--------
873nobodyさん:2006/11/19(日) 21:59:36 ID:???
>>872
らくだ本を買いに行ってました...
もう一度よく確認してみます。
ありがとうございました。
874nobodyさん:2006/11/20(月) 15:06:26 ID:???
質問ですCarpでCGIのデバッグを行っているのですが
local $method = @_;
のように宣言する行で
Global symbol "$method" requires explicit package name at test.cgi line 74.
とエラーが出てしまいます
これはどういった原因が考えられるのでしょうか
分かるかたいましたらお願いいたします。
875nobodyさん:2006/11/20(月) 15:24:14 ID:???
スカラ変数の中身が数値かそれ以外かを判断するにはどうしたらいいんでしょうか?
876nobodyさん:2006/11/20(月) 15:34:53 ID:???
>>875
Scalar::Utilのlooks_like_number
877nobodyさん:2006/11/20(月) 15:50:27 ID:???
>>874
エラーメッセージ読めばだいたいわかると思うが、さらに詳しくしりたければ
perldiag(1)を読め。

Global symbol "%s" requires explicit package name
(F) You've said "use strict vars", which indicates that all vari-
ables must either be lexically scoped (using "my"), declared
beforehand using "our", or explicitly qualified to say which pack-
age the global variable is in (using "::").

'use strict vars'が指定されているので、すべての変数は("my"を用いた)
レキシカルスコープの変数か、事前に"our"で宣言されるか、("::"を用いて)
明示的に修飾することでどのパッケージに所属するかを示したグローバル
変数でなければなりません。
878875:2006/11/20(月) 15:51:17 ID:???
>>876
ありがとう。
879nobodyさん:2006/11/20(月) 20:27:04 ID:???
>874
サブルーチン 呼び出してるときに、値が入っていないのでは?

shiftしれば、その結果でわかるかと思う
880nobodyさん:2006/11/20(月) 20:51:34 ID:???
>>879
use strict 下で宣言されてない変数を使おうとした時のエラーだって >>877 で書いてあるじゃない。
local は既に宣言されてる変数の値の変化を局所化するだけで、変数の宣言にはならないんだってば。
my か our で宣言しないとダメ。あやふやな回答は質問者を混乱させるだけだよ(´・ω・)
881TORA:2006/11/20(月) 22:44:57 ID:a7JS476D

はじめまして
 
最近Perlを勉強しはじめたものなんですが
「数列を配列に入れ、偶数だけ表示させてください」
配列とかわかるのですが偶数だけ表示とかっていうのがわかりません。
周りの人に聞いても知らない人が多いので助けてください><
882nobodyさん:2006/11/20(月) 22:50:09 ID:???
>>881
宿題は自分でやりなさい。

ヒント
1 % 2 = 1
4 % 2 = 0
883nobodyさん:2006/11/20(月) 22:51:03 ID:???
>>881
考えるんだ
偶数と奇数の違いを考えるんだ
884nobodyさん:2006/11/20(月) 23:04:46 ID:???
算数からか・・・
885nobodyさん:2006/11/20(月) 23:12:06 ID:???
こうですか!?わかりません!
use strict;
use Math::BigInt;
use Tie::LazyList;
tie my @seq, 'Tie::LazyList', [ 1 ], sub { my($array_ref, $n) = @_; $n };
for my $n (1..20) {
 my $x = Math::BigInt->new($seq[$n]);
 print "$x\n" if $x->is_even;
}
886nobodyさん:2006/11/20(月) 23:15:17 ID:???
% 2 より & 1 の方がいいと思うんだけど、何か問題あったりする?
887nobodyさん:2006/11/20(月) 23:17:56 ID:???
どっちでもいい
ただ、4 % 2 = 0 じゃなくて 4 % 2 == 0
888nobodyさん:2006/11/20(月) 23:20:46 ID:???
>>886
問題はないね。ただそれではたぶん >>881 がロジックを理解できない気がする。
889nobodyさん:2006/11/20(月) 23:24:26 ID:???
>>887
トラップ入れといたつもりなのにぃ
890nobodyさん:2006/11/20(月) 23:29:40 ID:???
>>886
$ perl -e 'print 1000000000000 & 1'
1
891nobodyさん:2006/11/20(月) 23:32:48 ID:???
2.0とかでも大丈夫?
892 ◆TWARamEjuA :2006/11/20(月) 23:47:51 ID:??? BE:1524672-BRZ(6677)
あっちで使った技を取り入れつつ♪

my @Array = ( 1.. 1000 );
my %number;
@number{@Array} = (1) x @Array;

printf qq|%d\n|, $_ for grep not( $_ % 2), keys %number;

# 乱数っぽく♪
893nobodyさん:2006/11/20(月) 23:50:32 ID:???
foreach(@rndnums){
print $_ if !($_ % 2);
}
894nobodyさん:2006/11/21(火) 00:03:52 ID:???
田村清姫さんと空英彦さんが結婚しました。さてお嫁さんのなまえは何でしょう
895TORA:2006/11/21(火) 00:11:22 ID:???
みなさん迷惑かけてすいませんでした。
みなさんの出してくれているソースがまったく理解できずにいます。
まだ勉強して無いところが多かったみたいです。
本当に迷惑かけてすいません。
896nobodyさん:2006/11/21(火) 00:11:36 ID:???
井上順太郎
897nobodyさん:2006/11/21(火) 00:12:35 ID:???
本当にどれも理解できないの?
だったら0から勉強しなおしなよ
898nobodyさん:2006/11/21(火) 00:19:46 ID:???
だから初心者スレ来てるんじゃ
899TORA:2006/11/21(火) 00:20:49 ID:???
0から始めたばかりなんですがmy@Array my%numberまだとか見たことないので
900nobodyさん:2006/11/21(火) 00:21:52 ID:???
正規表現でHTMLタグを簡易的に表すことについて質問です!

1. <a href=~>
2. </a>

上記の二つを簡潔に表すのに、</?a\s*.*?>としてみたものの<a>というのにもマッチしてしまいます。
/があったら属性なし、/がなければ属性必須にするような後方参照は可能でしょうか。
よろしくお願いします!

# <a>がHTMLの文法として正しいのかどうかは知りません
901nobodyさん:2006/11/21(火) 00:25:44 ID:???
>989
そんなんググるか、リファレンスとか持ってれば必ず載ってるべ?
理解しようとしない・調べようとしないでは、ここで聞くだけ無駄では?

>990
</?a\s*.+?>
はどう?
902nobodyさん:2006/11/21(火) 00:27:05 ID:???
\s*←空白が無くてもマッチ
.*?←文字が無くてもマッチ
903900:2006/11/21(火) 00:32:26 ID:???
</?a\s*.+?>だと</a>がマッチしないんですよ。
/の有無で分岐するみたいな巧妙な文法ってないでしょうかね。
904nobodyさん:2006/11/21(火) 00:34:33 ID:???
普通に|使えよ
905nobodyさん:2006/11/21(火) 00:39:43 ID:???
あぁそっか+じゃだめだな
テキトーすぎですまそ
906nobodyさん:2006/11/21(火) 00:40:40 ID:???
=~ #<a\s+.*?>|</a>#i
907900:2006/11/21(火) 00:51:46 ID:???
やっぱそれしかないですかね。正規表現はまだしらない機能がいっぱいなので、
ひょっとしてと思ったんですが。ありがとうございます。
908nobodyさん:2006/11/21(火) 00:53:27 ID:???
>>900
実直に書いてみた。
my @str = ('<a href=...>', '</a>' , '<a>', '</a hoge>' ) ;

for my $str ( @str ){
 my $flag = 0 ;
 if ( $str =~ m{\<
       (/(?{ $flag = 1 })|(?{ $flag = 0 }))
      a
      (??{ $flag == 0 ? '\s+\S+.*?' : '' })
       \>}x ){
   print $str . "\n" ;
 }
}

アホす。
909nobodyさん:2006/11/21(火) 00:59:54 ID:???
>>908
> (/(?{ $flag = 1 })|(?{ $flag = 0 }))
なるほど、|を使ってマッチしなかったときはフラグを上書きすりゃいいのか。勉強になった
910nobodyさん:2006/11/21(火) 01:13:46 ID:???
m{</?(?(?<=/)a|a\s+.+?)>} # で実現できるけど、でも読める? ^^;
911900:2006/11/21(火) 01:14:10 ID:???
>>908 
すごいっす!今のところ全然意味が分からないですが、いずれ役に立ちそうな予感がします。
912900:2006/11/21(火) 01:28:08 ID:???
>>910
これだ!2つ目の?がif文になってるんですね。勉強になりました。
aを何とか一回に収めたいところですが、自分で考えてみます。
913nobodyさん:2006/11/21(火) 02:08:28 ID:???
コーディングとはちょっと違うんですが、質問です。

CPANでモジュールをインストールしたいのですが、File::Copyというモジュールがインストールできません。
エラーコードは以下の通りでした。

cpan > install File::Copy
CPAN: Storable loaded ok
Going to read /home/account/.cpan/Metadata
Database was generated on Mon, 20 Nov 2006 05:24:36 GMT
Running install for module File::Copy
Running make for N/NW/NWCLARK/perl-5.8.8.tar.gz

The most recent version "2.09" of the module "File::Copy"
comes with the current version of perl (5.8.8).
I'll build that only if you ask for something like
force install File::Copy
or
isntall N/NW/NWCLARK/perl-5.8.8.tar.gz
Running make test
Make had some probrem, maybe interrupted?Won't test
Has no own directory
Running make install
Has no own directory
Make had some probrem, maybe interrupted?Won't install

サーバはさくらサーバです。
LWPモジュールはインストールできました。そのモジュールは5.8.4というフォルダ以下に入っています。

ご回答お願い致します。
914nobodyさん:2006/11/21(火) 02:39:03 ID:???
標準で入ってないの?
915908:2006/11/21(火) 07:58:15 ID:???
>>911
知って数年になるが役に立ったことなどないよw
916nobodyさん:2006/11/21(火) 09:06:09 ID:???
そんな読みにくいコードは遊びでしか書かないわな。
917nobodyさん:2006/11/22(水) 00:53:26 ID:???
>>913
夜間中学で学びなおして、読めるようになれ。
918JAPU ◆lVJAPUTeX. :2006/11/22(水) 01:29:50 ID:???
>>913

ずばりのメッセージが出てますよ?
一応大雑把に解説。

> [The most recent version "2.09" of the module "File::Copy"]
> comes with [the current version of perl (5.8.8)].

モジュール "File::Copy"の最新版である "2.09" は現行版のperl (5.8.8) に含まれます。

> I'll build that [only if you ask for something like
> force install File::Copy
> or
> isntall N/NW/NWCLARK/perl-5.8.8.tar.gz]

"force install File::Copy" や、"install N/NW/NWCLARK/perl-5.8.8.tar.gz" のような
(通常とは違う) 要求があったあった場合にだけビルドします。


http://www.excite.co.jp/world/english/
上手く解釈できない単語をちょっと置き換えるだけでそれなりの日本語が出てきます。
File::Copy -> File_Copy
"2.09" -> 2.09
(5.8.8) -> 5.8.8
など。
919nobodyさん:2006/11/22(水) 11:14:05 ID:???
perlはじめたばかりなんですが、スクリプト作ってると
何行目でエラーでたのかわかりません。
どんなエラーか知る方法ありますでしょうか。
920nobodyさん:2006/11/22(水) 11:33:50 ID:???
ログ見ろ
それかブラウザにエラーを表示するモジュールがある
それかKENTでスクリプトエラーを表示するスクリプトが置いてある

お好きなのをどうぞ
921nobodyさん:2006/11/22(水) 11:37:28 ID:???
>>920
さっそく、ありがとうございます。
見てみます。
922nobodyさん:2006/11/22(水) 16:02:01 ID:???
>>920
そのアドバイスはないだろw
923nobodyさん:2006/11/22(水) 17:29:09 ID:???
じゃあ、とりあえずは

use strict;
use warnings;

最初にこの2行を入れておけ。
CGI書いてるんなら、

use CGI::Carp qw/fatalsToBrowser/;

これも追加。
924nobodyさん:2006/11/22(水) 19:01:32 ID:???
Apache 2.2.3 を Linux (Fedora Core 4) 上で動かしています。
Perl のバージョンは v5.8.6 です。

Apache の設定で 「LogLevel debug」 にしても (warnの場合でも)、Apache のログに Perl のエラー箇所が出力されません。

何行目にエラーがある、といった情報が欲しいのですが、この程度のエラーのみとなります。
[Wed Nov 22 18:51:19 2006] [error] [client 127.0.0.1] Premature end of script headers: test.cgi

詳しいエラーを出力する方法は無いでしょうか?

CGI/Perl のソースは次の通りです。

-----------------------------------
#!/usr/bin/perl

print "Content-Type: text/html\n\n";
hoge; # 意図的にエラーを発生させてます。
-----------------------------------
925924:2006/11/22(水) 19:03:09 ID:???
ちなみに、>>923 の3行を書いても、ブラウザには Internet Server Error で
Apache のエラーログには [Wed Nov 22 18:51:19 2006] [error] [client 127.0.0.1] Premature end of script headers: test.cgi が出力されるだけです。
926924:2006/11/22(水) 19:06:27 ID:???
すみません、Perl の改行コードが間違っていたようですorz
927924:2006/11/22(水) 19:15:19 ID:???
ほんとに申し訳ないです。

use warnings;
use CGI::Carp qw/fatalsToBrowser/;

のどちらも書かなくても、Apache のエラーログにはCGIエラーが記録されていたようです。

CGIエラーなんてもんはバーチャルホストのエラーログに記録されるに決まっている、と考えていたのですが
Apache全体のエラーログに出力されていたようです。
928nobodyさん:2006/11/22(水) 19:24:33 ID:???
>>923
use strict; は 宣言されていない変数の使用などをエラーとするなどの厳格な処理をするということであることは分かっていて、
use CGI::Carp qw/fatalsToBrowser/; はエラーをブラウザに出力する、ってことは分かるんだけど、
use warnings; って具体的にどういう時に役にたつんでしょうか?

ヘルプを見た限りでは可能な限り警告を出力する、だそうですが、
use strict; のみで出ないエラーが use warnings; で出たという経験はありません。
929nobodyさん:2006/11/22(水) 20:03:16 ID:???
>>928
横レス
perldoc perllexwarn
してみろ。例も山ほど載ってる。
930nobodyさん:2006/11/22(水) 23:29:23 ID:???
>>928
> use strict; のみで出ないエラーが use warnings; で出たという経験はありません。

大丈夫。そのうち経験できるから。
931nobodyさん:2006/11/23(木) 00:06:00 ID:???
特定のサイトのソースを定期的に取得するスクリプトを作ったんだけど、
ブラウザを閉じてもスクリプトを動かし続けるにはどうしたらいいの?
932nobodyさん:2006/11/23(木) 00:10:18 ID:???
cron
933nobodyさん:2006/11/23(木) 00:20:39 ID:???
>>932
サンキュー
934nobodyさん:2006/11/23(木) 01:26:43 ID:???
毎日ある時間になったらログファイルを削除するようにしたいのですが
cron使えないので、そのある時間以降の最初のアクセス時に消すようにしたいです

例えば毎日6時とすると

if( $now_date{'hour'} < 6){
$dtp = 1;
}

if( $now_date{'hour'} >= 6 && $dtp == 1){
unlink 'log.dat';
$dtp = 0;
}

個別に時間の取得やフラグ判定では削除はできるのですが
これを組み合わせるとうまくいきません

どうすればいいでしょうか?
935nobodyさん:2006/11/23(木) 01:49:14 ID:???
最初のアクセスかどうかはどうやって判定してるの?
あと、2つのif文の間に何かの処理があるのか知らないけど、2つ目のif文に
時刻の判定は不要では?一回目でフラグたったんだから。
936nobodyさん:2006/11/23(木) 01:52:56 ID:???
フラグをファイルかなんかに保存すれば?
937nobodyさん:2006/11/23(木) 02:00:56 ID:???
時間取得して、6時以降だったら6時の日時を書き出しし、
その日にちで判断しかない?
938934:2006/11/23(木) 02:14:59 ID:???
6時前だったらフラグを1にする

6時過ぎてフラグが1だったらログを消す
フラグを0にする

それ以降の6時過ぎのアクセスはフラグは0なので
ログ削除は実行されない

これじゃだめなのかな

939nobodyさん:2006/11/23(木) 02:21:18 ID:???
本人ならやってみなされ
940nobodyさん:2006/11/23(木) 02:22:35 ID:???
フラグってひょっとして変数のこと言ってるでしょ。いろいろ誤解してるよ。
フラグは外部にファイルか何かで残さないとだめ。下記、雰囲気のみ。

### タイムスタンプの古いフラグを削除
(-d 'flag' and (stat('flag'))[10] < $threshold_time) and rmdir 'flag';

### フラグがなければ最初のアクセス
unless (-d 'flag') {
unlink 'log.dat';
mkdir 'flag';
}
941934:2006/11/23(木) 03:11:45 ID:???
なるほどわかりました
ありがとうございます
942nobodyさん:2006/11/23(木) 16:00:23 ID:???
>>919
#!/usr/bin/perl

...
あなたの記述したperlコード
...

↓上のコードを下のように書き換えればエラーがブラウザで見えるから。
 注:エラーの行数は__END__の真下の行を1行目としてカウントされるよ。

#!/usr/bin/perl

use strict;
use warnings;

print "Content-Type: text/html\n\n";
eval join'',<DATA>;
print $@;

__END__
...
あなたの記述したperlコード
...
943nobodyさん:2006/11/23(木) 20:42:06 ID:Hjnm2TEJ
2chの名前欄に何かの文字を入力したらオミクジが引けたりするやつあるじゃないですか?
あれを掲示板につけたいんですけど
掲示板の文の中になにかの文字を入れて、オミクジの結果を表示するところまではできるんですけど
それは書き込むたびにランダムに表示が変わっちゃうんですけど。
それを1日ごとに変わるようにできないでしょうか?
944nobodyさん:2006/11/23(木) 21:09:52 ID:???
ちょっと↑の流れを読んでヒントにするんだ
945JAPU ◆lVJAPUTeX. :2006/11/23(木) 21:12:01 ID:???
$random = int(time/60/60/24) ^ unpack "%C*", $name;
とか? ただし、深夜の12時が区切りになるけど。
正確に24時間以上、という条件なら cookie でホゲ。
946nobodyさん:2006/11/23(木) 21:13:07 ID:Hjnm2TEJ
>>944
フムフム
ありがとう
947nobodyさん:2006/11/23(木) 21:13:49 ID:Hjnm2TEJ
>>945
フムフム
やってみます
948nobodyさん:2006/11/23(木) 21:14:19 ID:Hjnm2TEJ
>>945
ありがとうございます。
949nobodyさん:2006/11/23(木) 22:13:47 ID:???
最後に「r」入力したらもう一度ってのをやりたかったんですが
1度しか入力できません
何がいけないのでしょうか?簡単にやるのはどうしたらいいのでしょうか?

use strict;
my $key = 'r';
do{
#色々と
print "再実行はrを入力\n";
$key = getc;
}while($key eq 'r');
950nobodyさん:2006/11/23(木) 23:03:59 ID:???
\nがバッファされているから。一行まるごと読むべし。
951nobodyさん:2006/11/23(木) 23:05:01 ID:???
訂正。
\nが、ではなく、\nまで
952nobodyさん:2006/11/24(金) 00:08:52 ID:???
>>949
1key コマンドをやりたいなら Term::ReadKey の利用も検討してみよう。
結局使わなかったとしても、調べる過程でいくつかの事を学べるよ。
953nobodyさん:2006/11/24(金) 17:09:36 ID:???
サイトAにアクセスすると自動的にサイトBに転送される状況で、
スクリプトにサイトAのアドレスが入力された場合に、
サイトBのアドレスを表示するにはどうしたらいいの?
954nobodyさん:2006/11/24(金) 17:36:11 ID:???
転送されない状況なら何を表示するの?
955nobodyさん:2006/11/24(金) 17:52:00 ID:???
考え方としてはリンク集の登録
転送URLだったら転送後のURLとして処理
非転送URLだったらそのまま

見たいな感じ
956nobodyさん:2006/11/24(金) 18:34:51 ID:???
httpのrfcでも読めば?
957nobodyさん:2006/11/24(金) 19:07:04 ID:???
HTTP::Responseの->baseで表示できたみたい
958nobodyさん:2006/11/24(金) 21:28:29 ID:???
>>953
アダルトサイト?w
959949:2006/11/24(金) 22:01:46 ID:???
>>950-952
ありがとうございました

chomp($key = <STDIN>);でうまくいきました
Term::ReadKey;の使った方もできました
でも仕組みはよくわかりませんが
がんばって勉強します・・・
960nobodyさん:2006/11/24(金) 23:14:45 ID:???
>>958
違うよw
この文章でエロサイトが思い浮かぶなんて相当あれだな
961nobodyさん:2006/11/25(土) 02:40:29 ID:???
相当あれじゃなくて、その程度も思いつかないのがあれでしょ
962nobodyさん:2006/11/25(土) 02:41:15 ID:???
ま、アレってことでひとつ…
963nobodyさん:2006/11/25(土) 09:10:31 ID:???
httpのrfcとか言ってるようじゃまだまだだな
964nobodyさん:2006/11/25(土) 13:24:40 ID:???
フォームから送られてきたデータを分解する時に、

$value =~ tr/+/ /;

がよく使われてるんだけど、


複数の文字じゃないのに「$value =~ s/+/ /;」を使わない理由、
そもそもなぜ「+」をスペースに変換する必要があるのか
教えて
965nobodyさん:2006/11/25(土) 13:51:10 ID:???
1つ上も読めないのか?
966nobodyさん:2006/11/25(土) 14:29:50 ID:???
常識的に考えて、文字の置換(変換)するだけなら s/// より tr/// の方が速いだろ・・・
「+」をスペースに変換する必要があるのは、スペースが「+」に変換されてるからだろ・・・
967nobodyさん:2006/11/25(土) 16:06:45 ID:5hW/EMoW
2chのおみくじあるじゃないですか?
あれってどうすればいいですかね?
968nobodyさん:2006/11/25(土) 16:08:05 ID:???
↑ダメな質問の例
969nobodyさん:2006/11/25(土) 16:11:17 ID:???
名前が!omikujiなら、ランダムで結果に変換。
970nobodyさん:2006/11/25(土) 16:23:19 ID:5hW/EMoW
>>969
そのやりかたを詳しく
971nobodyさん:2006/11/25(土) 16:32:40 ID:???
(´・ω・`)そこを考えるのを楽しめないんだったら、、、
972nobodyさん:2006/11/25(土) 16:33:21 ID:???
>>970
どれくらい?
973nobodyさん:2006/11/25(土) 16:54:42 ID:5hW/EMoW
>>972
すべて
974nobodyさん:2006/11/25(土) 17:01:34 ID:???
>>973
丸投げスレへGo!
975nobodyさん:2006/11/25(土) 20:26:36 ID:Nft95t5x
>>974
ありがとう
976nobodyさん:2006/11/25(土) 21:53:33 ID:???
>>966
なるほどなるほど
977nobodyさん:2006/11/26(日) 10:21:34 ID:???
jcode.pmはモジュールだからサーバにインストールして使うものだと聞いてたんだけど、
jcode.pmとjcodeのディレクトリをアップしてuse libでパスを指定したら動いた
この使い方は推奨されてない?
978nobodyさん:2006/11/26(日) 10:24:05 ID:???
jcode.pmなんて知りません><
979nobodyさん:2006/11/26(日) 10:44:06 ID:???
標準モジュールに Encode があるから推奨されないっちゃされないが、
Encode で期待する動作が得られないならそれも仕方無いかと思う。
あと、Encode はコスト高いって聞くし、Jcode.pm が軽いならいいんじゃないかな。
980JAPU ◆lVJAPUTeX. :2006/11/26(日) 11:36:06 ID:???
>>977
Jcodeに限らず、必要なモジュールが導入されていない場合に自前で用意して use lib して使用するのは普通です。
ただし、>>979で書かれている通り、可能であればEncodeを利用するべきでしょう。

>>979
2.0 <= $Jcode::VERSION and 5.008001 <= $] の環境では、JcodeはEncodeのwrapperとして動作します。
したがって、速度はほぼ変わりません。


# Encodeが標準ではない環境もまだあるので、一概にEncodeを使うべきとは言い切れないところ。
981nobodyさん:2006/11/26(日) 12:07:09 ID:Y4Eo2nyo
連続投稿規制のようなものをつけるにはどうすればいいですか?
982nobodyさん:2006/11/26(日) 12:17:11 ID:???
まずは>>1をよく読んで
983nobodyさん:2006/11/26(日) 12:19:07 ID:Y4Eo2nyo
読んだ
984nobodyさん:2006/11/26(日) 12:22:56 ID:???
読んだやつがそんなレスはしないけどな。おかしいなあ
985nobodyさん:2006/11/26(日) 12:27:43 ID:???
読んだやつはそんなレスをするよ
986nobodyさん:2006/11/26(日) 12:30:57 ID:???
>>981
あくまで自分で改造したい場合:
http://pc8.2ch.net/test/read.cgi/php/1143834740/
結果だけ欲しい場合:
http://pc8.2ch.net/test/read.cgi/php/1157787046/

はい、次どうぞ。
987nobodyさん:2006/11/26(日) 12:32:46 ID:Y4Eo2nyo
>>986
どうも
988nobodyさん:2006/11/26(日) 14:02:28 ID:???
Encodeモジュールって使わない方が良いって話じゃなかったっけ?
989JAPU ◆lVJAPUTeX. :2006/11/26(日) 14:07:50 ID:???
encoding は使わないほうが良いって話はあるけど。
990nobodyさん:2006/11/26(日) 14:21:07 ID:???
mod_perlとかだと他の人まで影響与えちゃうってのはencode?
991nobodyさん:2006/11/26(日) 14:23:31 ID:???
>>979-980
ありがとう
992nobodyさん:2006/11/26(日) 14:34:31 ID:???
>>988
>>200,202,204,206
現行スレくらいチェックしようや。
993nobodyさん:2006/11/26(日) 14:44:42 ID:???
994nobodyさん:2006/11/26(日) 14:50:14 ID:???
新スレおつ
995nobodyさん:2006/11/26(日) 15:30:53 ID:???
そして埋め1
996nobodyさん:2006/11/26(日) 18:23:52 ID:???
埋め2
997nobodyさん:2006/11/26(日) 18:44:21 ID:???
998nobodyさん:2006/11/26(日) 19:46:07 ID:???
とりゃあ
999nobodyさん:2006/11/26(日) 19:47:28 ID:???
1000なら今日中に仕事が終わる
1000nobodyさん:2006/11/26(日) 19:51:26 ID:???
なにこの余裕の1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。