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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2009/09/03(木) 23:51:12ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1234752149/
0166nobodyさん2009/10/10(土) 07:40:33ID:???
>>165
こんな感じかなー

m{[^/]+$}
0167nobodyさん2009/10/10(土) 11:35:43ID:???
もっと素直に書いたほうがいい

/.*\/(.*)/

最長マッチ使って .*/ と書くといちばん最後の / までにマッチするからそれ以降全部を取得すればいい
0168nobodyさん2009/10/10(土) 11:50:35ID:???
>>166の方が目的が明確で好きだな。
0169nobodyさん2009/10/10(土) 12:07:50ID:???
ベンチマークとったよ。ずれてたらごめんね。

          Rate >>165 >>166 >>167
>>165 119048/s    --  -53%  -69%
>>166 253165/s  113%    --  -35%
>>167 389105/s  227%   54%    --

というわけで、167が偉いという結論になりました。
01701692009/10/10(土) 12:09:42ID:???
補足しておくと、
僕も166のように書いてしまいがちです。
へぼコーダーです。
修行が足りない。
0171nobodyさん2009/10/10(土) 12:12:10ID:???
ちなみにコード
#!/usr/bin/local/perl
use strict;
use warnings;
use Benchmark qw/timethese cmpthese/;

my $results = timethese(1000000,
    {'>>165'=>'my $url= "http://hogehoge.jp/test/archive/test3.html"; @_ = split("\/",$url); $_=$_[-1];',
     '>>166'=>'my $url= "http://hogehoge.jp/test/archive/test3.html"; $url=~m{[^/]+$} ; $_=$&;',
     '>>167'=>'my $url= "http://hogehoge.jp/test/archive/test3.html"; $url=~/.*\/(.*)/; $_=$1;',
    },'none');
cmpthese($results);
1行が長くてごめんなさい。
01721612009/10/10(土) 13:58:31ID:viNfW09K
>>162
ありがとうござます。

もう1つ聞きたいのですが、全部カタカナである文字列のマッチはどう書くのでしょうか?(文字コード:utf8)
0173nobodyさん2009/10/10(土) 14:26:26ID:???
>>169-171
追試。

#!/usr/bin/perl -w
use strict;
use Benchmark qw(cmpthese timethese);
my $url = $ARGV[0];
my $results = timethese(-5, {
  split => sub { my $file = (split qr|/|, $url)[-1] },
  match => sub { $url =~ m|^(?:.*/)?(.*)\z|s; my $file = $1 },
  rmatch => sub { $url =~ m|([^/]*)\z|s; my $file = $1 },
  replace => sub { (my $file = $url) =~ s|^.*/||s },
  substr => sub { my $file = substr $url, rindex($url, '/') + 1 },
}); print "\n";
cmpthese($results);

__END__

> perl test.script "http://example.jp/path/to/file.html"
Benchmark: running match, replace, rmatch, split, substr for at least 5 CPU seconds...
match: 6 wallclock secs ( 5.30 usr + 0.00 sys = 5.30 CPU) @ 725417.52/s (n=3843262)
replace: 6 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 2177060.73/s (n=11292414)
rmatch: 6 wallclock secs ( 5.23 usr + 0.00 sys = 5.23 CPU) @ 95000.19/s (n=497326)
split: 4 wallclock secs ( 5.16 usr + 0.00 sys = 5.16 CPU) @ 175469.36/s (n=904720)
substr: 5 wallclock secs ( 5.08 usr + 0.00 sys = 5.08 CPU) @ 3129401.38/s (n=15897359)

Rate rmatch split match replace substr
rmatch 95000/s -- -46% -87% -96% -97%
split 175469/s 85% -- -76% -92% -94%
match 725418/s 664% 313% -- -67% -77%
replace 2177061/s 2192% 1141% 200% -- -30%
substr 3129401/s 3194% 1683% 331% 44% --
0174nobodyさん2009/10/10(土) 14:28:02ID:???
> perl test.script "file.html"
Benchmark: running match, replace, rmatch, split, substr for at least 5 CPU seconds...
match: 6 wallclock secs ( 5.36 usr + 0.00 sys = 5.36 CPU) @ 720711.14/s (n=3862291)
replace: 6 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 5086089.07/s (n=26381544)
rmatch: 5 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 840637.43/s (n=4361227)
split: 6 wallclock secs ( 5.27 usr + 0.00 sys = 5.27 CPU) @ 285616.14/s (n=1503769)
substr: 4 wallclock secs ( 5.31 usr + 0.00 sys = 5.31 CPU) @ 3257009.79/s (n=17301236)

