- 1 名前:nobodyさん mailto:sage [2011/09/09(金) 18:11:49.71 ID:???]
- Perlのコーディングで困ってる人のスレです。
【投稿する際の注意】 質問するときは内容をよく吟味してから投稿してください。 「コマンドの意味がわかんない」とかはマニュアル見ましょう。 回答者さんは何でも屋じゃありません。 1: 自分はこういう事がしたい。 2: それでこんな風にやってみたが・・・ 3: こんなエラーが出て上手く行かなかった。 最低でも1と3が無いと誰も答えられないよ。 良い回答は良い質問から。一緒に勉強しましょう。 お勧めサイトは >>2 以降 前スレ hibari.2ch.net/test/read.cgi/php/1295170172/
- 534 名前:530 mailto:sage [2012/03/04(日) 17:01:24.24 ID:???]
- ありがとうございます、OS名でぐぐったらいろいろ出てきました。
ゼロじゃなくて大文字のオーだったんですね。 OS名ということはシステムからPerlに提供されているものだと思って、%ENVと同じところに記述されているはずって当たりをつけたら perlvarにありました。
- 535 名前:nobodyさん mailto:sage [2012/03/04(日) 20:39:47.27 ID:???]
- 531恥ずかしすぎだなw
- 536 名前:532 mailto:sage [2012/03/05(月) 05:40:34.80 ID:???]
- >>535
そんなことはない。$^0 は確かに特殊変数でもなんでもなかった訳だし。 ためしに$^0をプリントさせたらエラーで実行できなかったし。
- 537 名前:nobodyさん mailto:sage [2012/03/05(月) 22:13:10.43 ID:???]
- だが普通すぐ気づくだろう。
- 538 名前:nobodyさん mailto:sage [2012/03/06(火) 01:30:36.74 ID:???]
- 「普通すぐ気づく」なら530の質問は最初からされてない
- 539 名前:nobodyさん mailto:sage [2012/03/06(火) 01:42:56.66 ID:???]
- 荒らしはスルーで、、、
- 540 名前:nobodyさん mailto:sage [2012/03/06(火) 02:52:11.60 ID:???]
- >>538
なぜ? $^O が検索しにくいのは同じだろう?
- 541 名前:nobodyさん mailto:sage [2012/03/06(火) 02:56:51.45 ID:???]
- perlvarとは何だったのか
- 542 名前:nobodyさん [2012/03/06(火) 09:53:40.98 ID:zjKZlebn]
- 質問です、以下の最短マッチが機能しないっぽい? のですが、なぜでしょうか?
コード(抜粋) $html =~ m!"(.*?)" class="Link88" href="/Models.aspx\?ModelID=$id"!s; print $1; 実行結果 (〜ごっそり省略) <a title="Loeka Creekside Fern Short Sleeve Jersey 2010 $htmlはLWPで拾ってきたHTMLです。数MBくらいあります。 パターンマッチ内の文字列 class="Link88"〜 というあたりはちゃんとマッチしているようですが、 少なくとも Loeka の左にある " が $1 に含まれちゃうのはおかしい気がします。 また不思議なことに、修飾子 /s を外すとちゃんと最短でマッチしてくれます。
- 543 名前:nobodyさん mailto:sage [2012/03/06(火) 10:29:35.15 ID:???]
- 再現可能なコードぐらい貼れ、どーせこうだろうが
$html = q{<a href="b" id="a" class="Link88"}; $html =~ m!"(.*?)" class="Link88"!s; $html =~ m!"(.*?)" class="Link88"!; 最短ってのはマッチし始めてからが最短になるんであって、グループ内に"を含まないなんてルールはない つまり最初の"から class="Link88" ... の手前の"までがマッチするんだよ
- 544 名前:nobodyさん mailto:sage [2012/03/06(火) 10:46:58.66 ID:???]
- なるほど、左に向かって最短マッチはしてくれないんですね。
m!"(.*?)" class="Link88"! を m!"([^"]*?)" class="Link88"! に変えて解決しました、ありがとうございます。
- 545 名前:nobodyさん mailto:sage [2012/03/06(火) 12:52:17.96 ID:???]
- 質問が不親切、再現しようにもコードもない、質問者が何を求めているかを把握するにはこっちが質問を熟読して意図と本当にやりたいことを汲み取らなければならない、などという書き込みに神対応できる >>543 みたいな奴尊敬するわ。
- 546 名前:nobodyさん mailto:sage [2012/03/07(水) 23:13:16.91 ID:???]
- Kent Webさんからダウンロードしたpostmailの設置が上手くいかなくて困っています。
ttp://kueris.pro.tok2.com/postmail.html ↑これなんですが、ご覧の通り送信ボタンを押すとエラーが出てしまいます。 このエラーは、「Minimal.pm」がCGIフォルダ内に見つからない、という意味だと思うのですが、ちゃんとアップロードはできています。 以下、その他の詳細です。 ・check.cgiは問題なく機能しました。パーミッションも設定できています。 ・postmail.cgiのみを「cgi-bin」というフォルダに移動させました。 ・サーバーはTOK2という所をお借りしています。 ・エラーメッセージにある13行目辺りの内容はこんな感じです。↓ 9 # モジュール実行 10 use strict; 11 use CGI::Carp qw(fatalsToBrowser); 12 use lib './home/kueris/postmail-utf/lib'; 13 use CGI::Minimal; 14 use Jcode; よろしければお力をお貸しください。よろしくお願いします。
- 547 名前:nobodyさん mailto:sage [2012/03/07(水) 23:45:53.60 ID:???]
- use CGI::Minimal;
↓ use CGI; またエラーが出たらお越し下さい。
- 548 名前:546 mailto:sage [2012/03/08(木) 00:14:54.72 ID:???]
- >>547様
ありがとうございます。お陰さまで、無事にそのエラーは解消されたです。 しかし、今度は別のエラーが発生しました。 ttp://kueris.pro.tok2.com/postmail.html ↑今はこのようになっています。 パスが違うのかと思い、色々変えてみましたが、効果はありませんでした。 メッセージにある20行辺りの内容は以下の通りです。↓ 19 # 設定ファイル認識 20 require './public_html/postmail-utf/init.cgi'; 21 my %cf = &init; 度々で申し訳ありません。 ですが、何卒よろしくお願いします。
- 549 名前:nobodyさん mailto:sage [2012/03/08(木) 09:26:25.31 ID:???]
- require "./init.cgi";
で OK
- 550 名前:546 mailto:sage [2012/03/08(木) 12:15:53.18 ID:???]
- >>549様
ご回答ありがとうございます。 試してみましたが、相変わらず同様のエラーメッセージが表示されてしまいます。↓ ttp://kueris.pro.tok2.com/postmail.html init.cgi自体はちゃんとアップロードされているんですが…。
- 551 名前:nobodyさん mailto:sage [2012/03/08(木) 12:34:33.65 ID:???]
- init.cgiが@INCが示すディレクトリの中にあり、読める状態にあるかを確認
- 552 名前:nobodyさん mailto:sage [2012/03/08(木) 16:18:28.19 ID:??? BE:3622206896-PLT(12000)]
- そもそもTOK2でCGIをまともに動かそうなんて無茶なこと考えるなよ
- 553 名前:nobodyさん mailto:sage [2012/03/08(木) 17:31:49.63 ID:???]
- cwd でカレントディレクトリ表示させてみて
CGI で動いてない気がしてきた
- 554 名前:nobodyさん mailto:sage [2012/03/09(金) 01:25:41.39 ID:???]
- 初歩すぎる質問で申し訳ありません。
今勉強中なのですが、 postデータ等をこれで変換すると言うのが良くあるのですが、 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; たしかにこれでうまくいきますし、また基本的な挙動も理解しています。 分からないのは、なぜpack("C", hex($1))/egで、問題無く動くのかということです。 具体的には、 @$1で渡されるのは1バイト分なのに、なぜちゃんと2バイト文字として変換されるのか? A%([a-fA-F0-9][a-fA-F0-9]の書式でなぜ半角文字が受け渡されるのか? B例えば”テ”はpostからデータを受け取った時には83eなのに、なぜ問題無く変換されるのか? C@にかぶりますが、なぜ(pack"c",***)で上手く動くのか? "c*"じゃないのに正常に動いてる。 また、$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/hex($1)/eg;で作った変数をそのままpack"c*",$value;としてもうまく動かないのに、なぜちゃんと動くのか? いろいろ調べたりしたのですが、よくわかりませんでした。
- 555 名前:nobodyさん mailto:sage [2012/03/09(金) 02:06:50.72 ID:???]
- >>554
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; でググれ。
- 556 名前:546 mailto:sage [2012/03/09(金) 02:23:40.92 ID:???]
- 皆様、ご回答いただき本当にありがとうございます。
>>551様 確認しましたが、問題ありません。 init.cgiは確かに存在しているはずなのですが、認識されていないようです。 試しに、アップロードされたinit.cgiに直接アクセスしてみたところ、404エラーが表示されました。(つづりやパスは間違えておりません) 同じフォルダ内にある別のプログラムにはアクセスできるのですが……。 >>552様 プロバイダによってCGIの設置しやすさは違うのてでしょうか? もしよろしければ、CGIが動きやすい所をご紹介していただけないでしょうか。 >>553様 申し訳ありません。プログラミングの経験がない私には、「cwdでカレントディレクトリ表示」の意味がよくわかりません。 調べてみましたところ、これはperlにおけるコマンドのことなのでしょうか。 打ち込んでみましたが、上手く動作しませんでした。
- 557 名前:nobodyさん mailto:sage [2012/03/09(金) 02:58:21.99 ID:???]
- >>555
相当ぐぐったのですけど、「これで動く」「この処理はこう言う処理をしてる」と言う説明はありそれ自体はわかるのですが、 頭でイメージしたものだとどう考えてもエラーが起きるもしくは正しく動作しないはずなのに、「なぜこの書式で正しく動作してるのか?」と言う疑問の解決は見つかりませんでした。
- 558 名前:nobodyさん mailto:sage [2012/03/09(金) 03:20:04.43 ID:???]
- >>554
Perlより文字コードの勉強を先にすべきだな (1)〜(3)の疑問はそっち寄りだ
- 559 名前:nobodyさん mailto:sage [2012/03/09(金) 03:37:26.52 ID:???]
- >>556
KENT から落としてきて、 13行目:use CGI; 24行目と26行目をコメントアウトでとりあえず動くよ。 何も入力せずに 「送信する」 ボタンを押せば、動作してるのが確認できる。 www11.tok2.com/home/mikisama/postmail-utf/postmail.html ただし、これは貼らずにいられない。 Q.メールフォームを設置したいのですがsendmailは利用出来ますか? tok2.com/study/faq/04-07.html これ以上は スレチ (これ以上もクソも初めからスレチだが・・・) なので、改造スレの方へどうぞ。
- 560 名前:nobodyさん mailto:sage [2012/03/09(金) 03:45:25.88 ID:???]
- 文字で考えるな
ただ単なるバイト列として考えればよろし。 今日は SJIS だと 8DA193FA という4バイト。 俺らが見てる 「今」 という文字は、コンピュータからしたら 「8DA1」 という並びのバイト列でしか無い。 そうゆう並びになったから、文字が見えるというだけだ。
- 561 名前:nobodyさん mailto:sage [2012/03/09(金) 11:31:58.89 ID:???]
- てst
- 562 名前:554 mailto:sage [2012/03/09(金) 13:02:31.68 ID:???]
- 説明が下手で申し訳ありません。
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;を3つに分解した場合、 例えば、”テストtestだよ”を下の形で出力すると $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/$1/g; 83e83X83gtest82BE82E6となります。これを$hexvalue = hex($value);に いれようとしたのですが上手くいきません。 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/hex($1)/eg;として出力すると 131e131X131gtest130190130230となり、これをpack("c*",131,e,131,X,131,g,t,e,s,t,130,190,130.230);としても当然上手くいきません。 ”test”部分は元々半角小文字なのでs/で式から弾かれてるからとわかったのですが、 カタカナ部分の2バイト目は半角英数混じりなのですがここをちゃんと変換してないようですしそう言うオプションも無いのに、なぜ上手くいくのだろう?とよくわかりません。 カタカナの2バイト目の変換はどこでどのように行っているのでしょうか? >>554のCは、gで次々代入してるからそう言う事なんだろうか?となんとなくイメージ出来ましたが・・・・・
- 563 名前:nobodyさん mailto:sage [2012/03/09(金) 13:33:46.30 ID:???]
- まず自己矛盾していることに気づいていない糞さ
>@$1で渡されるのは1バイト分なのに >C@にかぶりますが、なぜ(pack"c",***)で上手く動くのか? 1バイト分のデータ(0x00-0xFF)をpackしてるんだからC*ではなくC そして文字コードについて全く理解しようとしていない 「テ」の文字コードは「0x83 0x65」で、「e」の文字コードは「0x65」 だから「テ」をパーセントエンコードすると「%83e」であって 「%83」部分さえデコードすれば元の文字に戻るんだよ ああ壁殴りてぇ
- 564 名前:nobodyさん mailto:sage [2012/03/09(金) 14:03:28.44 ID:???]
- >>562
ポイントは3つ。 一つ目。 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; はURLデコードするための一文であるということ。 ”テストtestだよ” をURLエンコードすると ”%E3%83%86%E3%82%B9%E3%83%88test%E3%81%A0%E3%82%88”になる。(文字コードはUTF-8) これをデコードして”テストtestだよ”に戻すのがURLデコード。 つまり$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;という一文の役目。 URLエンコードってのは、例えば「テ」(0xe38386)だったら「%E3%83%86」に変換する。 URLデコートってのは、例えば「%E3%83%86」だったら「テ」(0xe38386)に変換する。 2つ目 正規表現のパターンマッチは一つずつ行われる。 $value="%E3%83%86%E3%82%B9%E3%83%88test%E3%81%A0%E3%82%88" に対して $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; をやると、 $1に"E3"が入った状態でpack("C", hex($1))が実行され、文字列"%E3"を0xE3に置換。 $1に"83"が入った状態でpack("C", hex($1))が実行され、文字列"%83"を0x83に置換。 $1に"86"が入った状態でpack("C", hex($1))が実行され、文字列"%86"を0x86に置換。 (以下略)・・・ だからhexやpackにまとめて”%E3%83%86%E3%82%B9%E3%83%88test%E3%81%A0%E3%82%88”入れようとするのは間違い。 3つ目 >なぜ上手くいくのだろう? 多くのマルチバイトな文字コードは、「漢字は○○から始まる」とか「ひらがなは××から始まる」っていうルールを持ってる。 だから半角英数とマルチバイト文字が混在しても問題ない。
- 565 名前:nobodyさん mailto:sage [2012/03/09(金) 14:16:43.38 ID:???]
- >>563
@とCはだいたいわかりました。ありがとうございます。 下の方は、pack("c*", 131,101);で”テ”になるのは理解しています。 ただhex($1の段階で131eと出力されてるみたいなので、普通に考えるとpack("c*", 131,c);と言う挙動をさせようとしてるように思えるのですが(当然これだと不具合が出ます)、特に修飾子があるわけでもないのになぜcを自動的に101に変換してるのかがわからないのです。
- 566 名前:nobodyさん mailto:sage [2012/03/09(金) 14:22:20.55 ID:???]
- >>565
>特に修飾子があるわけでもないのになぜcを自動的に101に変換してるのかがわからないのです。 「e」な。 そんでもってeの文字コードは10進の101。 >普通に考えるとpack("c*", 131,c);と言う挙動をさせようとしてるように思えるのですが なりません。 pack("C", 131)、pack("C", 101)が順番に動いている。
- 567 名前:nobodyさん mailto:sage [2012/03/09(金) 14:26:11.34 ID:???]
- >>564
だいぶよくわかりました。本当にありがとうございます。 一文にする事で内部的に自動的にルールで振り分けてるから厳密に考えようとしてもしょうがないと言う事なのでしょうか。 とすると、あの一文を@%を抜くA10進数に変換B文字コードに変換三段階に分けて記述しようとすると逆に自動では行われないのでかなり膨大な記述になるのでしょうか。 わかりやすくしようと同じ挙動をするものをちょっと書いてみようと思ったら配列を使ったりしないとうまくいかない感じでした。
- 568 名前:nobodyさん mailto:sage [2012/03/09(金) 14:35:01.38 ID:???]
- >>566
なるほど。 内部的にはeを101に自動的に変換して文字列を次々に処理してるのですね。 するとそこの部分だけを抜き出して分けて記述しようとすると、やはりeを101に変換させるコードを書かないといけないと言うことですね。
- 569 名前:nobodyさん mailto:sage [2012/03/09(金) 14:43:54.07 ID:???]
- すみません ようやく理解しました。
0x83の次にcが来るので”テ”になる $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;の中ではeは未処理のまま0x83をpackで変換した物の後ろに単純にくっつけて出力したと言うことですね ようやくわかりました。確かに文字コードの勉強が必要でした よく調べてみます 大変お騒がせしました
- 570 名前:546 mailto:sage [2012/03/09(金) 16:47:52.35 ID:???]
- >>559様
ご回答ありがとうございます。 色々と見落としていた点があったようで、大変失礼致しました。 頂いた助言を元に、サーバーを変えて試してみます。 本当にありがとうございました。
- 571 名前:nobodyさん mailto:sage [2012/03/09(金) 21:37:28.29 ID:???]
- つか use CGI しているのにモジュール使っていないし、
use strict してても全然 strict じゃないw こんなの怖くて使えないよ('A`)
- 572 名前:nobodyさん mailto:sage [2012/03/10(土) 01:31:51.91 ID:???]
- ●やりたいこと:
jpg画像のサムネイル作成(orファイルサイズ圧縮)がしたい。最悪トリミングでも レンタルサーバ上でサムネイル画像を作成したいと思っております。 GDやImage Magick、Imager、epeg等々が入っていないのですが、 何かうまい方法がありましたら教えていただきたいと存じます。 配置してパスを通すだけで使えそうなモジュールがありましたら・・
- 573 名前:nobodyさん mailto:sage [2012/03/10(土) 02:30:16.63 ID:???]
- まじめな話、KENT はやめとけ。
あれは20年前のシステムだ。
- 574 名前:nobodyさん mailto:sage [2012/03/10(土) 03:05:45.88 ID:???]
- >>572
width height
- 575 名前:nobodyさん mailto:sage [2012/03/10(土) 05:37:43.25 ID:???]
- >>574
主旨が画像を読み込むスピードを早くしたいので、widthheight指定だけではではちょっと・・
- 576 名前:nobodyさん mailto:sage [2012/03/10(土) 06:45:54.03 ID:???]
- ・画像を扱えるツール(プログラム)をレンサバにインストールする
画像を扱うPerlモジュールは大抵別途本体(バイナリ)かライブラリも同時にインストールされてる必要があるからね ・画像加工できる別サーバを用意し、画像ファイルをそちらのサーバに投げてサムネイルを作ってもらい、それをダウンロードする Image Magick じゃなくてImageMagick でもImageMagickも入ってないレンサバって今時あるの? 画像ファイルを(たぶん大量に)アップロードできるくらいだから最安でカスカスのレンサバってことでもないと思うんだが
- 577 名前:nobodyさん mailto:sage [2012/03/10(土) 08:45:04.67 ID:???]
- >>576
ありがとう。それらは考えたんだけど鯖分けるなら自分でサムネつくるのと 手間がかわらないのでなやんでる。 うん。ImageMagickはいってない。
- 578 名前:nobodyさん mailto:sage [2012/03/10(土) 10:20:44.99 ID:???]
- ほかのレンタルサーバーに移動すればよい。
- 579 名前:nobodyさん mailto:sage [2012/03/10(土) 12:27:16.79 ID:???]
- フリーなサーバならまだしも、金を払ってるレンタルサーバなら GD ぐらい入ってないの?
perl が駄目でも、PHP で GD が動いてる可能性とかは?
- 580 名前:nobodyさん mailto:sage [2012/03/10(土) 18:41:09.72 ID:???]
- >>579
PHPでも組んでみたけどだめでした。 素直にさくらとかWebArenaSuiteX使うべきなんですが、 アプロダなのでちょっとアダルト要素入る可能性があり ピンク系も許可のレンタル鯖でないとだめかなというのもネックになってます。
- 581 名前:nobodyさん mailto:sage [2012/03/11(日) 00:39:52.43 ID:???]
- HTML解析で質問です。
HTML::TreeBuilderを使って解析をしているのですが、 どうしても <span class="hogehoge">fuga</span> の、fugaが取り出せません。 ($tree->look_down('class', 'hogehoge') ではダメなのでしょうか・・・?ご教授お願いしますm(_ _)m
- 582 名前:nobodyさん mailto:sage [2012/03/11(日) 09:53:46.90 ID:???]
- >>581
同じクラスのエレメントが複数あるとか?
- 583 名前:nobodyさん mailto:sage [2012/03/23(金) 00:48:00.36 ID:???]
- なかなか短いコードで再現できなくて申し訳ないのですが、
print "DEBUG1\n"; $html =~ m!<a title="([^"]*?)" class="Link88" href="/Models.aspx\?ModelID=$id" id="ModelLink\d+">.*?<td class="Label11">(.*?)</td>.*?<td class="Label14">(.*?)</td><td class="Label13".*? (\d+)%</td>!s; print "DEBUG2\n"; このm//の1行だけの処理に、20秒ほどかかることがまれに起きます。 その間 top(1)で見てるとCPU負荷が異常に跳ね上がります。 この行はループ中、LWPで取得するたび$htmlが変わりながら数百回実行されるのですが、 異常に時間がかかる時以外は瞬時に通り過ぎます。 時間がかかる時の $htmlを試しにファイルに吐かせてみましたが、 サイズはせいぜい500KBほどで、 このときのファイルを上記の行だけのテストスクリプトに食わせても 瞬時に終了し異常が再現できません。 原因と対策に何か考えられることはあるでしょうか?
- 584 名前:nobodyさん mailto:sage [2012/03/23(金) 01:14:12.71 ID:???]
- >>583
メモリスワップが発生してるとか。
- 585 名前:nobodyさん [2012/03/23(金) 04:21:38.62 ID:SsskDSLS]
- 質問です。
Perl/CGI側でHTTPのエラーコードを返そうと思います。 #!/usr/bin/perl print "Status: 404 Not Found\n"; exit; というコードを書いたとき、ブラウザ上では想定通りに404エラーとして表示されるのですが Apacheのエラーログを見てみると Premature end of script headers: /home/foo/htdocs/bar.cgi とだけ表示されます。この時、他のエラーメッセージは見当たりません。 きちんと動いてはいるので問題ないと言えば問題ないのですが、これを出さないようにするにはどうしたら良いでしょうか。 ・404エラーではなく、普通にウェブページを出力した場合には問題ありません。 ・同じディレクトリでは別のCGIも問題なく動いており、パーミッションはそれらと同値に設定してあります。 ・確認してみたところバージョンはApacheが1.3、Perlが5.8です。古い(´・ω・`)
- 586 名前:nobodyさん mailto:sage [2012/03/23(金) 04:35:43.93 ID:???]
- たぶんcontent-typeを書くと消えるというかググれ
- 587 名前:nobodyさん [2012/03/23(金) 04:46:19.26 ID:SsskDSLS]
- >>586
ありがとう。でもtext/htmlにしろtext/plainにしろ状況は変わらないんだ
- 588 名前:nobodyさん mailto:sage [2012/03/23(金) 04:58:11.94 ID:???]
- >>585
exitって必要なの
- 589 名前:nobodyさん mailto:sage [2012/03/23(金) 05:11:05.01 ID:???]
- \n\n
- 590 名前:nobodyさん mailto:sage [2012/03/23(金) 05:15:18.99 ID:???]
- Header1: foo
Header2: bar (空行) body 仮にボディを空にするとしても、ヘッダとボディを隔てるものは必要ですよね
- 591 名前:nobodyさん [2012/03/23(金) 05:46:15.14 ID:SsskDSLS]
- >>588
確かに585のような最小コードでは、exitは有っても無くても変わらないかも。 >>589-590 ステータスコードの末尾を\n\nにすると、 実際にページが送信されている(といっても改行1つだけだが)という扱いになるのか、 デフォルトの404ページが表示されずに、真っ白のページが表示されるようだ。 ちょっと面倒だけど、ブラウザ表示用にエラーページを用意して、 それを出力するようにすれば、とりあえず問題は無さそう。 .htaccessでErrorDocument指定されてるページに飛ばすには、自前でリダイレクトするしか無いのかなー?
- 592 名前:nobodyさん mailto:sage [2012/03/24(土) 01:12:43.26 ID:???]
- >>591
普通exitなんて書かないよ?トホホにでも書いてあったのかな。
- 593 名前:nobodyさん mailto:sage [2012/03/24(土) 03:29:50.29 ID:???]
- >>592
トホホは見てないけど、そうなんだ。 正常終了のときは使わない方がいいのかな。まあ、異常終了ならdie使うけど。
- 594 名前:nobodyさん mailto:sage [2012/03/24(土) 06:48:02.45 ID:???]
- コードが最小だろうが最大だろうがそんなものは必要ない
- 595 名前:nobodyさん mailto:sage [2012/03/24(土) 08:52:21.86 ID:???]
- 何故exitが不要なのか、
いわゆる「省略の美学」以外に積極的な理由があったら、誰か教えて欲しい。 何らかの弊害(速度や安全性の問題など)があるとか、 別の関数等で置き換えるのが普通だとか、 構造化プログラミングにおけるgoto不要論と同じような理由だとか、ヒントでも構わないので。
- 596 名前:nobodyさん mailto:sage [2012/03/24(土) 09:25:36.37 ID:???]
- そりゃなくても最後まで行けば仕舞いだけどexitは必ず書いてるな。
- 597 名前:nobodyさん mailto:sage [2012/03/24(土) 09:51:51.12 ID:???]
- >>595
コンパイル済みのスクリプトをキャッシュして使い回すような環境で 無闇に exit すると良くないケースがある。 cast-a-spell.at.webry.info/200801/article_9.html harapeko.asablo.jp/blog/2006/06/29/425898 反対に、書かなくていい場面で書いておくのが「冗長の美学」でしかないのなら、 __END__ なり #exit なりとしておいた方が無害でいい。
- 598 名前:nobodyさん mailto:sage [2012/03/24(土) 10:10:34.01 ID:???]
- mod_perlとかplackみたいな永続化環境だとアクセスごとに走る部分でexitしたらだめじゃね
なんにせよこれ「いわゆる省略の美学」とは全く別問題
- 599 名前:nobodyさん mailto:sage [2012/03/24(土) 10:43:09.74 ID:???]
- >>597-598
ありがとう。 mod_perlへの移植(と言ってもかなり書き換えることになりそうだ)を考えるなら、 最初からexitを使わないコーディングが重要ってことか。 mod_perlだと通常のexitは使わないほうがいいってのは聞いたことがあったんだけど、 実際にmod_perlは弄ったことがなくて、その感覚が掴めてなかった。 >>596-597 プログラムを1ファイルで済ませたい場合、 自分はメインルーチンソースファイルの先頭に、サブルーチンを最後にまとめて書くことが多いんだけど、 メインルーチンの最後に、以下はメインルーチンとしては実行されませんよと明言するためにexitを入れたりしてた。
- 600 名前:nobodyさん mailto:sage [2012/03/24(土) 11:58:06.99 ID:???]
- 俺も同じでソースの最初に main() なんだけど、その直前に exit() 書いてる。
use なんちゃら〜 our なんちゃら〜 main(); exit(0); sub main{ } sub func{ } っていう感じ。
- 601 名前:nobodyさん mailto:sage [2012/03/24(土) 17:23:47.75 ID:???]
- Cから入った人に多そう、とか思った
- 602 名前:nobodyさん mailto:sage [2012/03/25(日) 01:57:35.52 ID:???]
- 基本的に.pmにロジック書いて、.plはそれを呼ぶだけだからexitは滅多に使わないなあ。
- 603 名前:nobodyさん mailto:sage [2012/03/25(日) 15:34:18.54 ID:???]
- 1枚スクリプトで、&main; exit; は有りだと思う。
ただ基本は >>602 のようにするから滅多に使わない。 冗長の美学を語る人が、1枚に長いスクリプト書いてるのは矛盾を感じる。
- 604 名前:nobodyさん mailto:sage [2012/03/25(日) 18:03:11.28 ID:???]
- >>603
そこはスクリプトの規模によるんじゃね? 短めの、他と共通化出来ないサブルーチンが2〜3個あるくらいなら、分けるまでも無いだろう。
- 605 名前:nobodyさん mailto:sage [2012/03/25(日) 19:02:45.23 ID:???]
- それはそんなソースになってる時点で論外だな。
- 606 名前:nobodyさん mailto:sage [2012/03/25(日) 19:14:00.38 ID:???]
- 別に嫌みとかでは無いんだけど、>>605 の数百行ぐらいの小さいソースと、
2〜3000行ぐらいの中規模のソースを見てみたい。 ってのも、俺の殆どのソースは1枚で済ましてるから、他人ので学習というか知識を深めてみたいから。
- 607 名前:nobodyさん mailto:sage [2012/03/25(日) 20:04:16.17 ID:???]
- 605は安価がないからなー、自分が思ってるのと全く違う主張の可能性もあるw
- 608 名前:603 mailto:sage [2012/03/26(月) 02:46:50.44 ID:???]
- >>606
>>605 とは別人なんだが、数百行の小さいソースって、1プロジェクトで数百行ってことかな。 1ファイルで4,5百行くらいって話だとちょっと長いかな。 スクリプトファイルを書くにしても、大体いろいろな機能をクラス(pmファイル)に分けてそいつらの責任に任せたほうがメンテが楽。
- 609 名前:nobodyさん mailto:sage [2012/03/26(月) 14:06:22.42 ID:???]
- >>608
それはモダンなやり方ですか?
- 610 名前:nobodyさん mailto:sage [2012/03/27(火) 01:13:45.03 ID:???]
- え、モダンかぁ、、、、悪い書き方はしちゃダメだけど、モダンとかは気にしないほうがいいと思うよ、、、
流行り廃りだし、自分で判断したほうがいいよ
- 611 名前:nobody mailto:sage [2012/03/30(金) 00:02:30.52 ID:???]
- そうだね。モダンは足が速いから。スレッドももうなくなったしね。
- 612 名前:nobodyさん mailto:sage [2012/03/30(金) 00:16:05.99 ID:???]
- 【モダン推奨】Perlについての質問箱 50箱目
toro.2ch.net/test/read.cgi/tech/1327110999/
- 613 名前:nobody mailto:sage [2012/03/30(金) 00:29:41.87 ID:???]
- 初心者には敷居が高いから万人向けってわけじゃない
- 614 名前:nobodyさん mailto:sage [2012/04/03(火) 10:03:29.27 ID:???]
- こちらはcatalystについての質問でもよろしいでしょうか?
catalystのスレはあるものの、人が居なさそうなので。。 catalystとApacheをつなぐために、 perl-Catalyst-Engine-Apache-1.12-1.el5.rf.noarch.rpm を入れようとしているのですが、依存関係で以下の物が足りないと落ちます。 ---> Package perl-Catalyst-Engine-Apache.noarch 0:1.12-1.el5.rf set to be updated --> Processing Dependency: perl(Apache::RequestRec) for package: perl-Catalyst-Engine-Apache --> Processing Dependency: perl(Apache::Response) for package: perl-Catalyst-Engine-Apache --> Processing Dependency: perl(Apache::Const) for package: perl-Catalyst-Engine-Apache --> Processing Dependency: perl(Apache2) for package: perl-Catalyst-Engine-Apache --> Processing Dependency: perl(Apache::RequestIO) for package: perl-Catalyst-Engine-Apache --> Processing Dependency: perl(Apache::URI) for package: perl-Catalyst-Engine-Apache --> Processing Dependency: perl(Apache::Connection) for package: perl-Catalyst-Engine-Apache --> Processing Dependency: perl(Apache::RequestUtil) for package: perl-Catalyst-Engine-Apache いろいろ探すと、mod_perlの旧バージョン(1.9.9)には含まれていたものの最新バージョン(2.0.5)には含まれて居ないモジュールのようです。 対応方法が分かる方、ご教授いただけますでしょうか。 宜しくお願いいたします。
- 615 名前:nobodyさん mailto:sage [2012/04/03(火) 11:11:13.68 ID:???]
- >>614
人がいなくてもそれがそのスレなんだからそこに書くしかないんじゃ? 人が少ないからで別スレきたら何でもアリになるだろ
- 616 名前:613 mailto:sage [2012/04/03(火) 16:39:22.06 ID:???]
- 自己解決しました
Catalyst::Engine::Apache2 なるものがcpanから出てました ちょうど過渡期のようですね
- 617 名前:nobodyさん mailto:sage [2012/04/04(水) 00:34:44.70 ID:???]
- 過渡ちゃんペッ
- 618 名前:nobodyさん mailto:sage [2012/04/04(水) 18:53:47.59 ID:???]
- CGIゲーム改造してるんだけど
ID<>名前<>パスワード<>データ各種・・・ みたいに記録してあって下のように処理しててこれが何か所も出てくる 扱うデータ増やすたびに全て修正しなくちゃいけなくてやたら面倒くさい 配列だと見た目で何の変数かわかりにくいし連想配列はつなぐときの順番がばらばらだし どちらも読み取りだけの時使わない変数まで格納するの無駄かなあと考えてたら先に進まなくなってしまった 変数の追加とか挿入とかするとき一か所くらいの修正でいい無駄の少ない方法ない? for($i=0;$i<$num;$i++){ ($id[$i],$name[$i],$pass[$i],...) = split (/<>/, $data[$i]); ↓ 処理 ↓ $newdata[$i] = "$id[$i]<>$name[$i]<>$pass[$i]<>..."; }
- 619 名前:nobodyさん mailto:sage [2012/04/04(水) 20:03:38.87 ID:???]
- >何か所も出てくる
subにぶち込んどきゃいいだろ
- 620 名前:nobodyさん mailto:sage [2012/04/04(水) 21:27:07.37 ID:???]
- そんなあなたにはスライス
- 621 名前:nobodyさん mailto:sage [2012/04/04(水) 22:59:22.68 ID:???]
- スライスって数字のやつ?何か挿入して増やそうとするとずれるよね
単純に後ろに追加すると位置的にわかりにくいから挿入したいんだが、数字のチェックもしなくていい方法ない? 元のデータの書き換えは再生成するから考えないとして 例 データ0<>データ1<>データ2<>・・・ ↓ データ0<>データ1<>データx<>データ2<>・・・ それとサブルーチンだとどうやって引き渡そうか悩んでる 配列だと結局受け取るときに順番が大事だし連想配列だと上書きする時また<>で連結しにくいと思ったんだが
- 622 名前:nobodyさん mailto:sage [2012/04/04(水) 23:25:45.28 ID:???]
- 順番付き連想配列使えば良いじゃんw
- 623 名前:nobodyさん mailto:sage [2012/04/05(木) 00:00:05.98 ID:???]
- データファイルにはヘッダを必ず含めれば幸せになれるかも。
スライスは苦手なのでサンプルは今書けないけど、ファイルを全て読み込んだ時のイメージはこんな感じ。 my $data = {}; $data->{'headers'} = [〜]; $data->{'data'} = [ {○=>△,◇=>□}, {○=>△,◇=>□}, 〜以下略〜 ]; 読み書きは @{$data->{'headers'}} の順番で行えば良い で、読み書きを行うサブルーチンを作れば良い。 CSV 的なデータを連想配列で読み込むモジュールがあった気がする。
- 624 名前:nobodyさん mailto:sage [2012/04/05(木) 00:25:31.57 ID:???]
- だから順番付き連想配列使えって。
なんで無理して難しい方法で実現しようとするの?
- 625 名前:nobodyさん mailto:sage [2012/04/05(木) 06:21:58.63 ID:???]
- >>624
例えばこうやるんだよ、って簡単なサンプルコードを書いてやるといいよ。
- 626 名前:nobodyさん mailto:sage [2012/04/05(木) 09:51:23.36 ID:???]
- >>618
ちょっと書いてみた。 www5.puny.jp/uploader/download/1333586646.zip pass: perl 順番付き連想配列ってこうでいいのかな? 添削歓迎。
- 627 名前:626 mailto:sage [2012/04/05(木) 10:42:38.78 ID:???]
- id とかって配列なのか。
ぱっと見 $i いらなそうなので無視してましたよ。 要件満たしてないっぽいので忘れてください。
- 628 名前:nobodyさん mailto:sage [2012/04/05(木) 13:04:38.74 ID:???]
- www5.puny.jp/uploader/download/1333598575.pl
pass:perl 自分はこう書いた
- 629 名前:nobodyさん mailto:sage [2012/04/05(木) 15:56:41.39 ID:???]
- >>628 それだったら $data = [array_ref, hash_ref, ...] の方が良くないですか?
my $data = readdata_mod(); my $headers = shift @$data; for my $hash (@$data){ $hash->{NAME} .= '【逮捕】'; print "$hash->{$_}\n" for @$headers; } sub readdata_mod{ my $headers = <DATA>; chomp $headers; $headers = [split(/<>/, $headers)]; my $data = [$headers]; while(my $line = <DATA>){ chomp $line; my %tempdata = (); @tempdata{@$headers} = split(/<>/, $line); push @{$data}, \%tempdata; } return $data; } それより気になるのは >>618 のソースだと @id,@name,@pass... と配列があるんですよね。 これをどう処理してるか謎なんで レコードをなめるだけでいいのか悩むところ。
- 630 名前:nobodyさん mailto:sage [2012/04/05(木) 16:34:07.79 ID:???]
- そこは好みかな
自分はデータとヘッダは分離させたいので、ああやって書きました。
- 631 名前:nobodyさん [2012/04/06(金) 11:04:06.62 ID:AWfq6sbZ]
- すいません。perlをコマンドラインで使うやり方について質問させて下さい。
例えば数字の入ったファイル名だけ全部lsしたい時って どのように書けばいいのでしょうか。 こんな風に書いてみたんですが何も出力されません… ls | perl -e "print /[0-9]/ "
- 632 名前:nobodyさん [2012/04/06(金) 11:29:12.54 ID:AWfq6sbZ]
- ↑
find . -maxdepth 1 -name '*.gif' | perl -ne 'print if /\/*[0-9]{2}\.gif$/;' こんな感じで出来ました
- 633 名前:nobodyさん mailto:sage [2012/04/07(土) 02:00:48.78 ID:???]
- >>632
find . -maxdepth 1 -name "*[0-9][0-9].gif"
- 634 名前:nobodyさん mailto:sage [2012/04/07(土) 02:02:53.93 ID:???]
- >>632
> if /\/*[0-9]{2}\.gif$/; これはワイルドカードと正規表現をごっちゃにしているな。別物だからちゃんと区別するように。
|

|