Rate split match rmatch substr replace
split 285616/s -- -60% -66% -91% -94%
match 720711/s 152% -- -14% -78% -86%
rmatch 840637/s 194% 17% -- -74% -83%
substr 3257010/s 1040% 352% 287% -- -36%
replace 5086089/s 1681% 606% 505% 56% --

> perl test.script "http://example.jp/l/o/n/g/l/o/n/g/l/o/n/g/p/a/t/h/t/o/file.html"
Benchmark: running match, replace, rmatch, split, substr for at least 5 CPU seconds...
match: 5 wallclock secs ( 5.23 usr + 0.00 sys = 5.23 CPU) @ 714051.59/s (n=3737346)
replace: 4 wallclock secs ( 5.25 usr + 0.00 sys = 5.25 CPU) @ 2172917.32/s (n=11405643)
rmatch: 5 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 63767.54/s (n=330826)
split: 4 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 85094.45/s (n=441470)
substr: 5 wallclock secs ( 5.03 usr + 0.00 sys = 5.03 CPU) @ 3018419.40/s (n=15185668)

Rate rmatch split match replace substr
rmatch 63768/s -- -25% -91% -97% -98%
split 85094/s 33% -- -88% -96% -97%
match 714052/s 1020% 739% -- -67% -76%
replace 2172917/s 3308% 2454% 204% -- -28%
substr 3018419/s 4633% 3447% 323% 39% --
0175nobodyさん2009/10/10(土) 14:48:50ID:???
>>172
decodeしてるなら、

/^\p{InKatakana}+$/

でいけるかもしれん。
0176nobodyさん2009/10/10(土) 15:08:34ID:???
>>165

正規表現で書くなら

m{[^/] (.+) \z}xms

jk
0177nobodyさん2009/10/10(土) 15:51:30ID:???
>>172
/^[ア-ン]+$/;

ちったあ試せばいいと思うよ
01781652009/10/10(土) 17:18:28ID:ia/oAbqC
>>166
>>167
>>176→(訂正っす) m{\z\/(.*)} ですよね?

ありがとうございます。

# 最長でマッチさせたあとに取得
$url =~ /.*\/(.*)/;

# / 以外が続く行末まで
$url =~ m{([^/]+$)};

# 最後に見つかった / より後ろ
# \z 文字列の最後にマッチする。(Perl5.005以降)
$url =~ m{\z\/(.*)};


/.*\/(.*)/ を使わせていただきます。


今思えば、正規表現が今より苦手なころは
「めんどくせーから、行頭から欲しい部分の直前までマッチさせて、その残りをマッチさせて得てた」
と思い出しましたw

個人的には \z もなかなかいい感じなので、\z の存在を覚えていきたいとこ・・・
0179nobodyさん2009/10/10(土) 18:16:02ID:???
>>177
おまえもちったぁ試したらどうだ。UTF-8のマッピングがどうなってるかとかさ。
0180nobodyさん2009/10/10(土) 18:23:47ID:???
>>179
ここ↓を見て本人が好きな範囲を選べばいいよね

http://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_3000-3FFF
0181nobodyさん2009/10/10(土) 20:45:28ID:???
179が何にキレてるのか分からない
0182nobodyさん2009/10/10(土) 21:21:15ID:???
子供の頃、お菓子類をよく食べてると切れやすいという研究結果が出てたよね
0183nobodyさん2009/10/11(日) 02:16:07ID:???
>>181
ァヴヵヶの文字でコケるからだと思う。
0184nobodyさん2009/10/11(日) 03:03:33ID:SfXKxhoo
>>178
まとめ乙。
勉強になりました。

いまちょっと試せないけど、これはどうかな?

m|/(.*?)$|

ハテナは最短一致の修飾子だから、
たぶん動くと思うんだけど。
0185nobodyさん2009/10/11(日) 14:51:42ID:???
全体でマッチさせるように頭に".*"を付けるだけで速くなる。
しかし、単純な".*"が最速になるようにチューニングされてるのか、
>>167を超えられない。
文字クラスマンセーだったけど、考え直さないとだめかもダメだね。
0186nobodyさん2009/10/13(火) 19:54:24ID:???
use utf8とかしていなければ、正規表現使わないで書いたほうが速い気がする

それはそうと、URL末尾に/が来ないことは考えなくていいの?
read.cgi/とかco.jp/とか、サニタイズされてないhoge.html/.././とか。
他にも、用途によるけど、拡張子jpgのGIFでしたとか偽装したのは弾かなくていいの?
0187nobodyさん2009/10/13(火) 20:02:30ID:???
>>186
誤爆?
せめてレス番つけないと、何を誰に言ってるのか分からん。
0188nobodyさん2009/10/13(火) 20:22:13ID:???
超初心者ですが質問させてください。

メールアドレスの@の前のピリオドが付いているアドレスは、
正しくありませんとエラーが出るのですが、
正規表現?のエラーだと思うのですが、対処法がわかりません。

ネットで色々調べたのですが、文字列を追加するとか…
$mail_regexの後の文字列のどこに追加すればいいのでしょうか?
初歩的な質問で申し訳ないです。。環境はwindowsXPです。
0189nobodyさん2009/10/13(火) 20:45:03ID:???
エスパー1名様お呼びです
0190nobodyさん2009/10/13(火) 21:40:42ID:???
>>188
当方、エスパー度かなり高いほうですが、一つだけ質問させてください。
$mail_regexにどのような文字列が代入されているのか教えてください。
0191nobodyさん2009/10/13(火) 21:44:18ID:pHeszieI
>>188
$mail_regex = quotemeta($mail_regex);
0192nobodyさん2009/10/13(火) 22:26:16ID:???
>>188
ってか、RFC絡みの(メールサーバー側の)エラーじゃねえの、
ドコモ携帯宛てのメアドとか。
0193nobodyさん2009/10/13(火) 22:31:50ID:???
>>188
これでどうだ?

$mail_regex = 〜〜 . '|^[\w.-]+@(?:[\w-]+\.)+[\w-]+$';
0194nobodyさん2009/10/13(火) 23:40:03ID:???
本来、@ の直前に . がつくメールアドレスはメールの規格として正しくない。
だからエラーとして弾く処理は正しい。
しかしDoCoMoとauがこの規格外のメールアドレスを正しいものとして扱ってしまっているので話がややこしい。
ぶっちゃけDoCoMoとauは氏ね。
という前提知識が必要な話ですね。
0195nobodyさん2009/10/14(水) 00:25:09ID:???
DoCoMoもauもこれから新しく 〜.@〜 ってなるアドレスは取れなくなってるよ
まあ、今までに取ってるアドレスは有効なんだけどね
0196nobodyさん2009/10/14(水) 00:29:50ID:???
>>188
正規の規格はともかく、はじかなくていいピリオドをはじいちゃっているわけで、
$mail_regexに文字列を追加するんじゃなくて、文字列を変更する必要があると思われます。
ので、ここにその$mail_regex後の文字列を書いた方がいい。
0197nobodyさん2009/10/14(水) 01:29:31ID:???
188です。
皆様レスありがとうございます。

そうですよね。$mail_regexにどのような文字列が入っているかわからないと
答えようがないですよね…。
いま自宅なので書けないんです。なんせめちゃくちゃ長かったので…
申し訳ないです。

>>193さんが書いている文字列. '|^[\w.-]+@(?:[\w-]+\.)+[\w-]+$';を追加すると解決しますか?
管理システム側でのエラーなので、変更して解決しないと、恐ろしい事になる可能性があるんです 汗
0198nobodyさん2009/10/14(水) 02:14:04ID:???
エスパーして、Perlメモの正規表現だとしたら、
"foo."@example.net
みたいにダブルクォートすれば解決すると思う。
0199nobodyさん2009/10/14(水) 09:51:32ID:???
188です。
文字列を書いたのですが、本文が長すぎて書き込めなかったので、分けて書かせていただきます。



$mail_regex = '[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*
(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*
(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*
(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*
(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff]
[^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*
02001882009/10/14(水) 09:56:21ID:???
すいません。。
長すぎてくじけました 汗
かなりのスレ汚しになってしまうので、やめておきます。
ありがとうございました。
0201nobodyさん2009/10/14(水) 10:44:33ID:???
codepadとか使やいいのに
0202nobodyさん2009/10/14(水) 22:18:23ID:???
いっそ尊敬するわ
0203nobodyさん2009/10/15(木) 18:04:11ID:YQ/YK35J
>>183
マジレスするとヶとヵはカタカナじゃない。箇の略字(个・ケ)が回りまわってそうなった。
一箇所→一ヶ所
ヶなのに「カ」と読むので、不思議に思った人が「ヵ」を使い出してそれも普及した。
ヶやヵを使う日本語のカタカナ語って存在しないだろ。

んで、UTF-8はuse utf8しないとメチャクチャになるし、旧来の正規表現(ァ-ン)だと「ー」や「ヴ」なんかを取りこぼすな。
\p{InKatakana}だろjk。

>>188
@の前に「.」が付いてるメールアドレスは正当じゃありません。アドレスの方が悪い。
プログラムのせいにすんな。

>>193
メアドの正規表現なめんな。>>199で短く書いた方だ。
http://www.din.or.jp/~ohzaki/mail_regex.htm#RFC

>>197
その正規表現自体、2chが文字変換する関係?か何かでコケるんだが、6行目の
(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff]
を
(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*\.?@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff]
に変更してみ。ものすごいクイックハックだが@の前に\.?を挿入してある。
0204nobodyさん2009/10/15(木) 18:09:09ID:???
>>197
あ、最後の行に対応する括弧がないな。まだ続きあるだろそれ。まあ多分>>203で間に合うからいいけど。

さらにInKatakanaの中にはしっかりヶとヵが入ってるんだな。まあ昔からマの間ではカタカナ扱いされてたけど。
02051832009/10/15(木) 18:59:55ID:???
>>204
マジレスすると、unicodeではカタカナ分類なんだ。
30F5 KATAKANA LETTER SMALL KA
30F6 KATAKANA LETTER SMALL KE

http://www.unicode.org/charts/PDF/U30A0.pdf
0206nobodyさん2009/10/16(金) 18:38:09ID:???
use Email::Valid::Loose;
0207nobodyさん2009/10/20(火) 12:41:02ID:???
each関数でリファレンスで受け取ったハッシュを引数にしてwhileに入れて使ったのですが一回もループせずにそのまま脱出してしまいました。
何故ですか?keys関数を使うとちゃんと値が返ってくるので中身がないことはないはずです。
0208nobodyさん2009/10/20(火) 12:57:20ID:kwSavA/j
earch(%{$chanko})
02092072009/10/20(火) 13:06:53ID:???
>>208
成る程、そうやって書くんですね!
解決しました、どうもです
0210nobodyさん2009/10/20(火) 20:18:27ID:???
こうしてエスパーたちは鍛えられていく
0211nobodyさん2009/10/20(火) 21:38:06ID:kwSavA/j
いや自分も初心者だから想像はついたw
0212nobodyさん2009/10/20(火) 22:24:14ID:???
初心者perlerは引かれあう・・・
0213nobodyさん2009/10/22(木) 06:34:07ID:???
えっとものすごい初歩的というかperlというものを知ったのが昨日なので
できるかどうかが知りたいだけなのですが、質問です
とあるCGIゲームでマクロというものを使うと楽という話を聞き、やってみようと思ったわけです
ですがどうも既存のツール等では上手くいかず、それならプログラムを自作してみようと思い立ったのですが
範囲内の色に反応して数をカウントしていくようにしたいのですが、こういうことは可能なのでしょうか?
0214nobodyさん2009/10/22(木) 07:51:32ID:???
とあるCGIゲーム、だけじゃ答えようがないような。
CGIゲームを提供する方なのか、それとも解く方なのか。
後者だとして、「CGIゲーム」といいつつ実はJavaアプレットだったりFlashだったりしそうな予感。
単純にHTMLを対象にどうこうするだけならJavaScriptが最適っぽい気がするが…たぶん関係ないな。
0215nobodyさん2009/10/22(木) 08:44:03ID:???
CGIゲームをプレイする側ですね
具体的に何をしたいのかは
画面内から特定の色を検出して、その出現回数をカウントしたあとに結果を表示するものなのですが・・・
特定の色の検出が調べてもわからなかったので質問してみたのですが・・・
0216nobodyさん2009/10/22(木) 09:06:31ID:???
死ぬ気で半年くらい頑張れば簡単にできるんじゃない?
0217nobodyさん2009/10/22(木) 11:24:40ID:???
なんでプレイする側の人間がPerlスレで聞いたんだ?
0218nobodyさん2009/10/22(木) 16:12:06ID:???
>>215
その「画面内の特定の色」がどうやって表示されているのかがわからなければ
そもそも解決できるかどうかすら答えようがないんでないかい。
どんなゲームなのか、CGIゲームってんだから具体的にURLを示した方が手っ取り早そうだが。

それ以前に「マクロ」から「Perl」へのつながりがすげえ謎。何故Perl。
0219nobodyさん2009/10/22(木) 16:52:20ID:???
要はオンラインゲーのチートツールを作りたいってことでしょ。
まあ、板違いだわな。
0220nobodyさん2009/10/22(木) 23:09:23ID:???
Win32::CaptureIEを使ってだな

後は画像解析だからPerlに限った話ではないな
0221nobodyさん2009/10/23(金) 11:34:54ID:Y/3I6hzw

クッキーを受け取って送信したいのですが、cookie_jar に保存されていません。
正確には、「#LWP-Cookies-1.0」のみが書き込まれる。
↓のコードで合ってますか?よくある原因などありましたら教えてください。

$ua = LWP::UserAgent->new;
my $cookie_jar = HTTP::Cookies->new(file => "./cookies", autosave => 1);
$ua->cookie_jar($cookie_jar);
$response = $ua->request($request);

なお、$response->contentは正常に取れてます。
0222nobodyさん2009/10/23(金) 12:35:26ID:fdJYCoLf
iframe とか JavaScript で cookie 発行されてたら、それも記録されないです
02232212009/10/23(金) 19:33:11ID:Y/3I6hzw
ソースを見る限りは、javascript や iframe でなんかやってるわけじゃ
なさそうです。googleアドセンスのjavascriptはあるけど・・・
02242212009/10/23(金) 20:02:16ID:Y/3I6hzw
すみません。
なぜか出来ました・・・一人でお騒がせしました。
0225nobodyさん2009/11/08(日) 11:49:33ID:???
SSIページ(index.shtml)に
<!--include virtual="〜">のタグを埋め込んでおき、
index.shtmlに携帯からアクセスしてきた際に
携帯用トップページにジャンプさせるCGIを作成しています。

index.shtmlファイルから(text/html)でヘッダ出力した後に
CGIから、Location:http://〜ヘッダを送信すると
うまくジャンプしません。

知りたいのは、
先にサーバーから出力された*.shtmlのヘッダを中止し、
新たに出力しなおす方法があれば知りたいのですが、
なにか良い方法はありませんでしょうか?

<meta>タグのURL転送での解決方法は一部の携帯キャリアが対応してないため使えません。

何か良い方法があればご教授願います。
0226nobodyさん2009/11/08(日) 12:31:27ID:???
CGI はどこから出てきたの?
0227nobodyさん2009/11/08(日) 12:41:39ID:???
トップページをcgiにする
02282252009/11/08(日) 14:26:09ID:???
>>226
配布されているものでなくて自作で作ってます。

>>227
index.shtmlをやめてindex.cgiを自作にすると
socket関数が使わないといけないことになるため、
面倒なことになるので避けたい感じです

あと、.htaccessでリダイレクトさせる方法も検討しましたが
.htaccessは、MIME設定とBASIC認証のみにしか利用できない
設定になっています

最後に、12万ファイルあるコンテンツなので
鯖の移転もちょっと。。ってな感じです(><)
02292252009/11/08(日) 14:52:59ID:???
今つくってるのは
こんな感じです

#!/usr/bin/perl
#キャリア振分
$ua = $ENV{"HTTP_USER_AGENT"};
if ($ua =~ /DoCoMo\/1\.0/i) { $CR='Docomo'; }
elsif ($ua =~ /(DoCoMo\/2\.0|FOMA)/i) { $CR='Docomo'; }
elsif ($ua =~ /^(SoftBank|Vodafone|J\-PHONE|MOT\-[CV])/i) { $CR='SoftBank'; }
elsif ($ua =~ /^UP\.Browser/i) { $CR='EzWeb'; }
elsif ($ua =~ /^(KDDI\-|OPWV|MMP)/i) { $CR='EzWeb'; }
else { $CR='PC'; }
#URL転送処理
if ($CR eq "Docomo") {
##ここでshtmlの出力ヘッダを取りやめたい##
print "Location: http://ドコモのURL";
} elsif ($CR eq "EzWeb") {
##ここでshtmlの出力ヘッダを取りやめたい##
print "Location: http://EzWebのURL";
} elsif ($CR eq "SoftBank") {
##ここでshtmlの出力ヘッダを取りやめたい##
print "Location: http://SoftBankのURL";
} else {
print "Content-type: text/html\n\n";
}
exit;
0230nobodyさん2009/11/08(日) 15:52:38ID:???
> 最後に、12万ファイルあるコンテンツなので
> 鯖の移転もちょっと。。ってな感じです(><)

そんな大切なコンテンツの運命を、こんな低俗な掲示板に求めていいのか?
02312252009/11/08(日) 21:01:31ID:???
>>230
そのうち11万8000ファイルはBBSから8年間かけて書き出された
ログファイルなので
そこまで、たいしたコンテンツでもありません。

2ch以外のフォーラム(4ヶ所ほど)でも聞いたのですが、
なかなか解決策が出てこなくて、こちらにも書込みしました。
0232nobodyさん2009/11/09(月) 09:27:28ID:???
CGIだとsocketを使わなければならなくて面倒というのが意味不明だな。
そんなことはないのでCGIでやれ。
02332252009/11/09(月) 13:23:21ID:???
index.cgiを作成した場合
「socket使う」=「面倒」 と書いた理由を述べます

index.shtmlに
�@<!--include virtual="ナントカ.inc"> の記述が4ヶ所
�A<!--include virtual="ナントカ.cgi"> の記述が9ヶ所

�@は参照先がテキストなどので、open関数でクリアできる
�Aを�@の方法でやるとperlソースが流れ込んでくるので、socket関数で対応するか
または、参照先のCGIをテキストファイル書き出しにする。

ってな感じです。(><)
0234nobodyさん2009/11/09(月) 13:35:26ID:???
>>233
つLWP

いまどきそんなことのために生でsocketからコード書く奴はいねーよ。
0235nobodyさん2009/11/09(月) 13:39:54ID:???
>>233
次におまえは「私が使っているサーバにはLWPが入っていません」と言う

つーか死ぬまで苦労してろ...
0236nobodyさん2009/11/09(月) 14:11:03ID:a1ezikgd
質問です。CGIでsystem文を使って外部プログラムを実行します。 そのプログラムが終了まで数十分ほどかかる場合、実行の仕方や タイムアウトなどの処理はどのように組めばいいのでしょうか? 教えて下さい。
0237nobodyさん2009/11/09(月) 15:37:29ID:???
まさかと思うが共用レンタルサーバでやろうとしてないだろうね?
なら死ね。

ブラウザ側には実行(待機)中であることを示して、STDOUTを開放する。
その際SIDかPIDか何かから一意なIDを作っておく。
外部プログラムはforkかcronでバックグラウンド動作させる。
外部プログラムの実行状態はAjaxでもしくは普通にcgiで得られるようにする。シグナルを送れば何%処理中か返すように外部プログラムを作っておくと吉。

妄想だけど多分こんなもんだろ。
0238nobodyさん2009/11/10(火) 06:22:57ID:???
レン鯖のCGIの設定なら30秒ぐらいでプロセスがkillされちゃうから、どのみち無理。
ジョブキューを使うか、デーモン化した方がいいと思うけどな。
0239nobodyさん2009/11/12(木) 21:37:51ID:???
まー、何言ってもできない理由を探してくるだけだろ。
0240nobodyさん2009/11/16(月) 11:02:56ID:D4PXiJWR
ほっしゅ
0241nobodyさん2009/11/16(月) 20:59:19ID:???
cure っていうコスプレサイトでエラー画面出てた
http://spicky.net/vipper/uploads/spicky/9/5/8/1859_zeL8gI2.png
http://spicky.net/vipper/image/1859/
0242nobodyさん2009/11/17(火) 15:14:45ID:???
if(isset($_GET["url"])) readfile($_GET["url"]);
をPerlで書きたいのですが、どう記述したらいいものでしょうか?
0243nobodyさん2009/11/17(火) 16:15:15ID:???
PHPのreadlineとか激しく複雑なので完璧ではないが、
だいたいこんな感じかね?

use CGI;
use LWP::Simple;

my $q = CGI->new;
my $url = $q->param('url');
if (defined $url) {
get($url);
}
0244nobodyさん2009/11/18(水) 00:14:38ID:???
phpってそんな風に書くのか。cgi-lib.plの時代のperlみたいだな
0245nobodyさん2009/11/18(水) 14:54:08ID:???
>>244
0246nobodyさん2009/11/18(水) 23:48:59ID:???
tomcatのcgi-bin内でPerlを動かしているんですが、
ソケット通信ができません。
同じプログラムでapatheで動かすとソケット通信できます。

tomcatで何か設定が必要なのでしょうか
0247nobodyさん2009/11/19(木) 05:28:08ID:ZQXO+cvV
>>246
アクセスできるディレクトリやパーミッションに制約があるのでは?
匿名ソケットを使ってるなら知らんけど。
0248nobodyさん2009/11/19(木) 05:31:23ID:ZQXO+cvV
>>208
> earch(%{$chanko})

訂正しときますね。

each %$chanko
0249nobodyさん2009/11/19(木) 05:52:42ID:ZQXO+cvV
>>236
どう見たいかによる。
数十分かかってもライブで表示したいなら、サーバ(アパッチー?)のタイムアウト設定を十分長くする。
途中経過も見たいなら、ダブルフォークかなにかでバックグランドへ落としたあと
NPHかリダイレクトを使って、チェックした状態を表示。
ユーザが自由にアクセスできるようにするなら、確認用IDを発行するか、クッキーを食わせとく。

一番簡単な解決は、実行終了後に結果をメールで送りつけること。
もしくは結果表示用スクリプトのアドレスを送る。
0250nobodyさん2009/11/19(木) 15:05:03ID:pgc2wImK
useでモジュールをロードできなかった場合に対処するコードを書いています。
eval "use Hoge::Hoge"; if ($@) { use Hoge::Hoge2; }

ある程度うまくいくのですが、失敗する場合もあり、原因がわからずにいます。
まったく同じ内容でpackage名だけが違うモジュールでテストしてみると・・・
(内容は$nameの定義とエクスポートだけ)
Hoge/Hoge.pm -> package Hoge::Hoge;
Fuga/Hoge.pm -> package Fuga::Hoge;

[1] eval "use Hoge::Hoge"; #=>存在するので読み込まれる
[2] eval "use Fuga::Hoge"; #=>存在するのに$@がセットされる($@は空の様子)
※[1]と[2]は別々にテストしています。

[2]のエラーメッセージは
Global symbol "$name" requires explicit package name at ...
use strictをはずして警告を見てみると、
$nameを参照しようとしたときに次のメッセージが出ます。
Name "main::name" used only once: possible typo at ...

[2]の場合も通常にuseすると問題ありませんし、次も成功します。
BEGIN {
 eval { require Fuga::Hoge; Fuga::Hoge->import(); }; if ($@) { (略) }
}

[2]だけ失敗してるいまいち理由がわからないんですが、
どういう状況か見当つきますか?
0251nobodyさん2009/11/19(木) 15:09:31ID:???
もうすこしちゃんとソースをさらしてもらわないと説明だけでは
何をしてるのかわからん。
02522502009/11/19(木) 15:17:07ID:pgc2wImK
す、すみません。[2]のモジュールのソースは以下です。
package Fuga::Hoge;
our @EXPORT = qw($name);
use base qw(Exporter);
$name = 'myname';
1;

[1]はpackage名だけが違って、それぞれのパスに配置しています。
package Hoge::Fuga;

[1]は
eval "use Hoge::Fuga";
が評価されて$nameをimportできるのに、[2]だけ>>250の警告が出る状況です。
違いがわからないのと、メッセージの意味がじゅうぶん理解できなくて・・・
02532502009/11/19(木) 16:26:33ID:???
しばらく試しているのですが、どうも通常のuseと、evalした場合とでは
細かい違いがいろいろあるみたいです。
例えばモジュールでget_nameというサブルーチンをエクスポートしているとき、
通常のuseですと
my $name = get_name;
でOKですが、evalではエラーになったりするみたいです。
my $name = get_name(); #カッコがないとエラー

質問させてもらった件も、今ひとつつかみどころがない感じなので、
当面は安定を確認しているBEGINブロック内に記述する方法をとることにして、
尚、ドキュメントをあたってみたいと思います。

>>251さん、ありがとうございました。
0254nobodyさん2009/11/19(木) 16:40:34ID:???
見た感じ読み込まれるモジュールの方は問題なさげなので
[1]とか[2]とか言ってる読み込み側のプログラムもきっちり
さらしてもらわないとわからんな。

BEGINブロックをつかわないでuseをeval "use 〜" に置き換えると
読み込まれるにタイミングが変わるのでuse strictのコンパイル時
チェックに間に合わないというのはよくある話なんだが、全く同じで
片方だけおかしいとかいうことはないはずだしなんか違いがあるん
だろう。
0255nobodyさん2009/11/20(金) 16:12:32ID:???
if ($ENV{'REQUEST_METHOD'} eq "POST") {
 read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
 @pairs = split(/&/,$buffer);
 for $pair (@pairs) {
 ($name, $value) = split(/=/, $pair);
 $value =~ tr/+/ /;
 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
 Encode::from_to($value, 'utf8', 'utf8');
 $in{$name} = $value;
}

のようなありきたりのフォーム取得構文を
enctype="multipart/form-data"
に対応させるために

use CGI;
my $query = CGI->new;
my $user = $query->param('user');
のような構文を使って

$in{'name'}=$value形式で受けとりたいのですが
どのように記述したらよいでしょうか?
0256nobodyさん2009/11/20(金) 16:45:27ID:???
>>255
use CGI;
my $query = CGI->new;
*in = $query->Vars();
0257nobodyさん2009/11/20(金) 17:56:52ID:???
>>256
ありがとう動いた
0258nobodyさん2009/11/20(金) 18:50:54ID:???
もうちょっとだけお付き合いください

フォーム側で
<input type="file" name="tempfile">としたものを

>>256 の方法で受け取り
open(SAVE,"> up.jpg");
binmode(SAVE);
binmode(STDOUT);
print SAVE $tempfile;
close(SAVE);
で保存すると、up.jpgというファイルの中身に
添付ファイルのバイナリでなく、
アップロードしたファイル名のみがテキストで記述されてました。

この場合は、$in{'tempfile'}の中身にはファイル名しか格納されていないことになります

enctype="multipart/form-data"の場合は別の変数になるのでしょうか?
0259nobodyさん2009/11/20(金) 19:46:05ID:???
>>258
こうすると、うまくいきます?

print SAVE $tempfile;

   ↓   ↓

print SAVE <$tempfile>;
0260nobodyさん2009/11/20(金) 21:19:20ID:???
てすと
02612582009/11/20(金) 21:42:40ID:???
>>259
ダメでしたorz
結果は同じでした
02622582009/11/20(金) 21:51:20ID:???
っしゃ!解決できました
調べてみたら、Varsとparamを両方つかわないといけないっぽいです

use CGI;
#データの取得 $in{'name'}で取得
if ($ENV{'REQUEST_METHOD'} eq "POST") {
 my $query = CGI->new;
 *in = $query->Vars();
}
#ファイルの取得
my $query = CGI->new;
$upfile= $query->param('tempfile');
#ファイルの書込
open(SAVE,"> up.jpg");
binmode(SAVE);
binmode(STDOUT);
while (read($upfile, $buffer, 1024)) {
 print SAVE $buffer;
}
close(SAVE);
0263nobodyさん2009/11/23(月) 03:37:20ID:???
 $a=x,$a=y,$a=z・・・それぞれの条件で動作分岐
させるとき、ifとelsifで書いていくのはなんか非効率的
のような。なんか方法あるのでしょうか?
0264nobodyさん2009/11/23(月) 05:58:26ID:???
何を持って非効率というのかわからん

あと、サンプルでも$a,$bは使わぬが吉
0265nobodyさん2009/11/23(月) 06:40:31ID:???
>>263
switchが欲しいってことだろ
Perlのバージョンが5.10以上なら

use feature qw/:5.10/;
given($a){
 when(x){…}
 when(y){…}
 …
}

と書ける
0266nobodyさん2009/11/23(月) 07:58:49ID:???
三項演算子使え。
$a =(条件1) ? 'x'
  :(条件2) ? 'y'
  :      'z'
  ;
■ このスレッドは過去ログ倉庫に格納されています