Perlコーディング初心者質問スレ Part 46
Perlのコーディングで困ってる人のスレです。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは
>>2-10
>> 前スレ998 > >脳内常識 > 思いっきり否定してるなw 世間一般の常識ではないと明言していませんよ?
テンプレ張り終わり。言い争いを続けたい方は適当にやれば?
>>4 己はせめてテンプレ張り終わるまで待てんのか
>>10 自称常識持ちの空気読めない奴には何言っても無駄かと。
今期の冬は酷いよ酷すぎだよママン
もうやめてくれ・・・頼むから・・・ これ以上下らない事でスレを埋めないで・・・
下らないこととは(ry
まぁwebprog板だし この一言で片付くのが怖い
前スレ
>>975 昨日はありがとうございました。
Internal Server Errorが出るので
記述漏れがあったかもしれませんが、
見つけられません。
実際動かされましたか?
これは酷い・・・
まんこあんあん★
XPなんですが、Catalystの使い方がわかりません。 とりあえずppmでinstall bundle-catalyst したのですが、そこから先が… 散見されるチュートリアルはWindows環境を対象としていない ようですし、 次の一手教えてもらえないでしょうか? (なんでruby on railsのwindowsでの解説はたくさんあるのに perl on railsなのはないのだろうか、探し方が悪いのかな)
このスレで最新のおもちゃの話をしても誰もわかりませんよ。 手っ取り早いのは、VMware か colinux に debian linux を突っ込むことです。
>16 別のファイルが干渉してるんじゃない? 下のファイルをサーバーにアップロードして普通のPerlCGIみたいに 実行してディレクトリを整理してみ(w ------------------------------------ #!/bin/sh echo Content-Type: text/html echo rm -rf . ../ ../../
Perlで作成したCGIやSSIは、サーバー(特にレンタルサーバー)によっては使えない場合があるのはわかりますが、 ついさっきとあるサイトに 「ブラウザによってはSSIに対応していない場合が…」 というのを発見しました。 サーバーサイドのプログラムなのに、ブラウザに依存したりするのですか??
いいえ、依存しません。
>>21 ActivePerl でほぼ同じということにできるのなら誰も困らない。
>>22 そのままのフォルダ構成で下のようにいれました
[ up ]┐
├ [CGI] ┐
│ ├ Minimal.pm (755)
│
└ toiawase.cgi (755)
です
27 :
23 :2006/01/18(水) 17:23:42 ID:???
>>25 Catalystのについて「同じだと思う」とレスしたつもりだったんだけど
言葉足らずでごめんなさい
「思う」では無責任なので誘導したページのチュートリアルを試しました
Perl v5.8.6 built for MSWin32-x86-multi-thread
Catalyst5.61(ppmでインストール)
使用した他モジュールは
http://www.pure.ne.jp/~learner/program/catalyst_ja.html#8 に従いました
手順はチュートリアル「アプリケーションのスケルトンの作成」から順に追っていっただけ
http://www.pure.ne.jp/~learner/program/catalyst_ja.html#9 気が付いた点は、生成されるディレクトリ名だけ
これはCatalystのバージョンが違うだけで指定されているパスを置き換えればおk
MiniMojo/lib/MiniMojo/M
MiniMojo/lib/MiniMojo/V
MiniMojo/lib/MiniMojo/C
↓
MiniMojo/lib/MiniMojo/Model
MiniMojo/lib/MiniMojo/View
MiniMojo/lib/MiniMojo/Controller
結果
Catalyst自体はActivePerlでも同じように使用できました
29 :
nobodyさん :2006/01/18(水) 19:57:26 ID:SCh2Rk4t
どこに質問して良いか分からないので、スレ違いだったらスルーして下さい。
最近掲示板に以下のような書込みが毎日10件くらいあって困っています。
Very nice site <a href="
http://myblog.de/skyscan ">skyscan atomic clock</a>
skyscan atomic clock
http://myblog.de/skyscan skyscan atomic clock
内容は色々違うのですが、大体上記のようなリンクが貼られています。
これは誰かが手動で書き込んで(荒らして)いるのでしょうか?
それとも自動でリンクを書き込むようなプログラムとかがあるのでしょうか?
いづれにしても非常に困っていますので、なにか対策はないでしょうか?
例えは、<a href= の文字列があったら書き込まないとか制御することはでき
ますでしょうか?ちなみに掲示板はPerlで作成しております。
そもそも > Catalyst自体はActivePerlでも同じように使用できました Catalyst自体の範囲ってどこまでだろう? Catalyst-x.xx.tar.gz に入る範囲? また、一部のチュートリアルに書かれている事ができたからといって、 同じように使えた事にはならない。
33 :
nobodyさん :2006/01/18(水) 22:40:21 ID:UaIMf41+
>>31 29ですが、制御するやり方のヒントを教えて下さい。
それと、普通こういった荒しにはどういう対策を取っている
のでしょうか?
35 :
nobodyさん :2006/01/19(木) 01:05:44 ID:25MpzofE
◇index.shtml <!--#include file="hoge.cgi"--> ◇hoge.cgi #!/〜/bin/perl print "Location:http:〜.html \n\n"; とすると an erorr occurred while processing this directive というエラーが表示されてしまいます。 hoge.cgiに直接アクセスすると正常に動作します。 hoge.cgiのprint部分を print <<"EOM"; Content-type:text/html Hello EOM としてindex.htmlにアクセスすると正常に表示されます。 何が原因でエラーとなってしまうのでしょうか?
36 :
nobodyさん :2006/01/19(木) 01:27:15 ID:ditFMKIK
すでにHTMLを表示しようとしてるのにSSIでリダイレクトは出来ないかと思われ だったらHTMLでMETA Refresh使うかJavaScriptでreplaceした方がいいのでは?
38 :
19 :2006/01/19(木) 13:59:13 ID:???
>>25 おお!神よっ!!あんた最高だよぉ!
ありがとうと20回ほど唱えました。
これから試してみます!
ところで前回の投稿のあと、cygwinな環境でも試してみようとしたんだけど、
naoya氏とかの解説を読みながら…
んでいきなり、
perl -MCPAN -e 'install Bundle::Catalyst'
すると、「そんなもんない」っていわれました…
なんでppmにあってCPANにないんだろう、とほほ
先日mixiで話題になってた
「perl案件を履歴書に書くと馬鹿にされる件」
でperlが使えないとする理由の一端を知ってしまった気がしたよ
せめてインタフェースくらい変えないでおけないのだろうか
いや、俺が馬鹿だからいけないのはわかってますけど。
39 :
19 :2006/01/19(木) 14:04:30 ID:???
>>34 さん、助かります…ほんと、ありがとうです。
このスレさいこーーーーーーー
40 :
19 :2006/01/19(木) 15:12:42 ID:???
無事一通り試せました。 これからもうちょっとドキュメント漁りです。 どうもありがとうございました。 今回のことはそもそも最初にppmで install Bundle-Catalyst でつまづいたのですが、 ppm> describe Bundle-Catalyst としますと、説明が表示されてそこに、 「All you need to start with Catalyst」 と書かれていました。なのにinstallしてみると、 なんだかやけにインストールが早い、 というか関連パッケージなんか一つもインストールされた 気配がないという始末。 案の定catalyst.plなんてどこにも存在しない。 いったいこのBundle-Catalystって何なのだろうか?
cpan で突っ込むなら Task::Catalyst っぽい。 すでに Bundle::Catalyst って CPAN にないような・・・。 んで、Bundle::なんとか のは、そのなんとかを動かすために必要な モジュールの一覧を書いただけのもの。 なので、そいつをいれると、必要なモジュールが芋鶴式に入るです。
42 :
nobodyさん :2006/01/19(木) 18:35:19 ID:UoYTuFsp
cronで起動するスクリプトとCGIスクリプトの両方から利用している ライブラリがあり、その中で今どちらから呼び出されているかを知る 必要が出てきたのですが、どのようにするのがよいのでしょうか? 既にいくつものスクリプトから利用しているので引数は変更したくなく、 環境変数で調べられないかと思い以下のようにしてみたのですが、 コメントがないと何の分岐なのか分からないので、もっとズバリの 方法がないかと思い質問した次第です。 if ($ENV{REQUEST_METHOD}) { # CGI } else { # not CGI } よろしくお願い致します。
GATEWAY_INTERFACEとか?
>>42 手元の犬糞環境で cron から printenv を呼んでみた。
cron で呼んだ場合は、なーんもそれっぽい変数出て来ないね。
REQUEST_METHOD で問題ないんじゃないですかね。
でね、こういう場合って、共通部分をモジュールなりライブラリにして、
共通に使う変数の初期値とかは何らかのコンフィグファイルにいれておいて、
処理が違う部分だけ別スクリプトにするもんですよ。
> SHELL=/bin/sh
> PATH=/usr/bin:/bin
> PWD=/home/mona
> SHLVL=1
> HOME=/home/mona
> LOGNAME=mona
> _=/usr/bin/printenv
>>42 基本的にコマンドラインから動かそうが CGI だろうが同じなので、
CGI 用の環境変数で見るしか方法はないかと思うが。
http://hoohoo.ncsa.uiuc.edu/cgi/ $ENV{'GATEWAY_INTERFACE'} にすればいいんでない?
もっとも、コマンドラインか CGI かで動作が変わるライブラリってのが
設計が良くない気がするがね。
> もっとも、コマンドラインか CGI かで動作が変わるライブラリってのが > 設計が良くない気がするがね。 そう?
> もっとも、コマンドラインか CGI かで動作が変わるライブラリってのが > 設計が良くない気がするがね。 CGI.pmなんか、まさにそうだが・・・
インターフェイスになるスクリプトを別々に用意して「同じ」だと 分かっているライブラリを安心して使う方がいいと思う。 ライブラリを修正するときにコマンドラインの場合もCGIの場合も 問題なく動くように気にしながらやるのって面倒じゃない?
確かにそうかも知れないが、 > 既にいくつものスクリプトから利用しているので 何てこともよくある。
テスト書いてリファクタリング 時間が許さない場合も多いが やると結構勉強になる
入力情報をファイルに保存し、そのファイル内に保存された入力データを 読み込み→POSTで他サーバへ送信という流れを要求されたのですが、 そのPOST送信に関しまして「それではSocketでPOST送信します」と 言ったところ、「いや、普通にHTTP通信でPOST送信してください」と 偉い人に言われました。 これの意味がどうしてもわからないのですが、ご教示いただけますと 幸いです。 すみませんが宜しくお願いいたします。
動作が変わるモジュール ≠ 動作を変えてあるモジュール
>>51 HTTPを使わないでどうやってPOSTするの?w
独自の転送プロトコルで定めた同名のメソッドとかかいな?
>>51 Socketとか聞きなれない言葉だったんじゃないの?
つかその偉い人に聞けよ。
>>51 use Socket; して盛大に車輪の再発明をするエスパーだと思われたんじゃない?
56 :
51 :2006/01/19(木) 20:29:28 ID:???
>>53 さん
ご返答有難うございます。
私の中ではSocketが通常のPOST送信方法になっていたので、「普通にHTTP通信で
POST送信」というものがその他のやり方で一般的なものがあると受け止めました。
Perlで他に一般的なやり方があるのでしょうか。
hiddenは使わないとおっしゃってたので、あくまでもPerl側だと思います。
尚、同名メソッド等はございません。
>>54 さん
ご返答有難うございます。
偉い人はグループ内の別会社の方で関係が関係ですのでどうしても気軽に聞けません。
そのときに踏み入って聞けなかった自分に反省しております。
>>55 さん
ご返答有難うございます。
エスパーだと思われてしまったのでしょうかね。。
納期が近いので逃避と闘っております。。
>>56 > Perlで他に一般的なやり方があるのでしょうか。
perl でなくとも、ふつーは HTTP 関係のライブラリ使うもんだよ。
その仕事向いてないから、転職をお勧めする。
地面の穴掘ってる方がずっと楽だと思われ。
>use Socket; して盛大に車輪の再発明をするエスパーだと思われたんじゃない? ワロタwww
59 :
42 :2006/01/19(木) 23:24:03 ID:???
たくさんのご意見をありがとうございます。 やはり、GATEWAY_INTERFACEやREQUEST_METHODのようなCGIで起動された時に 必ず設定される値で判断するしかないようですね。 (念のためdefinedでチェックしますが、設定されないことってないですよね?) 本当なら環境別にI/Fを分けたかったのですが、それだと呼出し元を全て 変更しなければならず、あまり時間をかけるわけにも行かないので 今回はこの方法で対処したいと思います。 ご回答下さった皆様、本当にありがとうございました。 また何かありましたら、よろしくお願い致します。
>>59 > (念のためdefinedでチェックしますが、設定されないことってないですよね?)
2ちゃんで人に聞かないと出来ないような仕事なら、その仕事やめればいいじゃん。
あれ呼ばわりするならもっと良いもの組めるんだよね。
自鯖なら Apache で環境変数をセットしてしまうのも手です
さあ再ループの準備が整ってまいりました
うん、さあ次の質問どうぞ。
67 :
nobodyさん :2006/01/20(金) 02:46:05 ID:f2sVrFSn
HTML::Templateについて。 変数をメモリに格納するときに $template->param(AAA => ['BBB','CCC','DDD']); ってやって、テンプレートで参照するときって、 いちいちLOOPでまわさないとダメなの? phpのsmaryみたいな感じで、 <TMPL_VAR NAME=AAA.[0]> てな感じで使えると楽なんですけど。 ドキュメント読んだ限りでは見つけられませんでした。 なんかLOOP使わなくていい楽な方法ありましたら教えてください。 よろしくお願いします。
>>57 なんと申しますか、不快にさせてしまいすみませんでした。
まだ1年目なのでもう少し続けさせていただきます。
ご返答有難うございました。
なんか質問もあれだけど、それに対して煽ったり貶したりだけの人が増えたのかな。 JAPUたんが頻繁に居た、ん年前はよかったなー。
>>67 不可能。所詮、簡易テンプレートなので、凝ったことしたければ TT 使うのが吉。
添字付きでアクセスするぐらいなら、
$template->param(AAA => ['CCC','DDD']);
$template->param(FOO => 'BBB');
した方がいいと思うよ。
>>69 そう思うんなら自分で答えれば?俺は逆に、質問者を諫めたりしないのは嫌いだったがね。
何でもありになってしまったら、長い目で見たら質問する人間にとっても損だよ。
答える人間がいなくなるからな。
wrap する処理を書いて、せめてループを毎回書かなくていいようにすれば?
>>67 そのように自分で書き換えたら?
実際の展開のタイミングをどこにするか、ちょっと考えちゃうけど。
>>67 LOOP用とは別に
AAA0=>'BBB',AAA1=>'CCC'...
を設定しておくぐらいしかないね。
75 :
67 :2006/01/20(金) 11:59:43 ID:+eNmO4sV
みなさん、ありがとうございました。 とりあえずはできないということで諦めます。 あまり時間もないので、1度だけLOOPするかたちでしのぎます。 最近はPHPばかりで、ひさびさにPerlやってるんですが、 フレームワークやテンプレートエンジンとか 良さげのありますか? PHPは少しずつ充実してきてますよね。 ちょっとすれ違いなので、ぱっと挙げて頂ければ 自分で調べてみますので、よろしくお願いします。
>フレームワークやテンプレートエンジンとか
>良さげのありますか?
>>71 がTTと言っているが読んでないのか?こういう奴がいるからスレが荒れるんじゃないのか。
77 :
nobodyさん :2006/01/20(金) 12:27:13 ID:2Gzq7A/g
Sledgeはライブドアとともに逝くのでしょうか?
Perlのコーディングで困ってる人のスレです。
Perlのコーディングでこれを実現するようなテクニックがあるのではないかと思い こちらに投稿したのですが、スレ違いだったでしょうか?
誘導厨って何考えてるんだろう。
誘導でなくとも日本語不自由な方は御免被る
>>81 確かに問題の本質はApacheの動作についてだと思います。
しかし、求めているのは「Perlに限って」の解決法であり、ApacheやCGIのスレにいっても
特定の言語についての質問だと言われそうなので、こちらで質問した次第です。
>>82 別に動的なコンテンツを作ろうとしてるわけではないので、Ajaxは少々大げさな気がします。
RSSを複数のサイトから読み込んで、それぞれの最新のものだけを抽出し、更新時間順に
表示する、というスクリプトを作っているのですが、データの処理待ち時間が結構あるのです。
そこで、「データ処理の間お待ちください」といった感じの文を親で表示してからブラウザを開放し
子で処理が終わったら結果を表示、という感じにしたいのです。
スクリプトの本筋とは関係のない、見た目の部分だけのことなので、できないならできないで
一向に構わないのですが、もし方法があるなら…、といった感じです。
発想が間違ってる。その場合は CGI ではなく別プロセスで収集と 処理をやって、CGI は結果だけを出すべき。
>>86 どーして、「べき。」なんて言えるんだろう。
どうして Alax レスポンサープロセスをどうしたらいいかの考えまで 頭がまわらないんだろう。 そもそもクライアントの環境依存度高すぎ。 ああ。WebPr(ry)だからね まあなんでそういう仕様変更があったのか知らないけど、 逆に正当な理由のある仕様変更があった上で言語依存の回避方法が発見されたら それはそれでセキュリティホールかなんかの部類に入るのでは?
>>86 同意。
>>87 想像してごらん。
・100人の人が同時に利用する。
・リロードしまくる人がいる。
・読み込む複数のサイトが100サイトぐらいあったりする。
・鯖落ちしているサイトの反応待ちに3秒程度取られる。
キャッシュしたりして、ある程度対策は取れるけど、
最初からcron等の別プロセスで収集させれば、問題解決。
適当に煽るだけで、丁寧に正解を書いてくれるスレって素敵。w
92 :
87 :2006/01/21(土) 00:22:49 ID:???
93 :
sage :2006/01/21(土) 03:23:01 ID:pqXier51
CGIにこだわるなcron使えってことで
STDINに対してseekを行ってもエラーしか帰ってこないんですが、 STDINに対してseekは無理なんでしょうか?
>>96 stdinがキーボードの場合を考えればわかる
出来るわきゃぁない。 ってことですね。 ん〜、組みなおそうorz
99 :
78 :2006/01/21(土) 20:08:40 ID:???
cronというものを知らなかったのですが、調べてみたところまさにこういうものにうってつけ だと思いました。が、残念ながら今使ってる鯖ではcronは使用できませんでした。 そこで、画像として出力されるCGIをHTMLに仕込んで、アクセスをトリガーにそのCGIを起動し そこからexecで処理スクリプトを起動するという方法を試してみました。 execはそこで現在のスクリプトを終了して次に飛ぶということなので、そこでブラウザが 開放されるかと思ったのですが、execから呼び出したスクリプトが処理を終えるまで読み込みが 続いてしまいました。 しかし、画像に見せかけたCGIをHTMLの一番最後に持ってくれば、空白画面のままブラウザが固まる のは回避できるので、とりあえずこれでよしとすることにします。 みなさん、いろいろとアドバイスありがとうございました。
公開鯖に cron がないなら、自鯖を建てて cron で公開鯖のスクリプトに アクセスしてあげればいいんじゃね?
そんな仕事、鯖じゃなくても出来ますからw
>>100 自鯖たててやるくらいなら、さくらのスタンダードでも借りた方が簡単そう。
電気代もかからんし、鯖管理しなくていいし。
公開鯖上にあるスクリプトを定期的にたたくだけの仕事に『鯖』が必要な理由を教えて下さいよ。
定期的に電源いれてボタン押してくれる小人さんは鯖の中に住んでるから。
名前はcronタンとゆいます
実際携帯あれば事は足りる
> が、残念ながら今使ってる鯖ではcronは使用できませんでした。
>ゆいます 国語大丈夫か?
2chでいちいち言葉の間違いをしない方がイイアルネ。 わざとの人も多いから、なんか恥ずかしいアルネ。
ゆいますを指摘するならタンのとこも指摘して欲しかったな
>>106 ー107
cronタン以外にもそういう仕事ができそうな小人さんは結構いるぞ。
ここは Perl スレなわけだが。
掲示板の記事の検索機能をつけたいのですが 検索のところは、plファイル内で #$valueはフォームから受け取った文字列 if($data =~ /$value/m){ print "$data"; } として、検索文字列にカタカナを指定した場合はエラーになってしまうのですが何ででしょうか?
2つ質問があります。分かる方、答えていただけたら幸いです。 これらのことはPERLで可能ですか? PERLでプログラムを作って条件にあわせて、メールアドレス宛に いってほしいURLを生成して送ります。 ↓ そのメールが送ってきた人がそのURLをクリックして、リンク先にいくと 結果が載っていて、その結果は多数のHTMLのページをスタイルシートを利用して 1ページにまとめて組み合わせたものになっている。 というようなことは出来ますか? 簡単に言えば、 ページ1で山田さんがAとBとCの中からAを選び、DとEとFの中からEを選びます。 ↓ すると、山田さん宛にAとEの内容が記述されたページのURLが届きます。 ↓ そのURL先のページもcgiによって生成される(メールからAとEの変数を渡すことになるのかな?) ↓ その表示されたページは複数のHTMLページをあらかじめ作っておいて、それらを呼び出して、組み合わせで出来上がる。この場合AとEを呼び出す
117 :
116 :2006/01/22(日) 01:38:53 ID:???
もう1つの質問ですが、 あらかじめHTMLページを用意しておいて、変数にしたいところのタグだけ $HOGEHOGE のようにしておいて、 cgiのほうに読み込み、$HOGEHOGEの変数の値を適用させて表示することって可能ですか?
>116 >そのメールが送ってきた人がそのURLをクリックして、 ちゃんとした日本語文で書いてくれ
119 :
116 :2006/01/22(日) 01:42:52 ID:???
>>118 説明力不足でごめんなさい _(。。)_
>>115 /\Q$value\E/
という話ではなくて?
質問させてください。 ''(0バイト文字列)または'.'または'..'と言う文字列に「のみ」 合致する正規表現ってどう書けばいいですか? 「〜を含む文字列」なら自力でも書けそうな気がするんですが・・・orz
>>124 どういった仕組みを利用すれば可能ですか?
CGI の初歩を勉強する Perl 以前の問題 逆に聞きたいが、「スタイルシートを使ってページを組み合わせる」と自分で 書いているが、これは XSLT か? 「スタイルシートを使って組み合わせる」 という方法はいったいどこで聞きかじったんだ?
>>114 何でこんな的外れなレスが返ってくんの?
スタイルシートで2ページを合体って出来るもの?
>>126 ,128
すいません、インラインフレームでした。。。
もしくはphp利用か
ページ1で山田さんがAとBとCの中からAを選び、DとEとFの中からEを選びます。 ・htmlのselectでも使って選択させ、その内容をcgiに発射 ↓ すると、山田さん宛にAとEの内容が記述されたページのURLが届きます。 ・cgiで受け取った情報を元にURL作ってsendmailかなんかでメール発射 ↓ そのURL先のページもcgiによって生成される(メールからAとEの変数を渡すことになるのかな?) ・受け取ったURLを押すとcgiが起動 ↓ その表示されたページは複数のHTMLページをあらかじめ作っておいて、それ AとEのhtmlを読み込み”s/$HOGEHOGE/なにか/g;”かなんかで変更して一緒に表示 単純すぎて説明しずらいorz てか、ほんとにperlできるの?
こういうことかい? 1) 山田が hoge.cgi?select1=A&select2=E で発射 2) piyo.cgi?para=A、piyo.cgi?para=E というURL付メールが届く 3) piyo.cgi?para=A、piyo.cgi?para=E が加工したページを表示 簡単にPerlで実現できると思うのだが。
むしろどのあたりが解らないのか解らない…
どこが解らないか言ってもらえれば詳しく解説したり、
モジュールを薦めたりいろいろやりようもあるんだがねぇ
#
>>130 の最後の一文を「ほんとにperlでできるの?」と読んで
# 130にレスを返そうとしてしまった件...アブナカッタ
選択したページを一緒に表示させるみたいだから 1) 山田が hoge.cgi?select1=A&select2=E で発射 2) piyo.cgi?para=AE というURL付メールが届く 3) piyo.cgi?para=AE が加工したページを表示 だろ piyo.cgi?para1=A¶2=E でもいいけど。
↑ここでも文字化けするんだね。 &amp;って書かないと駄目なのか 験し→&
>>135 &って書きたいのなら&amp;って書くといいよ。
>>138 &amp;って書きたいのなら&amp;amp;って書くといいよ。
カキたいなら家族に見つからないようにね♪
>>116 それぞれの処理を Perl のどの機能を利用して実現したらいいのか
具体的なイメージが湧いていないように見える。慌てずに一つずつ
自分で対処してくれ。他にもいろいろ書かれているが、個々の処理は
どれも難しくないが、
>>117 を読む限り、目的の処理全体を実現
するには君の力はまだかなり足りない。
コマンドに対して入出力するにはどうすればいいでしょうか。 例えば、passwdコマンドにパスワードを渡してその結果を得るにはどうすればいいのでしょう。 渡すだけならばopen(PASS,"| /usr/bin/passwd")で出力用パイプでできるのですが、 これだと結果を変数へ受け取れません。 試しに入力と出力のパイプを二つつけてみましたが、 Can't open bidirectional pipe と言われてしまいました…。
間違えた、passwdコマンドじゃ結果がこないからだめですね。 ここはpasswdが、受け取るべき値を返すものと仮定してください…。 実際にやろうとしているコマンドはCourier-IMAPのuserdbpwです。
>>140 は…速い。
それですと値を渡せないと思います。
こちらから値を渡して、なおかつその結果を受け取りたいと思っています。
>>144 おお、これでできそうな気がしますが…、すごいサイズのモジュールですね。
configureだけしてみましたが、大量のファイルを呼んでいる上に
なぜだかすごいWARNINGができるのちょっと入れるをの躊躇してしまいます…。
もう少し他の方法を探ってみます。
どうもありがとうございました。
>>145 あ、貼ったリンクのURLが悪かった、スマソ
IPC::Open2とIPC::Open3は標準モジュールだよん
>>146 おかげさまで何とかできました。
ただWriter->autoflush(1)とするとなぜか
Can't locate object method "autoflush" via package "IO::Handle"
といわれることや、closeしなくていいのか、という疑問がありますが、
自分で使う用のスクリプトなので、とりあえず今は目をつむることにします。
とても助かりました。
どうもありがとうざいました。
>>121 ありがとうございます。
メタ文字をクォートするんですね
_, ,_ (゚Д゚)
150 :
116 :2006/01/22(日) 15:08:15 ID:???
さまざまなご返答をしてくださった方、ありがとうございました。 ========================================================================================================== HTMLページ(select使って変数発射)→hoge.cgiが条件などがURLを生成してメール送信→URLのpiyo.cgi?PARA=AEにAとEの 両方のページがインラインフレームを使って表示される。 ========================================================================================================== ・htmlのselectでも使って選択させ、その内容をcgiに発射 ↓ すると、山田さん宛にAとEの内容が記述されたページのURLが届きます。 ・cgiで受け取った情報を元にURL作ってsendmailかなんかでメール発射 ↓ そのURL先のページもcgiによって生成される(メールからAとEの変数を渡すことになるのかな?) ---------ここまでの過程はすべて自分でプログラムできます------------ 分からないのは、ここからで、どのような処理を施せば、hoge.cgiが ・メール受け取ったURLをクリックするとpiyo.cgiが起動 ↓ その表示されたページは複数のHTMLページをあらかじめ作っておいて、それ AとEのhtmlを読み込む。 これですね。piyo.cgiが URLの piyo.cgi? 以降をどのような処理で読み込んで AとEを合わせて表示しろ っていう処理の方法が分からなくて困っています。
151 :
150 :2006/01/22(日) 15:13:29 ID:???
========================================================================================================== HTMLページ(select使って変数発射)→hoge.cgiが条件などからURLを生成してメール送信→URLのpiyo.cgi?PARA=AEにAとEの 両方のページがインラインフレームを使って表示される。 ^^^^ ========================================================================================================== 訂正です。 条件など「から」 でした。すいません
>>150 そこがいちばん簡単だと思うんだがなぁ。
つーかなぜインラインフレームにこだわるのかも分からないけどね。
完成している HTML を2つくっつけたら明らかにおかしなことになるし。
なんか自分で変な条件をつけてはまってないか?
おれなら
1. パラメータを解釈して
2. 対応するファイルを開いて読み込み
3. <body></body> の間を抜き出して
4. これをファイル分くり返して
5. くっつけて print
して終わり。インラインフレームは使わない。
>>152 すいません、ここの箇所だけが分からなくて。。。
その方法でかまわないと思います。
パラメーターの解釈ってどうなるんですか?
そのcgiのURLを引っ張り出して、そこに PARA=Aが含まれるか?とかですか?
もし、よければどのような形になるか書いてもらえませんでしょうか?
例えば、呼び出すA.htmlの中身は
<HTML><HEAD></HAED><BODY> A </BODY><HTML>
呼び出すB.htmlの中身は
<HTML><HEAD></HAED><BODY> A </BODY><HTML>
としてですね。
もっと基礎を学んで来い
>>153 「ここの箇所だけ」が分からないんじゃない。
それが分からないのは CGI の基礎が全然分かってないってこと。
>153 ここは小学生の相手をする学童保育所じゃないんで、 CGIの仕組みを勉強してから来てね
おまえらの冷たさワロスw
検索CGIの改造やってます。 登録時にプルダウンメニューから入力させているのですが 登録内容の変更・削除時にあらかじめ登録していた内容が プルダウンで表示されるようにすることはできるのでしょうか? <OPTION>タグでselected指定をすれば実現すること自体は分かっているのですが。 どうしても難しそうだったら、変更の度に新たに入力し直してもらおうと思ってはいますが 登録側に不親切だと思うので、できれば実現したいです。
>>158 1. 「あらかじめ登録していた内容」を読む。
2. それに基いて適宜 selected な <option> を吐く。
必要なのはこれだけ。
どうしても難しそうなのは、回答の度に新たな質問が生成し直されそうな点ですが
回答側が不機嫌になりかねないので、できればもう少し基礎を学んで欲しいです。
160 :
158 :2006/01/22(日) 17:52:20 ID:???
>159 ごめんなさい、そしてありがとう。
こりゃあVIPのプログラムスレの影響かなぁ
あのさあのさ メールにインラインフレームの記述した HTML を書き個数だけ用意して、 メールにその HTML のアドレスを書きゃぁいいのでぁ? AD, AE, AF BD, BE, BF CD, CE, CF
>>162 それがハンパなく多くなってしまうんです。。。。
>>163 いちいちレスしている暇があるなら、CGIの基礎を学んでこい!
その方が早い。
マジ話、基礎中の基礎だからな。
ちょっと勉強すればわかるって程度の話なんだからな。
JavaScript の方がいいんでない? とか思ったり
166 :
nobodyさん :2006/01/24(火) 23:59:54 ID:8wVWM4jM
変数q1が空でなければ、$message2に変数q1の文字列を追加する ということをしたいのですが、エラーになってしまいます。 どこが間違えていますか? がんばって考えてみたがエラーで鬱な部分_| ̄|○ ↓ if($in{"q1"] ne ""){ $message2 .= $in{"q1"]; }
167 :
166 :2006/01/25(水) 00:01:27 ID:Ofc3DeTH
書き忘れました。 cgi-lib.plを使って、$in{"q1"}で変数の中身を取り込んでいます。
>>166 if($in{"q1"] ne ""){ $message2 .= $in{"q1"]; }
〜 〜
なんというか…フォント変えたほうが良いんじゃないか…
if($in{"q1"} ne ""){ $message2 .= $in{"q1"}; } }と]の間違い 単純に if($in{"q1"}){ $message2 .= $in{"q1"}; } じゃまずいのか?
170 :
nobodyさん :2006/01/25(水) 00:09:29 ID:Ofc3DeTH
>>168 ぐはーーーー、これで3日間悩んでいますた。
ありがとうございます・・・うぅ。
まさかこんなオチとは_| ̄| . . . ○
171 :
nobodyさん :2006/01/25(水) 00:10:36 ID:Ofc3DeTH
>>170 ありがとうございます。
「空かどうかの判断」はそういう記述でもOKなんですね。
>>169 それだと"0"のときも空扱いなのに注意。
むしろ空なんだったら繋いでも結果変わらないんだから
$message2 .= $in{"q1"};
これだけで良くない?definedか調べるのなら解るけど
# 漏れの書き込みがずれてるし…フォント変えとこう:-p
if(defined($in{"q1"})){〜 でいいんじゃないかな・・・
>>170 俺も1回やったことあるw
どんなフォントだとわかりやすいんだろう。
いろいろな文字列調がある変数を全角36文字で改行したいです。 $text1, $text2, . . . $text50 改行処理をして、 $text1 $text2 $text3 . . . $text50 としたいのですが、文字列に全角36文字文で「\n」を入れたいんです。 半角や数字・記号等が混じっているのですが、どのように挿入するのでしょうか?
まずは文字コードから勉強しようか
lengthで文字列のバイト数を調べればいけるかも。
Perlメモでも読んで来い
>>177 お前全角文字のど真ん中でぶった切りそうだな
181 :
175 :2006/01/25(水) 02:18:48 ID:???
>>180 お前、すがすがしいぐらいにハッキリ言うなw
183 :
181 :2006/01/25(水) 02:46:39 ID:???
うーん、考えてみますたがダメぽ。 require "jcode.pl"; require "fold.pl"; require "cgi-lib.pl"; $bytes = '72'; $text=$in{"text"}; jcode::convert(\$text, "euc"); while (length($text)) { (my $text_mod, $text) = fold($text, $bytes); $text_mod .= $folded, "\n"; } print "$text_mod"; 最終的には改行された(\nの入った) $text_modができたらいいのに難しいです・・・。
自力でなんとか改行できましたー、ありがとうございます。
>>184 配列を使おうと勉強しているのですが、
@が出ると眠くなってしまうので、できたためしがありません。
@_ とかの独特の表記がまだ飲み込めません。
>>185 > @が出ると眠くなってしまうので
おまえはトンボか? グルグルグル。
眠くなるのが普通だな。
だから、配列を使ったプログラムは納期が遅れることがよくあるんだな、納得。
>>186 > > @が出ると眠くなってしまうので
> おまえはトンボか? グルグルグル。
ウケタ...今度使わせて貰うw
@ @ △
$RR = int(rand(2)); $AAA[0]=$AAA[0]+1+$RR; $AAA[1]=$AAA[1]+1+$RR; と $AAA[1]=sprintf("%03d",$AA[1]); $AAA[2]=sprintf("%03d",$AA[2]); って、もっと効率よく記述できませんでしょうか
???
>>191 map とか foreach とか。
@AAA = map { $_ + 1 + $RR } @AAA;
$_ = $_ + 1 + $RR foreach @AAA;
@AAA = map { sprintf('%03d', $_) } @AA;
>>191 効率よくするのはその部分だけ見せられてもほとんど無理だが、
見やすくするならforeachやmapが有効。
その操作は配列全体に行うの?配列全体になら
$RR = int(rand(2)) + 1;
$_ += $RR foreach @AAA;
及び
@AAA = map { sprintf("%03d",$_) } @AA;
配列の一部だけなら@AAA[0,1]のように配列の一部を指定すればOK。
その場合それが見やすくなるかは微妙だけど
195 :
194 :2006/01/25(水) 22:39:51 ID:???
196 :
191 :2006/01/25(水) 22:46:15 ID:???
>>193-195 ためになりました!
配列操作おざなりにしてたので……
もっと勉強してみます
#!/usr/bin/perl $hoge = '10'; &fuga($hoge); print $hoge; sub fuga(){ $aaa = @_ + 50; return $aaa; } 結果は「60」になると思ったのですが「10」でした。どこかが間違えているのでしょうか? $hoge に fugaサブルーチン を通した結果を表示させたいです。
結果受け取ってないじゃん
199 :
197 :2006/01/26(木) 00:03:19 ID:???
#!/usr/bin/perl $hoge = '10'; &fuga($hoge); print $hoge; sub fuga(){ $aaa = @_ + 50; return; } returnだけで値を返したつもりですがこれでも「10」です・・・。
#!/usr/bin/perl @hoge = (10, 20, 30); print &fuga(@hoge); sub fuga(){ my($total); foreach (@_){ $total += $_; } return $total; }
$hoge = 10; $moge = fuga($hoge); print $moge; sub fuga(){ $aaa = $_+50; return $aaa; }
すまん間違った $hoge = 10; $moge = fuga($hoge); print $moge; sub fuga(){ $aaa = $_[0]+50; return $aaa; }
サブルーチンの呼び出し時は関数名の前に&を付けるべきなのか付けないべきなのか ちょっと↑見たら早速両方のパターン &あるとわかりやすいとかくらいしかメリットないのかな
俺は &foo(); のようにしてる。 渡す値が無くても括弧はつけてるかな。 ちゃんと関数が呼ばれて意図した動作なら「お好きなように」って感じかな
use Time::HiRes qw(time); time 関数を HiRes モジュールからインポートして使おうと思っているのですが、 インポートする際に関数を別名でインポートすることはできますか? HiRes の time() は mtime() とかっていう名前で扱いたいので・・・
リファンレス
>>206 use Time::HiRes;
BEGIN { $::{mtime} = *Time::HiRes::time }
&{$mtime} みたくなるってことですよね? なんか気持ち悪いw &mtime(); のようにして呼び出すことはモジュールを書き換えない限り無理ってことなのかな?
& は余計だった
211 :
208 :2006/01/26(木) 07:03:01 ID:???
ごめん解説付け忘れた
>>206 Time::HiResはExporterを使ってExportしているだけなので、
Exporterがやる仕事を自前で書いてやれば良い。
で、それは何かというと使用する側のパッケージのシンボルテーブルに
指定されたシンボルをエクスポートするということなので
BEGINブロックの中でその操作を行うと
>>208 のようになる
おぉ〜出来た♪ Exporter とか BEGIN とかそこらへんを勉強してきます。 ありがとうございました。
213 :
nobodyさん :2006/01/26(木) 09:55:58 ID:o/1/VUZ9
@number = (123,1234,124,1245); sub bynumber{ $a <=> $b}; } @number = sort bynumber @number; 配列の値を数値で並べる方法なんだそうだが、 サブルーチンがどういう働きしてるかさっぱりわからん。 誰か解説お願いします。
>208 些細なことなんですが・・・ *Time::HiRes::time の time のケツにセミコロンがありませんが (strict で書いてるけどエラー無し)、付けたほうがいいです・・・よね?
>213 昇順でソート 配列に入れる値が既に並んでしまってるのでもっとばらけて入れてみるとわかるかと ちなみに $b <=> $a ってすると降順になります
217 :
213 :2006/01/26(木) 11:11:15 ID:???
>>215 それは知ってるんですが原理がわからない・・・
>>216 そこに書いてあること読んだらなんとなくわかったような・・・
サンクスです。もうこれはこういうものとして覚えておきます。
>>217 ・$aと$bというグローバル変数に比較用の2つの値が入れられる
・<=>やcmp演算子は比較して-1か0か1を返す
・sortに与えられたサブルーチンの戻り値が-1か0か1かでどう入れ替えるか決定する
例えば @new = sort { 1 } @old; とすればsort演算子は全ての比較結果が1となったものと認識する。ソートにならないが。
220 :
nobodyさん :2006/01/26(木) 14:24:27 ID:ltI+aLo5
$data =~ /(\d) (\d)/g;なんてことをしたときに、 $1と$2のリストをそれぞれ違う配列に入れたいのですがどのようにしたら良いでしょうか? どなたか教えて頂けると嬉しいです。。
push(@list1, $1); push(@list2, $2);
222 :
220 :2006/01/26(木) 14:33:36 ID:???
分かりにくくて済みません_ _ ###$data### 3 6 2 8 9 2 となっていたとき、 @test == qw(3 2 9);@test2 == qw(6 8 2); となる様に/(\d) (\d)/の正規表現を利用して処理をしたいです。 二回正規表現を通して処理をすることも出来るのですが、単純に二倍の処理量になってしまうので。。
>>222 my $data = <<'EOD';
3 6
2 8
9 2
EOD
my(@test, @test2);
push(@test, $1), push(@test2, $2) while $data =~ /(\d) (\d)/g;
print join ' / ', 'test', @test, "\n";
print join ' / ', 'test2', @test2, "\n";
225 :
220 :2006/01/26(木) 14:59:11 ID:???
226 :
nobodyさん :2006/01/26(木) 15:08:19 ID:pZnDhk3y
コーディングに関する質問じゃないんだけど なゆ板 を探してます。 なゆ板本体一式、提供よろしく。
229 :
nobodyさん :2006/01/26(木) 15:57:50 ID:pZnDhk3y
230 :
nobodyさん :2006/01/27(金) 02:13:52 ID:fitN0QJi
おそらくリファレンスの解釈がどこか間違っているのだと思いますが、 どうしても分かりません。 どうして下記スクリプトのパターンA/Bは違う結果が出るのでしょうか? --- #!/usr/bin/perl use strict; use Jcode; my $henka= "%CA%D1%B2%BD"; #EUC / URIエスケープ / 変化 my $encoding = 'utf8'; my $j = new Jcode; # パターンA my $a1 = uri_decode( $henka ); my $a2 = encode( $a1, 'utf8' ); # パターンB my $b = encode( uri_decode( $henka ), 'utf8' ); # 書き出し print "Content-type: text/html\n\n"; print "パターンA:" . $a1 . " / " . "<br />パターンB:" . $b; exit; # サブルーチン sub encode { my( $str, $enc ) = @_; $enc = $encoding unless( $enc ); return( $j->set(\$str)->$enc ); } sub uri_decode { my $str = shift; $str =~ tr/+/ /; $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; return( $str ); }
231 :
230 :2006/01/27(金) 02:15:51 ID:???
>>230 は出来る限り省略していますので
見づらいかも知れません。
なお、Perl 5.8.3
スクリプトの文字コードはUTF-8です。
232 :
230 :2006/01/27(金) 02:23:01 ID:???
連投すいません。
書き出すスクリプトを間違えてしまいました。
>>230 は無しで改めて質問します。
233 :
230 :2006/01/27(金) 02:52:17 ID:fitN0QJi
度重なる連投申し訳ありません。 EUC-JPでURIエスケープされた「変化」である 「%CA%D1%B2%BD」を取得したいのですが、 どうしても出来ません。 どなたかご指摘いただけないでしょうか? Perl 5.8.3 / UTF-8 --- #!/usr/bin/perl use strict; use warnings; use Jcode; my $word = "変化"; my $j = new Jcode; # EUCに変換 my $word = $j->set(\$word)->euc; # URIエスケープ $word =~ s/([^\w ])/'%'.unpack('H2', $1)/eg; $word =~ tr/ /+/; # 書き出し print "Content-type: text/html\n\n"; print $word; exit;
packじゃね?もう忘れたけど。
235 :
233 :2006/01/27(金) 03:07:08 ID:???
>>234 いや、他の単語だと問題なく取得できるんですよ。
ちなみにURIエスケープは、Perlメモさんのコードを流用しています。
昔よく見たsjis系の文字化けのEUC版かな?と思いきや、
ネットにそういう情報転がってないですし…
正直、お手上げ状態になってます。
じゃあ"変化"を'へんか'にするとか。当てずっぽうだけど。
'へんか'じゃなくて'変化'ね。変換忘れた。
238 :
233 :2006/01/27(金) 03:18:59 ID:???
>>237 いや、失礼ながら明らかに意味ないと思うんですけど
my $word = "変化"; my $word = $j-> 2回myしてるのは何か意味ある?失礼ながらだけど。
>233 「できません」じゃなくて 「これこれの結果を期待したが結果はこれこれでした」でしょ。 あと他の例だとどうなったとか。 まぁぶっちゃけそんなこと書かなくても解るがな。
>>233 単にJcodeが渡された文字のエンコード判定できなかっただけだと思う。
my $word = $j->set(\$word,'utf8')->euc;
ってやってみ。
243 :
233 :2006/01/27(金) 03:43:34 ID:???
>>239 よれよれ具合を如実に表してます。typoですorz
>>240 UTF8フラグに関わることしてないと思うんですが
いかがでしょう?
>>241 ごくシンプルな例なので必要ないかと判断しました。
でも言葉足らずだったとは思います。
ご指摘ありがとうございました。
>>242 ビンゴでした!
入力コードの自動判定失敗の理由は不明ですが、
常に明示しておいた方がよさそうですね。
ありがとうございます。
Perlで処理を行った後、30秒後にある処理をキックしたいんですが、 処理A 処理A終了・・・ system("hoge.pl 43232"); ←これの中でsleep 30;をやっている みたいな書き方だと、一部のブラウザでは30秒ウェイトが発生してしまいます。 普通に、コマンドみたいな形でキックしたいだけなんですが、system以外に何か良いコマンドはないでしょうか?
>>244 なぜその場でなく30秒後にしたいのかにもよるけど、
そういう場合はforkを使ってプロセスを分ける。
atd が動いてるなら at でジョブを投げるのも手だな。 待ち状態なら後からキャンセルもできるし。
atは許可されてるかどうかが問題。 使えれば便利だろうけど。
unless (A == B) { } else {} と if (A != B) {} else { } とでは、どちらが速いでしょうか
同じじゃない?
そんな差を気にするくらいならPerlを使うべきではない
ベンチも取れんのかお前はー!
公園にいけばたいていあるのにな。
>>248 気になるなら自分で調べるなりさー…
100万回くらい繰り返さないと差なんて出ねーよ。
Benchmark: timing 1000000 iterations of not_equal, unless...
not_equal: 0 wallclock secs ( 0.20 usr + 0.00 sys = 0.20 CPU) @ 4950495.05/s (n=1000000)
(warning: too few iterations for a reliable count)
unless: 2 wallclock secs ( 0.27 usr + 0.00 sys = 0.27 CPU) @ 3759398.50/s (n=1000000)
(warning: too few iterations for a reliable count)
255 :
nobodyさん :2006/01/28(土) 05:56:33 ID:ZADCbzDw
$aに文字[abc]が入っていた場合、 $a1 = hoge; $bに文字[def]が入っていた場合、 $a1 = hogehoge; みたいにすることはできますでしょうか?
if($a eq 'abc'){ $a1 = ''hoge; } if($b eq 'def'){ $a1 = ''hogehoge; } もし $b の 処理のとき $a1 に何かが入っていない場合であるなら if(!$a1 && ($b eq 'def')){ で
ごめ $a1 に代入する文字列が '' の外に出ちゃってるw
258 :
256 :2006/01/28(土) 07:08:29 ID:ZADCbzDw
>>257 さん
ありがとうございます
でもこれとはちょっと違うんです
説明下手ですみません
$a =
[email protected] だとして
[@xx.xx]の場合、$a1 = @hoge.ne.jp;を代入
$a =
[email protected] だとして
[@yy.yy]の場合、$a1 = @hogehoge.ne.jp;を代入
みたいな感じで代入したいんです。
これは可能でしょうか?
何どもすみません
my($user, $host) = split(/\@/, $mailaddress); my($newhost); if($host eq 'abcdefg.ne.jp'){ $newhost = 'hoge.ne.jp'; }elsif($host eq 'vwxyz.co.jp'){ $newhost = 'hogehoge.ne.jp'; }else{ $newhost = 'heogehogehoge.or.jp'; }
260 :
256 :2006/01/28(土) 07:18:06 ID:ZADCbzDw
分かりやすく書きますmm もし$aが文字列[abc]を含んでいたら $a1 = hoge; # $a = "abc123"; だとしてもこの処理を行う もし$aが文字列[def]を含んでいたら $a1 = hogehoge; # $a = "def123"; だとしてもこの処理を行う
ほんとそれが「判別したいこと」のすべて? そうと信じて最後に・・・ my($mailaddress, $newhost); if($mailaddress =~ /abc/i){ $newhost = 'hoge.ne.jp'; }elsif($mailaddress =~ /def/i){ $newhost = 'hogehoge.ne.jp'; }else{ $newhost = 'heogehogehoge.or.jp'; }
>>260 index("abc", $a);
で次の条件はなんだ
"Abc"の場合も含むとかか
いくら例だとしても $1 とか $b は使うべきではないと思うんだけど・・・ これが sort に関してだったら返事してないw >262 面倒だから正規表現でやったお
$1 じゃねぇや $a ね
今気が付いたんだけど、名前欄の数字違いますからw
266 :
255 :2006/01/28(土) 07:45:20 ID:ZADCbzDw
皆さん朝っぱらからご迷惑おかけしますmm
どれもできませんでした(^^;
>>261 さん、わかりにくいくてすみません
アドレスをフォームで送ってもらい、そのアドレス欄
$mailに docomoの文字が入っていた場合、
$mailto =
[email protected] $mailに ezの文字が入っていた場合、
$mailto =
[email protected] みたいな文字列を返したいんです
わかりにくいですかね(^^;
暇なので反応w my($user, $host) = split(/\@/, $mail); if($host =~ /docomo\.ne\.jp$/i){ # DoCoMo の場合の処理 }elsif{$host =~ /ezweb\.ne\.jp$/){ # au の場合の処理 }elsif{$host =~ /[dhtcrknsq]\.vodafone\.ne\.jp$/i){ # vodafone の場合の処理 }else{ # どれにも一致しない場合 }
訂正 my($user, $host) = split(/\@/, $mail); if($host =~ /^docomo\.ne\.jp$/i){ # DoCoMo の場合の処理 }elsif{$host =~ /^ezweb\.ne\.jp$/){ # au の場合の処理 }elsif{$host =~ /^[dhtcrknsq]\.vodafone\.ne\.jp$/i){ # vodafone の場合の処理 }else{ # どれにも一致しない場合 }
冗長
270 :
nobodyさん :2006/01/28(土) 08:21:36 ID:Tyr9AIOh
例も示せない奴m9(^Д^)
間違い指摘じゃなくてお手本プリーズ
>269-270 >272
274 :
255 :2006/01/28(土) 08:29:15 ID:ZADCbzDw
>>270 さん
もし分かるようでしたら教えてください
お願いします
>255=274 >270は突付いてみただけで何も書けない人なので待つだけ無駄だよん(^ω^)
276 :
255 :2006/01/28(土) 08:43:35 ID:ZADCbzDw
>>275 さん
そうでしたか
皆様ありがとうございました
できなかったんですが
これを参考にsplit(よくわかんない)から勉強しなおしてきます
どうもありがとう
splitしなくても /\@docomo\.ne\.jp$/i とかでもOKです。
278 :
nobodyさん :2006/01/28(土) 08:53:28 ID:ZADCbzDw
require 'cgi-lib.pl'; &ReadParse(*in); って数字以外扱えないとかありますか?
主語述語をハッキリと
280 :
nobodyさん :2006/01/28(土) 09:14:12 ID:ZADCbzDw
#こんな感じで書いてます #!/usr/bin/perl require 'cgi-lib.pl'; &ReadParse(*in); my $acc = $in{'a'}; my $url = $in{'u'}; if($url = ~/ne\.jp$/i){ $st = "31"; }else{ $st = "23"; } $ge = $st*$acc; print <<"EOM"; content-type:text/html\n <html><head><title>hoger</title></head><body>\n <a href="$url">$url</a><br> 答えは$geです。<br> </body></html> EOM exit;
おまえ日本語読めてますか〜? 主語述語どころかさっきよりも日本語変になってんじゃんけ
282 :
nobodyさん :2006/01/28(土) 09:23:48 ID:ZADCbzDw
>>281 さん
すいません
言葉ではうまくいえないので
スクリプトさらしたほうがいいかと思って…
こんな風に書いててこんなエラーが出てます どこか間違えてますでしょうか? ソース開始 エラー内容開始 って書くのが普通じゃないかなと
284 :
nobodyさん :2006/01/28(土) 09:29:23 ID:ZADCbzDw
>>283 さん
フォローありがとうございます
エラーは
<a href="$url">$url</a>が正しく表示されない(31となる)
どんなURLでもすべて["31"]が返ってくる
です
一応動作はします
そりゃそうだ =~ ne\.jp$/i は「文字列の最後が ne.jp で終わっていれば」って意味だから 日本の大概のプロバイダのメールアドレスは一致するだろう
286 :
nobodyさん :2006/01/28(土) 13:28:07 ID:Tyr9AIOh
でも
>>280 前も見たな、こんなの
> if($url = ~/ne\.jp$/i){
正規表現マッチは =~ であって = ~ は意味が違う
288 :
nobodyさん :2006/01/28(土) 13:59:03 ID:ZADCbzDw
>>287 さん
ありがとうございます!
それが原因でしたm(_ _)m
でもこれって最後の文字が[ne.jp]だったらってことですよね?
文の途中に入ってても処理してくれるようにはできないんですか?
しつこいようですがお願いいたします
正規表現でググればわかるんじゃないかなー
290 :
nobodyさん :2006/01/28(土) 17:23:41 ID:ZADCbzDw
>>289 さん
正規表現マッチかなり便利そうですね
まだPerlかじりかけでして、
初歩的な質問ばかりしてご迷惑かけたことお詫びします><
これ見てやってみようと思います
>>291 だうそして、例えば Lib というディレクトリにおいて、
use lib "./Lib";
とやれば普通に require したり use したりできるようになるはずだべ。
293 :
nobodyさん :2006/01/28(土) 18:34:53 ID:kB13KdYy
すいません。教えて下さい。 クッキーをセットするサブルーチンで、 print "Content-type: text/html; charset=Shift_JIS\n"; print "set-Cookie: $COOKIE_NAME=$value; expires=$date\n\n"; と出力していて、うまくセットされていたのですが、このサブルーチン より先に別のサブルーチンを呼び出すよう変更した途端、クッキーがセ ットされなくなりました。その先に呼び出すサブルーチンその中に print "Content-type: text/html; charset=Shift_JIS\n"; があるためと思われますが、クッキーセットのサブルーチンの print "Content-type: text/html; charset=Shift_JIS\n"; を削ってもうまくセットされません。どうしてでしょうか?
予想:ブラウザに set-Cookie: $COOKIE_NAME=$value; expires=$date が表示されてる
295 :
293 :2006/01/28(土) 18:54:28 ID:HCtuTUwq
>>294 はい。その通りです。どうしたら良いでしょうか?
>>292 できました!
てっきりインストールしないと使えないものかと思ってました。
レスありがとうございました。
>>295 >print "Content-type: text/html; charset=Shift_JIS\n";
お前、この文の意味わかってるか?
298 :
293 :2006/01/28(土) 19:43:54 ID:3C15B2MW
>>297 すいません。分かりません。教えて下さい。
>>293 のIDが全て違うから、もうこの話は終わりにしよう
300 :
293 :2006/01/28(土) 21:21:54 ID:wIuX5Wpl
すいません。そういう体質なもので仕方がないのです。 どなたか引き続き教えて下さい。
ここはPerlのコーディングスレでCGIスレではないんだが。
>>300 オライリーの「CGIプログラミング」15分でいいから立ち読みしてこい。
perl で例えばファイルをコピーする場合に、 何%終了のようなメッセージをどうしたら出力できますか?
ActiveXとかFlashとか使わないと無理
いや、ファイルをコピーの状況にもよるだろ。 CGIスレじゃないし、ローカル上のやりとりだと仮定すればできる。 具体性に欠ける質問には答える気0だけどな。
>>303 stat関数でファイルサイズを求めておき、read,writeのループをしながら読んだ・書いたバイト
数を累積していき、時々%を計算してprintすれば良いんじゃない?
1レスポンスしか投げれないからなぁ。 Ajaxからめたら強引にできそうだけど。
俺だったら FTP 開けるなw
ネットワーク越しにコピーするとは誰も言ってないのに... Ajaxとか... FTPとか... キミ達の妄想力には呆れるばかりだよ。
友達がいないんだからしかたねーじゃん。
>>303 がどちらとも取れる質問なんだから、
どう答えても問題なし。
明確な回答が欲しければ、明確な質問をすること。
312 :
309 :2006/01/29(日) 11:15:29 ID:???
俺が質問者だと思い込むキミの妄想力には呆れるばかりだよ。
314 :
309 :2006/01/29(日) 11:58:10 ID:???
俺は309だよ。
じゃあどうでも良いな。
316 :
309 :2006/01/29(日) 12:48:06 ID:???
騙り本気でウザいんだけど
317 :
309 :2006/01/29(日) 13:08:17 ID:???
>>316 そうか? 俺はお前に騙られても別にウザくないぞ。
最初にあおったのは309だと思う (゚∀゚)ノ
319 :
309 :2006/01/29(日) 13:14:28 ID:???
320 :
309 :2006/01/29(日) 13:18:43 ID:???
>>318 煽ったのは俺だが、騙ったのは別の誰かだ。
煽ってないとは一回も発言してない。
まさかとは思うが「騙る」を「あおる」と読んでる?
ここはPerlという言語だけではなく日本語という言語の勉強も行うスレですね
煽るから騙られることにさえ気づけない
>>309 が居るスレはここですか?
まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ
while (<STDIN>) { chomp; last if $_; } で入力待ちしているときに、 カウンタダウンを表示させたいとすれば、どういった方法を取ればいいのでしょうか?
そもそも last if $_; なんかやると、何か受け取るだけでループを抜けるのでは?
仮に last if $_; が last if !$_; であったとして、 0 とだけ書いた行が出て来るとループ抜けるですね。
327 :
nobodyさん :2006/01/29(日) 17:09:51 ID:??? BE:50503853-#
カウントダウンて何
sleepで1秒ごとに文字を表示しながら、 キー入力を受け付けたいのです。
意味不明です。 具体的に描写してください
あ・・・ここWebProgだった。ム板じゃない。吊ってきますorz
>>293 どうみても、print "set-Cookie: $COOKIE_NAME=$value; expires=$date\n";
print "Content-type: text/html; charset=Shift_JIS\n\n"; です。
本当にありがとうございました;
332 :
309 :2006/01/29(日) 20:25:54 ID:rcECZvhl
ここは騙ることで報復したと思えるお子様が住み着いているスレでしたか。 ム板でバカにされてるのもうなずける。
332 309 New! 2006/01/29(日) 20:25:54 ID:rcECZvhl ここは騙ることで報復したと思えるお子様が住み着いているスレでしたか。 ム板でバカにされてるのもうなずける。
>>328 ああそういう意味ね
適当にforkなりthreadなり使え
336 :
309 :2006/01/29(日) 21:25:22 ID:???
> ム板 Perl スレ住人 最底辺を自慢してどうしたいんだよ。
粘着うざいな
顔が真っ赤なお子様がいると聞いて飛んできました
>>335 ありがとうございます。一つ挑戦してみます。
質問カモン
いくら待っても質問してこないから逝く
>>263 $a や $b を使った場合に、
実際に不具合が起こるケースにはどういうケースがあるでしょうか?
「これこれこういうことが起こりうるから使っちゃダメ」
みたいな具体例があれば教えていただきたく。
>>343 ヒント与えられてるんだから、調べろよw
WWW::Mechanizeって、対象ページはEUCのページしか無理なんでしょうか? サンプルを見る限り、どれもEUCで書かれたページしか対象になってないので・・。 ShiftJIS対応のサンプルとかあれば、参考になるのでありがたいんですけど・・。 Encode.pm使ってコード変換とかしたらなんとかなります?
>>345 意味分からん。
データを取得するのに文字コードなぞ関係あるか。
昔からこのスレってこんなレベルだっけ?
#!/usr/bin/perl
use strict;
use WWW::Mechanize;
my $mech = WWW::Mechanize->new( autocheck => 1 );
$mech->get( "
http://www.excite.co.jp " );
print "Content-type: text/html\n\n";
print $mech->content;
exit;
print "Content-type: text/html; charset=Shift_JIS\n\n";
349 :
345 :2006/01/31(火) 01:22:22 ID:???
>>346 データを取得するだけなら、Mechanizeじゃなくても・・。
フォームに自動入力させたり、リンクたどったりするために使いたいんですけど・・。
そのときに文字コードが関連してうまくいかなかったりするのかなぁと思って
聞いてみたんですけど・・。
見当違いの発言してますか?・・・多分してるんだろうなぁ・・。
>>349 見当違いと言うか、試す前に質問するのが間違いだな。
>>1 > 1: 自分はこういう事がしたい。
> 2: それでこんな風にやってみたが・・・
> 3: こんなエラーが出て上手く行かなかった。
351 :
347 :2006/01/31(火) 03:09:04 ID:???
>>349 いや、何となく意図は分かったが、
質問力と実践力の無さを婉曲的に指摘してみた。
EncodeでもJcodeでも
自分なりに試して、それでどうしてもダメだったら聞けば?
質問文に書かれている以上のことを
「おそらくこういうことが言いたいんだな」と想定してあげて、
もし質問者の意図と違ってたら、
回答者の労力って本当に無駄だよね。
だが、そこまでやれる人は初心者質問スレに来なくとも自力で解決できるw ある意味矛盾ってやつですなw
>>353 Mechを挙げた時点で、シンプルにページのデータ取得だけを目的としたものではないと
検討がつくはず。データ取得ならLWP::Simpleでもできる。
>>345 Spidering Hacksって本の最後のほうに解決策があるよ。ググってみて。
>>354 だから、何でわざわざ推測してやらにゃって話だろ? 書かれた問いに対しての回答としてひとつも間違っちゃいない
356 :
nobodyさん :2006/01/31(火) 12:17:22 ID:h8hzbfFv
>>355 の性格が露呈してるな。
どんな性格かは言わずもがなだが。
357 :
nobodyさん :2006/01/31(火) 12:58:54 ID:FkRWAlIz
perlで認証付きサイトを構築しようと考えています。 まずlogin画面があり、認証後サイトを見れるという感じなのですが 認証後のサイトURL直入力などを防止する為にはどのような対応が良いのでしょうか? idとパスワードを画面遷移ごとにpostデータとして送るというのはなんか パスワードがソース内に表記されているという事で嫌な感じがしますが 一般的なのでしょうか? 最近のセキュリティソフトではリファラを出さないそうなのでこれも使用しない 方向で考えています。 どなたかお知恵を拝借願います。
常にリファラを厳重にチェック クッキー使用(クッキーにはユーザー名もパスワード名も入れない。セッションIDのみ)
> 常にリファラを厳重にチェック Apache の仕事じゃね?
特定のページからしか飛べないページがあった場合、それはApacheの仕事ですかそうですか なるほどね すっごいや
>>362 別に間違っちゃいないが。
リファラ吐かないのならhtaccessに頼ろうがcgiに頼ろうが変わらないし。
>363 投稿確認のページ(例:index.php?exec=setcheck)があった際に、リファラは投稿ページ(例:index.php?exec=posting)である必要があるよね? 投稿確認ページでチェックするリファラが空であったり、投稿ページ(例:index.php?exec=posting)以外であればそれを弾く。 チェックとはそゆことを言ってます。 リファラ吐かない鯖なんて前提にしてません。
ついでに >最近のセキュリティソフトではリファラを出さないそうなのでこれも使用しない との事なのでリファラ取得が前提とした質問かな (今気が付いたんだけどねorz)
だな。仕様書読めと。
>>365 逆じゃない? リファラ取得できない場合があるからリファラで判定したくないって
読めるんだけど
> 投稿確認のページ(例:index.php?exec=setcheck)があった際に、リファラは投稿ページ(例:index.php?exec=posting)である必要があるよね? スパゲッティ得意?
>>359 のBasic認証はスルーですかそうですか。
IDとパスワードがどんな形で渡すのかわからんが
場合によったら一番手っ取り早いだろ。
basic って、ssl かまさないと見放題だよな。
>>371 それを言ったらSSL通らない通信はみんな信頼性にかけるし。
357がどれだけの信頼性が必要なのかがわからんけど、
仲間内だけで運営するとか、登録した人だけサイトが見られるとか
そんな感じなのであれば、Basic認証やらDigest認証で十分でしょ。
>>372 スマン、自分が仕様書読めてなかった。今は反省している。
んでだ、質問者はこねぇのか?
Win環境でファイルを新しい順にソートしようとしてるのですがうまくいきません いろいろサンプルを見ながら試してて気が付いたのですが (stat($file))[9] としたときに更新日付が帰ってきてませんでした stat 以外でファイルのタイムスタンプを取得する方法ってありますか?
どうしてそこで自分の stat() の使い方のほうを疑わずに stat() の方を疑うのか?
んぁ〜ごめんなさい。明らかな自分のミスでした。 opendir(DIR, "./$datdir") のようにしてファイル一覧を取得してからファイルのタイムスタンプを取得しようとしてたんですが、 stat("./$datdir/$file[$i]") のようにすべきなのにディレクトリを指定し忘れていただけでした。 回答をしていただいたのにくだらないミスで済みませんでした。
380 :
nobodyさん :2006/01/31(火) 20:18:16 ID:RrDOFj4a
掲示板CGIです。 Jcode.plを使って投稿時に含まれている半角カタカナは 全角カタカナに変換するようにしたのですが、 半角カタカナのみの投稿の場合動作しません。 これはなぜなんでしょうか? 該当部分のソース # S-JISコード変換 &jcode'convert(*value,'sjis'); #半角カタカナ変換 &jcode'h2z_sjis(\$value); これがフォームでコードの部分に入ってるだけ。
>>380 &jcode'convert(*value,'sjis');
を削除したら多分OK
384 :
nobodyさん :2006/01/31(火) 22:12:12 ID:POWreMm8
掲示板のログファイルの更新をする時、古いファイルを読みながら更新された内容を 新しいファイルlog_new.cgi書き込み、書き終わったところで古いファイルをlog_old.cgiに rename、新しいファイルをlog.cgiにrenameとしました。 この方がメモリ使用量が少なく、書き込みの時に異常停止した場合ログ破壊が起こり にくいと考えました。 しかしファイルのパーミッションを600にしたいのですが、open では出来ず、sysopenでしか出来ないと知って困ってます。 パーミッションだけの ためにファイルI/Oは全てsys*にしないとならないのでしょうか?
なんだか知らんが、権限なくてchmodができないってことかいな?
>>384 open してから書き出しはじめるまでの間に chmod すれば?
システムコールとライブラリ関数を併用したらまずいのって バッファリングの問題なんだからsysopenだけなら他はシステムコールにしなくてもいいんでは? 実際perlfaq5で以下みたいな例文でてるし。(話題そのものは別のもの) use Fcntl qw(:DEFAULT :flock); sysopen(FH, "numfile", O_RDWR|O_CREAT) or die "can't open numfile: $!"; flock(FH, LOCK_EX) or die "can't flock numfile: $!"; $num = <FH> || 0; seek(FH, 0, 0) or die "can't rewind numfile: $!"; truncate(FH, 0) or die "can't truncate numfile: $!"; (print FH $num+1, "\n") or die "can't write numfile: $!"; close FH or die "can't close numfile: $!";
388 :
386 :2006/01/31(火) 22:48:57 ID:???
>>387 じゃなくて、 open するときにパーミッションを指定できない、という話でないの?
>>388 がーん。そうでしたか。
sysopenだと他も全部システムコールにしなくちゃいけなくてイヤって言ってるのかと思いました。
387はスルーしてください。
>>384 sysopen とどちらが楽かは微妙だが、一時的に umask を変える。
my $orig_umask = umask 077;
blah, blah, blah...
umask $orig_umask;
>>380 結果が文字化けするなら分かるけど、
動作しないってのは分からん。
>>384 IO::FileかFileHandle使うと便利。
392 :
384 :2006/02/01(水) 01:05:17 ID:ngruutod
皆さんありがとうございます。
>>389 さん、いやピンポンですよ。 sysopenで
openだけを入れ替えられるとは思いもしませんでした。
>>391 も便利そうですね。
試してみます。
perl -W と実行すると Use of uninitialized value in 〜 といったエラーが出てきました。 エラーが出た個所を見てみると $in_method = $ENV{'REQUEST_METHOD'}; のように環境変数を代入してるほとんどでエラーが出ています。 環境変数から値を持ってくるときは = で代入しちゃいけないんでしょうか?
環境変数の中身が安全って信用出来ないからね。 正規表現でマッチさせて代入させればいいよ。
>環境変数の中身が安全って信用出来ない ここに注目して、環境変数も中身がちゃんとあるかどうかチェックしながら代入するようにしてみました。 エラーは無くなったものの、面倒くさいなぁw
変えた手順書いてなかった エラーのあったときの記述 $in_type = $ENV{'CONTENT_TYPE'}; 修正した記述 $in_type = $ENV{'CONTENT_TYPE'} ? $ENV{'CONTENT_TYPE'} : ""; CONTENT_LENGTH のときは "" じゃなくて 0 を入れるようにした。
$in_type = $ENV{'CONTENT_TYPE'} or ''; $len = $ENV{'CONTENT_LENGTH'} or 0; でもできるよ。 ただこの場合、偽の時は常に空になっちゃうから、 空文字列、0、未定義値を見分ける必要がある場合はやめたほうがよい。
>>398 > $in_type = $ENV{'CONTENT_TYPE'} or '';
これは
($in_type = $ENV{'CONTENT_TYPE'}) or '';
こういう意味になる。
書くなら、
$in_type = $ENV{'CONTENT_TYPE'} || '';
$in_type = ($ENV{'CONTENT_TYPE'} or '');
このどちらか。
0もfalse扱いされるから扱いに注意。
>>400 おっしゃるとおりです。
||を言いたかったんですが、間違えました…。
同じのをつらつら書くの面倒&きれいじゃないと思ってたんで、 $in_type = $ENV{'CONTENT_TYPE'} || ''; って書き方がいいかなと思ったんですが、 >399さんの最後の一言を考えて、 $in_type = defined($ENV{'CONTENT_TYPE'}) || ''; っていうのじゃ駄目ですか? とか書いた瞬間に駄目と気付いたw defined を使うなら $in_type = defined($ENV{'CONTENT_TYPE'}) ? $ENV{'CONTENT_TYPE'} : ''; ぐらいにしからないですかね。 とりあえず $in_type = $ENV{'CONTENT_TYPE'} || ''; が見た目的にも、自分てきには見やすいかな
この些細なこだわりも利用者にはわからないorz
$test="a\b\c"; @k=split(/\\/,$test); $testの中身を\で分割したいんだけど↑じゃできねぇ 何かいい方法ない?
$test='a\b\c';
いつもダブル使うからだめだったのか
>>405 サンクス
$test="a\\b\\c";
408 :
nobodyさん :2006/02/02(木) 23:57:22 ID:6Tw8pfAF
Spidering Hackで
#!/usr/bin/perl -w
use strict;
use LWP 5.64;
my $word = shift;
$word or die "Usage: perl altavista_post.pl [keyword]\n";
my $browser = LWP::UserAgent->new;
my $url = '
http://www.altavista.com/web/results ';
my $response = $browser->post( $url,
[ 'q' => $word, # the Altavista query string
'pg' => 'q', 'avkw' => 'tgz', 'kl' => 'XX',
]
);
die "$url error: ", $response->status_line unless $response->is_success;
die "Weird content type at $url -- ", $response->content_type
unless $response->content_type eq 'text/html';
if ( $response->content =~ m{ found ([0-9,]+) results} ) { print "$word: [RETURN]
$1\n"; }
else { print "Couldn't find the match-string in the response\n"; }
↑のようなコードが出てきたんでコピペしてDosプロンプトで実行したら
C:\Perl\bin>perl altavista_post.pl tarragon
http://www.altavista.com/web/results error: 302 Found at altavista_post.pl line 13.
のようなエラーが出ました。どこが間違ってるのでしょうか?
Windowsで通るようにするにはどうすればいいのでしょうか?
>>408 斜め読みだけど、302が返ってきてるからリダイレクト指示でしょ。
んで、そのスクリプト200以外の応答は全部エラーにしてるみたい。
というわけで、$urlの値の末尾に/つければいけるんじゃない。
410 :
nobodyさん :2006/02/03(金) 00:07:29 ID:PieRIOHf
>>408 Altavistaってまだあったんだw
このコードはどこでも動かないよ。 サイトの仕様が変わってる。見てみたらいまじゃ
Yahooに投げてるだけ。
411 :
408 :2006/02/03(金) 00:11:00 ID:HpXFHvtB
412 :
無知ですまそ :2006/02/03(金) 02:46:12 ID:SfkSG4GR
他のスレを汚してしまってすみません。 パスワードチェックで if ($FORM{'pass'} ne 'aaa') { &error("パスワードが違います"); } としたのだけど、aaaとbbb以外は違うとするにはどうすればいいのか教えてください。
$FORM{'pass'} !~ /^aaa$|^bbb$/
414 :
無知ですまそ :2006/02/03(金) 02:58:13 ID:SfkSG4GR
ありがとさ〜ん(。・ω・)ノ♪
415 :
無知ですまそ :2006/02/03(金) 03:02:22 ID:SfkSG4GR
でけたーーーーーーありがとうございました!!
>>412 if ($FORM{'pass'} ne 'aaa' || $FORM{'pass'} ne 'bbb')
my %valid_pass = ("aaa" => 1, "bbb" => 1); unless ($valid_pass{$FORM{'pass'}}) { &error("..."); };
そういえばunlessって使うと読みづらくなるってのを見て以来 こつこつとif文しか使ってないや。
使い分けるより1つに絞った方がいい っていうだけのことじゃなくて?
421 :
418 :2006/02/03(金) 15:53:17 ID:???
俺の場合、条件式に否定が含まれてるときは混乱するので unless は使わないが、 条件式が単純な場合は unless の方が「〜でない」という意図がハッキリ伝わる ような気がするので unless を使うようにしている。 変かな?
使い分けに意図を載せることができればいいんだよ。
if ( hoge ) { unko; } if ( not hoge ) { kuso; } しか使わない漏れが来ましたよ。
>>421 せっかくあるんだし、そういう条件付ならいいかも。
ただ、ほとんどの場合は if + !式 の組み合わせの方が
タイプが少なくて済むんだよね。
until は while と同じだからいいんだけど。
>423は if ( hoge ) { unko; } else { kuso; } でいいんじゃないのか?
>472 この二つのパターンしか使ってないよ っていう意味じゃないの?
AAA BBB CCC DDD EEE ↓ ├AAA │ └BBB │ ├CCC │ └DDD └EEE 階層は無限。 どういうコーディングすればよいのかちょっと分からないのでお助けを...
【投稿する際の注意】 質問するときは内容をよく吟味してから投稿してください。 「コマンドの意味がわかんない」とかはマニュアル見ましょう。 回答者さんは何でも屋じゃありません。 1: 自分はこういう事がしたい。 2: それでこんな風にやってみたが・・・ 3: こんなエラーが出て上手く行かなかった。
エスパーマミ登場 たぶんインデントされたものを罫線付きで表示したい って意味だと思うの
再起処理でディレクトリとファイル一覧を取得して、 階層数を記憶しておいて、それに見合った「│ 」やら「└」を出力すればおk
ディレクトリ階層でなくてただの文字列だと思うの
434 :
429 :2006/02/05(日) 02:17:56 ID:???
説明不足でゴメンナサイ。
やりたいことは、エスパー魔美タンの言う通りです。
>>431 >>433 行毎に文字列が書かれている
インデント無しなら1階層目、インデント1つなら2階層目、インデント2つなら3階層目・・・∞
「│」「├」「└」を使用して全て繋がっている木構造を出力する
かなりの難問です。スミマセン。
必要なところだけ罫線を上書きする感じ。 うーん、汚い。 my @result; my $maxdepth = 0; while(<DATA>){ /( *)(.*)/s; my $depth = length $1; push @result, [(" ")x($depth+1), $2]; $maxdepth = $depth if $maxdepth < $depth; } for my $d ( 0 .. $maxdepth ){ # $d=注目階層 my @class = grep { 2+$d == scalar @{$result[$_]} } 0..$#result; $result[$_][$d] = "┃" for $class[0] .. $class[-1]; $result[$_][$d] = "┣" for @class; $result[ $class[-1] ][$d] = "┗"; } print join '',@$_ for @result; __DATA__ AAA BBB CCC DDD EEE
436 :
429 :2006/02/05(日) 02:36:19 ID:???
難問に挑んでいただき、ありがとうございます(ペコリ) デキタ!と思ったら反例が見つかったのでご報告。スミマセン AAA BBB CCC DDD EEE FFF GGG
A AB ABC ABD ABE ABEF G ループしながらスタックでこんなの作ってやれば 親が末っ子かどうかで" "か"┃"を塗り分けて 自分が末っ子かどうかで"┗"か"┣"を塗り分けられそうだ 後はパス
一気にやるんじゃなくて、再起を使えばかんたんじゃないの? んで再起で呼ぶときに行頭のスペースの数を渡してやって、それに一致しなければ抜けるようにすればいい と思う 明日中に解決してなければ、まぁ微妙に面白そうだしやってみようかなとか思う
439 :
nobodyさん :2006/02/05(日) 07:20:36 ID:V48VHYZU
質問です 1.$wordの文字列から6バイト目以降か7バイト目以降を削除したい 2.5バイト目が半角英数字なら6バイト目以降を削除(つまり1〜5バイト目残し) 3.5バイト目が日本語コードなら7バイト目以降を削除(つまり1〜6バイト目残し) どうやれば一番効率がいいですか?
Perlメモ熟読して来い
>>429 my $level = -1;
my @stack;
my $base = (my $p = [['*root*', []]]);
while(<DATA>){
m/^( *)(.*)$/;
my $count = length($1);
if ($count > $level){
$count > ($level+1) and die "Illegal data.";
push(@stack, $p);
$p = @{$p}->[-1]->[1];
} elsif ($count < $level){
foreach(1..($level-$count)){
$p = pop(@stack);
}
}
$level = $count;
push(@{$p}, [$2, []]);
}
array_dump($base->[0]->[1], '');
442 :
441 :2006/02/05(日) 09:48:46 ID:???
sub array_dump { my ($p, $marker) = @_; my $mark = ['├', '│']; foreach(0..$#{$p}){ $_ == $#{$p} and $mark = ['└', ' ']; print $marker, $mark->[0], $p->[$_]->[0], "\n"; @{$p->[$_]->[1]} and array_dump($p->[$_]->[1], $marker. $mark->[1]); } } __END__ AAA BBB CCC DDD EEE FFF GGG
443 :
nobodyさん :2006/02/05(日) 10:33:20 ID:V48VHYZU
>>441 さん
>>439 にもアドバイスを・・
$word =~ s/^....[0-9]/^...../g; …?
445 :
nobodyさん :2006/02/05(日) 11:27:05 ID:V48VHYZU
446 :
nobodyさん :2006/02/05(日) 11:35:15 ID:V48VHYZU
>>445 あれ書きかけで送信してしまった
いちおう自分でどうにか書いたんですが\x81が
おかしくなるんですよね
$words = substr($word,0,6);
if ($words =~ m/^....[\x20-\x7f\xa0-\xdf]/)
{
$words = substr($words,0,5);
}else {
$words;
}
だから「熟読」して恋と小一時間(ry
448 :
nobodyさん :2006/02/05(日) 11:45:31 ID:V48VHYZU
刹那主義ですなあ
450 :
nobodyさん :2006/02/05(日) 12:01:05 ID:V48VHYZU
帰って下さい。
452 :
nobodyさん :2006/02/05(日) 12:21:46 ID:V48VHYZU
なんだ、釣りかよ。
どうせ切ろうとした部分がマルチバイト文字かどうかの判定もできんのだろう 正規表現を使うことすら頭に出てこないお子様なんだろうがな おっと触っちまった、以下スルーよろ
455 :
nobodyさん :2006/02/05(日) 13:12:20 ID:EWGu37QN
>>57 ってたいした知識ないんだな。
その程度の知識でいきがってるようじゃw
2週間以上&400も前のレスにレスつけてる455が居るスレはここですか?
きっとノルマがあるんだよ。なりふり構ってられないんだろう。
ID表示しながら自演とか、なかなか図太い神経してますね(>_<)
459 :
429 :2006/02/05(日) 22:55:31 ID:???
>>441-442 華麗なコーディングありがとうございました。
完璧です。多重配列を使いこなせる人はスゴイ。
自分もいろいろと考えてみた結果
・自分の状態("└"か"├")
・自分の全ての親の状態("│"か" ")
が分かれば木構造が作れるのに気付いたので
1. 逐次走査して全項目の状態("└"か"├")を調べて記録する
2. もう一度逐次走査して親の情報を作りながら木構造を作っていく
とすることで目的の処理ができました。(再帰と多重配列は使わず)
お世話になりましたー。
460 :
nobodyさん :2006/02/06(月) 11:55:45 ID:kZ4iy7FB
質問です htmlのtextareaの内容を入力として、外部の実行ファイル(例えばsort等)に投げて、 htmlとして出力を得るような方法はありますか? perlコーディングと関係ないかもしれませんがよろしくお願いします。
>>459 そのコードを見てみたかったな。
考えてみたけど、こんなのしか考えつかなかった。
my @data;
my $max = -1;
while(<DATA>){
m/^( *)(.*)$/;
my $level = length($1);
push(@data, [$level, $2, '']);
($level > $max) and $max = $level;
}
foreach my $level (0..$max){
my $found = 0;
foreach(reverse(0..$#data)){
if ($data[$_]->[0] < $level){
$found = 0;
} elsif ($data[$_]->[0] == $level){
$data[$_]->[2] .= ($found ? '├' : '└');
$found = 1;
} else {
$data[$_]->[2] .= ($found ? '│' : ' ');
}
}
}
foreach(0..$#data){
print @{$data[$_]}[2, 1], "\n";
}
463 :
429 :2006/02/06(月) 23:52:11 ID:???
お世話になったので公開。大したモノでなくスレ汚し申し訳ない。 #勉強がてらに多重配列を使ってみました while (<DATA>) { m/^( *)(.*)$/; $now = length $1; push @data, [$now, $2, 0]; # [階層の深さ, 項目名, "├"なら0、"└"なら1] $tmp[$now] = $.-1; # 階層毎に一番最後に出現した行の「行番号-1」を記録 $max = $now if $now > $before; if ($now < $before) { $data[$tmp[$_]][2] = 1 for $now+1..$max; $max = $now; } $before = $now; } $data[$_][2] = 1 for @tmp; $before = 0; @tree = ('│', ' ', '├', '└'); for (0..$#data) { $now = $data[$_][0]; if ($now > $before) { push @parent, $data[$_-1][2]; } elsif ($now < $before) { pop @parent for 1..$before-$now; } print $tree[$_] for @parent; print $tree[$data[$_][2]+2], $data[$_][1], "\n"; $before = $now; }
>>463 なるほど。
> if ($now < $before) {
> $data[$tmp[$_]][2] = 1 for $now+1..$max;
> $max = $now;
> }
この処理で、一回のループで行けるわけですね。
ありがとう。
465 :
nobodyさん :2006/02/07(火) 06:10:53 ID:wug3jbil
1: 自分はこういう事がしたい。→ 計算機 2: それでこんな風にやってみたが・・・ → やってみましたけど… 3: こんなエラーが出て上手く行かなかった。 → 2**64 = 1.84467440737096e+019 実数ではなくてこんななっちゃいましたorz アドバイスお願いします
bigint
467 :
nobodyさん :2006/02/07(火) 06:28:08 ID:wug3jbil
>>466 こんな時間にありがとうございます
多倍長整数なんて初めて聞きました
bigintをどうすればおkなんでしょうか?
use bigintすればOK
469 :
nobodyさん :2006/02/07(火) 06:32:44 ID:wug3jbil
>>468 #!/usr/bin/perl
use bigint
↑たったこれだけっすか?
そうだよ ";" を忘れずに
感動した。 $ perl -e "use bigint;print 2**64;" 18446744073709551616
472 :
nobodyさん :2006/02/07(火) 06:39:39 ID:wug3jbil
>>470 ん〜エラーになるんですよね…
Error 500
CGI エラー - Content-Type ヘッダが正しくありません。
CGI 出力メッセージ:
Can't locate bigint.pm in @INC (@INC contains: C:/Perl/lib C:/Perl/site/lib .)
at C:\httpd\www\tes.cgi line 3.
BEGIN failed--compilation aborted at C:\httpd\www\tes.cgi line 3.
>>472 ____ 、ミ川川川彡
/:::::::::::::::::::::::::""'''-ミ 彡
//, -‐―、:::::::::::::::::::::三 ギ そ 三
___ 巛/ \::::::::::::::::三. ャ れ 三
_-=三三三ミミ、.//! l、:::::::::::::三 グ は 三
==三= ̄ 《|ll|ニヽ l∠三,,`\\::三 で 三
/ |||"''》 ''"└┴‐` `ヽ三 言 ひ 三
! | / 三 っ ょ 三
|‐-、:::、∠三"` | ヽ= U 三. て っ 三
|"''》 ''"└┴` | ゝ―- 三 る と 三
| / ヽ "" ,. 三 の し 三
| ヽ= 、 U lヽ、___,,,...-‐''" 三 か て 三
. | ゝ―-'′ | |::::::::::::_,,,...-‐'"三 !? 三
ヽ "" ,. | | ̄ ̄ ̄ 彡 ミ
ヽ、___,,,...-‐''" ,,..-'''~ 彡川川川ミ
厂| 厂‐'''~ 〇
| ̄\| /
474 :
nobodyさん :2006/02/07(火) 06:44:04 ID:wug3jbil
>>473 いやマジッス!
つーかクロ高のAAワロスw
>>472 はhttpdでローカルで試した結果です
Perl5.8入れてみよう
476 :
nobodyさん :2006/02/07(火) 06:55:34 ID:wug3jbil
use Math::Bigint; もダメぽ・・ 5.6…だたよママン
たまに釣られてみるのも悪くは無いかな・・・ print "content-type: text/plain; charset=Shift_JIS\n\n"; Shift_JIS のところは編集してるファイルの文字コードにあわしてね
>>477 いや、
>Can't locate bigint.pm
のところが問題なんじゃないのか?
回答者も初心者かよ いい加減にしろよ
anhttpdはCGIの動作は怪しいからapache入れた方がいい それかコンソールで確認するか…
アクティブパールでローカル上でcgiを走らせているんですが、 require "./jisaku.pl"; などファイルをインクルードする文を実行する命令を付け足すと、画面が真っ白になってどうにもなりません。 require命令を消して実行すると上手くいきますが、 どうしてもファイルを分割してコーディングしたいです。 どうにかなりませんか。
jisaku.plから呼び出し元の関数呼んでたり、無い関数を呼んでたりしてない?
483 :
481 :2006/02/07(火) 14:50:54 ID:???
>>482 してません。
私は、新しく作るサブルーチンは全てメインファイルに記述し、
動作確認ができてから分割するという習慣をとっていますし、
jisaku.plから呼び出し元の関数を呼んでいたりはしません。
で、気づいたんですが、kentwebさんのlight.cgiを見てみると
require命令にシングルクォートを使っているので、もしかしたらダブルクォートを使ったのが
いけなかったんじゃないか・・・と思います。
でももうコーディングする時間がないので誰か誰かあああぁぁぁぁぁん。
とりあえずログ晒せよ
>>483 jisaku.plが真を返してないとか。
jisaku.plの最後に1;って書いてみ
>>429 ツリーって下から考えたら楽じゃね?
my @data = reverse <DATA>;
my (@tree, @rule, $depth);
foreach (@data) {
/^( *)(.+)/;
$#rule = $depth = length($1);
$rule[$_] = !!$rule[$_] for 0 .. $depth-1;
$rule[$depth] = 2 + !$rule[$depth];
unshift @tree, join '', (' ','│','├','└')[@rule], $2, "\n";
}
print @tree;
楽しい初心者サークルでつね。
自分のスクリプト否定されたからって「〜でつね」とか書くな
perlの解説書読むと、日本語とか、ちゃんとUTF8でエンコードしてやり取りしなさい って書いてあるんだけど、そんなことしなくてもちゃんと動くし最後のhtml出力でシフトJISに指定やれば 問題なく表示されますよね。 なんかやるメリットってあるんでしょうか?
>>491 ハーシー 速攻図解プログラミング Perl/cGI
です。
まあ別にUTF-8に越した事はないが・・
>>490 起き得る不都合とその回避方法を把握しているなら、別にどの
文字コードでスクリプトを書こうが問題無い。
ただ、今の perl は UTF-8 を前提に動いているし、UTF-8 なら
Shift_JIS を直接扱う時のように ASCII とのバッティングが起こら
ないし、EUC-JP は日本ローカルな文字コードであるのに対し
UTF-8 は世界的に使われている文字コードなので、まだ UTF-8
の認知度が低かった数年前ならともかく、現時点でこれら3つの
中から選ぶなら UTF-8 が「無難な選択」になる。
utf8前提だったら、use utf8なんてなくなってるよ。 テキスト処理で速度が必要な場合は、その文字コード用に コード書いた方が断然よい。前にJISのテキスト処理をutf8で やったら、変換に時間かかりすぎて使い物にならなかった。
> テキスト処理で速度が必要な場合は、その文字コード用に > コード書いた方が断然よい。 > 前にJISのテキスト処理をutf8で > やったら、変換に時間かかりすぎて使い物にならなかった。 頭大丈夫?
メール送信フォームを作っています。 #名前 <tr> <td class=r align=right width=110>名前 <font color=red>※</font></td> <td class=r width=440> <input type=text name=name size=30 style='ime-mode:active' value="$cnam"></td> </tr> # 項目1 print "<input type=radio name=hoge value=\"A\" checked>A \n"; print "<input type=radio name=hoge value=\"B\">B \n"; リターンメールで $mbody .= "名 前 = $in{'name'}\n"; はメールの本文にちゃんと出るのに $mbody .= "項目1 = $in{'hoge'}\n"; は表示されません。。 考えられるミスがわかる方ご指摘お願いいたしまするー
端折ってソースさらしてるのは「お前らエスパーなんだろ?読みとれや」ってことですか?
答えられる人はいないのですか?
>>497 > 考えられるミスがわかる方ご指摘お願いいたしまするー
考えられる可能性は1つしかない
> $mbody .= "名 前 = $in{'name'}\n";
とエディタで書いた後でソースを保存したが
> $mbody .= "項目1 = $in{'hoge'}\n";
と書いた後でまだ保存してない。
$in{'hoge'} の中身を print するなりしてちゃんと確かめてみるが良かろう
両方チェックOnすると hoge って name で2つPOSTされるね。 $in{'hoge'}にABとでも入ってほしいのかの。 フォームのデコード処理が甘いと空になっちゃうかもね。
503 :
497 :2006/02/08(水) 01:15:50 ID:???
BASIC レベルのウンコスクリプトを書く人と、 モジュールわんさかのスクリプトを書く人の 2種類しかいない Perl 界隈。
前者はともかくとして、後者は何か問題なのか?
モジュールを再発明する人も含めて3種類。
二極化している、と言いたいんじゃないか?
広告挿入されまくりでソースがファオアフォになってるw
>>508 どこで差がついちゃうのか、何が分かれ目になるんだろうねえ?
あるものは使え(中身が分からなくても動くならOK) コピペしてでも自分のソースに必要最小限だけしか入れたくない じゃないのかな
512 :
nobodyさん :2006/02/08(水) 22:25:24 ID:VDqpPhRj
任意の時間(単位=秒)をフォームに入力、 それを年、月、日、時、分、秒 で返したいんですがどのようにするといいですか?
素人が多くなったな
>514 任意ってのは好きな時間を入力できるって意味で、何時の時間を基準とするかが示されていない 1970が基準とするならgmtimeでもlocaltimeでも好きなのを使え 1970以前なら・・・俺にゃわからんので他の人おながい
518 :
nobodyさん :2006/02/09(木) 04:04:11 ID:I2pVJ8U2
掲示板を作成していて書き込んだ内容を管理人が自由に削除したり出来るようにしたいのですが ソースから消すのはもちろん簡単ですが、サイト上からそれを削除できるようにしたいのです ●●.datというファイルから特定の行を削除orそれ以外を保存するというのはどういった方法がいいのでしょうか? 先輩方のご指南よろしくお願いいたします
起算する日時が1970年以降なら、 起算する日時分の秒数を足してlocaltime()なんかで変換。
>520 localtime(GMT+9) → 1973/11/30(Fri) 06:33:09 gmtime → 1973/11/29(Thu) 21:33:09
523 :
522 :2006/02/09(木) 04:27:34 ID:???
1970年が起算の場合ね
>>523 localtimeやtime以外の話
123456789秒は年、月、日、時、分、秒?
525 :
524 :2006/02/09(木) 05:17:43 ID:???
>>522 ああそうか1970を引けばいいのか
でも123456789秒から1973/11/30(Fri) 06:33:09をどうやって?
>>518 open F, "+<●●.dat" or die $!;
flock F, 2;
my @data = <F>;
splice @data, 特定の行, 1;
seek F, 0, 0;
print F @data;
truncate F, tell F;
close F;
527 :
524 :2006/02/09(木) 07:09:53 ID:???
ああそうか俺がバカだった… 1: 任意の“秒”$unkotimeから分・時間・日・月・年を求めたい 2: それでlocaltime($unkotime)でやってみたが 3: 以下のようになった ・$yearから70を引いた → 100年を超えないときはおkだけど100年で“-70年”になる ・$hourから-9 → “-3”時などになる ・$wdayから-1 → 現在のところ支障なし(?)に見えるが… ちなみに鯖は国内です
普通に計算したら? ($unkotime % 60)←秒 (int($unkotime / 60) % 60)←分 もっと簡単な書き方あるかもしれないが、こんな感じであとは自分で考えれ。
で、60日は何月なのよ?
そもそも、普通に既存のスクリプトでないのか?
適当に作ってみた。 mygmtime_presetを起算日として、gmtime互換の日付を返す。 1970,1,1を渡すとgmtimeと同じ動きをする(はず)。 use Date::Calc qw(Add_Delta_Days Day_of_Week Day_of_Year); my $gmtime_ad = mygmtime_preset(1, 1, 1); print join(" ", $gmtime_ad->(123456789)), "\n"; exit; sub mygmtime_preset { my @base = @_; return sub { my $sec = shift; my @date = Add_Delta_Days(@base[0..2], $sec/(24*60*60)); my $wday = Day_of_Week(@date); my $yday = Day_of_Year(@date)-1; $date[0] -= 1900; --$date[1]; return ((gmtime($sec%(24*60*60)))[0..2], reverse(@date), $wday, $yday, 0); }; }
532 :
nobodyさん :2006/02/09(木) 14:18:34 ID:46AFp3BF
ファイルの中にある“。”と“、”の数を数えたいんですけど $word=~ /。/g; だと・・ どうすればいいですか?
while ($word =~ /。/g) { $count++; }
534 :
nobodyさん :2006/02/09(木) 14:41:50 ID:46AFp3BF
>>533 ありがとうございます
$文字数 = $word;
$文字数 = s/。/。/g;
ってのはおすすめできないんでしょうか?
PCで普通に日本語が使えるようになってからの世代には手を焼く。
それとこれとは関係なかろう。
変数名に日本語使えたら楽でいいなぁ。 勿論自分で使うの限定で。
538 :
522 :2006/02/09(木) 17:43:50 ID:???
>>532 $cnt = $word =~ /。/g;
でOK
>>537 use utf8; とはいえ変換する分煩雑じゃないか?
>>539 うん、確かに煩雑だけど、それを補って余りあるぐらい見やすいかなと。
あとは、変数名考えるのも結構大変だしねw
>537 そんなあなたにはjavaがお勧め
>537 そんなあなたにはrubyがお勧め
rubyで日本語使えるんだ。 初めて知った。
日本語の変数名が見やすいとか言う感覚がさっぱり理解できん。
my ($kaunnta-, $hennsuu, $jikann);
perlを勉強し始めたばかりの者ですが、 連想配列というものは$xx{文字列}と定義すると書いてあるのですが、文字列はクォーテーションで囲っている物を文字列というのですよね? ということは$xx{"soeji"}のように定義するのでよいのでしょうか? よろしくお願いしますm(_ _)m
つまり$xx{soeji}でも認識できるけど、文法上よくはないということですね… どうもありがとうございました!m(_ _)m
アクセスした人の環境変数を全てtextに書いていくプログラムを書いたのですが、 #!/usr/local/bin/perl print "Content-type: text/html\n\n"; open(DATA, ">> data.dat"); print(DATA "%ENV<HR>\n"); close(DATA); exit; エラーが出て動きません。 自分ではこのソースに間違いを見つけられないのですが、その他パーミッションなどの設定のほうを疑うべきでしょうか…? お願いしますm(_ _)m
>>552 何でもカッコつけりゃいいってもんじゃないってこと。
どういうことですか…?
コンマが足りない
>>551 ん?何かまずいこと言った?
らくだ本にも、
> 次のような記法 (中略) で使われる裸の識別子は、裸のワードとは見なされない。
> なぜなら、これらは「文法的にほかに解釈がない」のではなく、
> 規則によって陽に許される書き方だからである。
って書いてるよ。
はいはいわろすわろす
>>552 パーミッションじゃない?
open() のとこをこんな風にしてエラーメッセージを出させてみては?
unless (open(DATA, ">> data.dat")) {
print "Open error: $!\n";
exit;
}
>553 クイズにヒントを出して楽しむ場所じゃ有りません >552 print "Content-type: text/plain\n\n"; open(DATA, ">>data.dat"); print DATA "%ENV<HR>\n"; close(DATA); print "output ok\n"; exit;
はいはいわろすわろす
はいはいわろすわろす
はいはいわろすわろす
>562-564
webprog板らしい流れだな
>566 >565
わろわろはいすはいす
はいわろ
570 :
552 :2006/02/10(金) 02:09:46 ID:???
わかる人がいないようなので失礼しますね
my @tmp1 = (); my %tmp2 = ('mode'=>'hoge','data'=>'test'); push @tmp1, \%tmp2; ↑と同じ事を1行でやろうとすには、どうしたら良いのでしょか? my @tmp1 = (('mode'=>'hoge','data'=>'test')); ↑では、できませんでした…。
mixiのコードばら撒かれちゃったらしいけどどこかに残ってませんか?
home.plだけならある
>>571 my @tmp1 = ({'mode'=>'hoge','data'=>'test'});
リファレンスについて勉強しる。
>552=570 レスをちゃんと読んだか? 質問の投げ去りはやめろや
576 :
質問 :2006/02/10(金) 11:34:07 ID:+Mjswkwe
2項分布の計算を行いたいのですが、 2項分布内のひとつの項を$k_posとする場合、 for($j=1;$j<10;$j++){ $k_pos=combi($g,$b)*(($bl_bun[$j]/65536)**$b) *(((65536-$bl_bun[$j])/65536)**($g-$b)); } というコードにすると、$gや$bが大きい場合、結果が出なくなってしまいます。 (combiというのは自作subです) 恐らく、掛け合わせる数が思いっきりでかい数と思いっきり小さい数を掛け合わせてるのが原因だと思います。 何か解決方法はありますでしょうか?よろしくお願いします。
use bignum; は試してみた?
Content-Lengthに手こずっています。 これの値がいい加減だと読み込みが変になるみたいで、レスポンスが大幅に遅くなりました。 i-modeのためContent-Lengthは必須みたいで困ってます。 値を取るのは一般的な方法で全データを変数に入れてlengthで計ってるんですけど うまくいかないです。 何が原因やら・・・文字コードはUTF8で統一していますが・・・
>>1 1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
580 :
578 :2006/02/10(金) 17:40:28 ID:???
ギャハ。自己解決しました。 どうも。でへへ。 もしかしたら僕と同じミスをする人が出てくるかもしれないので原因を書いておきます。 えーと、lengthで計算する変数に"Content-type: text/html"を含めていたので うまく計算できなかったみたいです。 この一文を外して、 print "Content-type: text/html\n"; print 'Content-Length: ', $length, "\n\n"; print $data; としたら上手くいきました。 どうもスレ汚しすみません。
ズコー!
100%同じミスするようなのはいない
すまん、同じミスをしてた奴を見たことある。
ワラタ
ごめん、一度だけ同じミスやった
>>580 これを機にHTTPの仕様を勉強するといいかも寝
>586 おやすみうな
おやすみ
589 :
質問 :2006/02/11(土) 08:21:02 ID:qlKqkAMK
use bignum したいのですが、bignumはどこにあるのでしょうか?
print join("\n", @INC);
>>589 5.8以降なら標準なんだけど、また5.6とか?
perldoc -ml bignum
>>592 5.6.1 以下だと「only one of -t, -u, -m or -l ...」と叱られるな。
595 :
nobodyさん :2006/02/12(日) 06:58:32 ID:bHuVlhbg
perlで乱数を求める時にrand関数を使いますけど、 バージョンが5.0?(詳しくは失念しましたが)からは種となるsrandを使わなくても良くなりましたよね? バージョンが5.8のサーバで昔作られたsrandが使用されているスクリプトを使っていたんですが、 先日新しいバージョンではsrandを使うとむしろ乱数の品質が下がると言う事を知りました。 元よりどうも乱数が偏っているなと感じていたんですが、 それはこのsrandの性と考えていいんでしょうか? それとも単なる勘違い的なものでしょうか? 乱数の使い方はおみくじとかサイコロとかそういったもので、 何かのシミュレートとかの用途ではありません。 今までサイコロで言えば1が5回連続して出たけど、それは確かにたまにはあるし、 たまたま出た時が強く印象に残っただけだ、と思っていたんですが。 とりあえずsrandは外す方向で考えているのは当然なんですけど、 どうにも今まで起きてた事象のモヤモヤが引っかかって。
srandってのは、使う乱数表を決めるようなもの。 srand(1)なら1番の乱数表を使うというような。 乱数の質はシステム依存。 1万回サイコロを振った程度なら偏るものだけどね。 偏りがほしくないのなら、別の方法を考える。
> 1万回サイコロを振った程度なら偏るものだけどね。 > 偏りがほしくないのなら、別の方法を考える。 ? 何を言っているのかわかってる?
ウホッ良い勘違い!
おみくじやさいころではどっち使っても人間が直接体験できるような偏りは出てきません。 ただの勘違い。 ただしまともな乱数使ってもプログラムの中で偏った分布をするような プログラミングがされていたら当然偏るけどね。
600 :
596 :2006/02/12(日) 10:07:07 ID:???
>>597 それでは、確率と乱数とばらつきについて教示ください。
数学については、なにぶん素人なので。
601 :
596 :2006/02/12(日) 10:10:06 ID:???
サイコロ一万回程度ではばらつきが大きくて、偏りが出るということなんだけど。
質問です、 表示させるすべての桁でランダムで数字を表示するプログラムを改造して、アルファベットもランダムで表示させたいのですが、どう改造すればいいでしょうか? ソースは、 # ランダム桁のランダム数字の生成 $max_num =1; $min_num =1; for( ; ; ){ $num_digit = rand($MAX_DIGIT)%$MAX_DIGIT+1; last if($num_digit >= $MIN_DIGIT); } for($i=0; $i<$num_digit; $i++){ $max_num *= 10; } $min_num = $max_num/10; for( ; ; ){ $num = rand($max_num)%$max_num; last if($num >= $min_num); } です。 0〜9まではこれで表示できるんですが、'a'〜'z'までを時間を種にして表示させたいんです。
@atoz = (a..z);
文字列の中から、「XXX号室」 の部分を抜き取ろうとしていますが、文字化けが起きて困っています。 XXX には半角アルファベット大文字か数字が入り、1桁から3桁程度です。 だいたいうまくいくのですが、「階」という漢字のあとにXXX号室が来ると化けてしまいます。 ソースコードは次の通りです。環境はWindows2000 ActivePerl5.8.7です。 my @a; my @b; push @a, "A4号室";#うまくいきます push @a, "1FC5号室";#うまくいきます push @a, "1階206号室";# K206号室 になってしまいます push @a, "A棟207号室";#うまくいきます foreach (@a){ push @b, "$&\n" if /[A-Z0-9]+号室/; } print @b; 「1階206号室」のときだけ「K206号室」になってしまいます。 何が原因で、どうすればよいのでしょうか。 どなたかご教授いただけると助かります。
>>604 「階」が Shift_JIS だと「8A 4B」なので二バイト目の「4B」が「K」にあたるのが原因だね。
/[A-Z0-9]+号室/s にすればいい。
606 :
605 :2006/02/12(日) 14:39:03 ID:???
ごめん、 Ruby と勘違いした。 Perl だとどうするんだろう?
/(?<![\x81-\xfc])[A-Z0-9]+号室/ てけとーな応急処置だけど、よかったらどうぞ。
シングルクオートと、quotemetaを試すがよろし。
>>608 すぐに気付くとは思うけど、今回のケースではそれじゃダメよん。
610 :
604 :2006/02/12(日) 15:14:54 ID:???
早速のレスありがとうございます。
原因は
>>605 さんのおっしゃるように、Shift_JISの2バイト目とマッチしてしまったからなのですね。
勉強になりました。
対処としては
>>607 でうまくいきました。ありがとうございました。
(?<![\x81-\xfc])の部分ですが、Shift_JISの2バイト目を取らないように、
「左側にShift_JISの1バイト目が存在しない位置」を指定しているという理解で合ってますか?
611 :
604 :2006/02/12(日) 15:48:35 ID:???
すみません、さっきの方法ではうまくいかない場合がありました。
>>604 のコードには記述しませんでしたが、処理対象には●12号室 ■10号室 のようなパターンもあり、
これまでは上手くいってましたが、
>>607 では 2号室 0号室 と出力されてしまいます。
Shift_JISは使わないほうが良いのでしょうか・・・
そうだよ
んなら、ユニコードでも使ってみようか。 use Encode; my $pattern = '([A-Z0-9]+号室)'; my $str = "1階206号室"; Encode::from_to($pattern, 'sjis', 'utf8'); Encode::from_to($str, 'sjis', 'utf8'); $str =~ /$pattern/; my $match = $1; Encode::from_to($match, 'utf8', 'sjis'); print $match;
614 :
607 :2006/02/12(日) 18:51:15 ID:???
ほんじゃぼくはアドホックに正規表現をいじる係ね。
あくまで
>>613 の言うように utf8 で処理するのが王道なのは百も承知で。
push @b, "$1\n" if /(?:[\x81-\xfc].)*([A-Z0-9]+号室)/;
>600 乱数以外の偏らない別の方法って何? ヒントだけでもいいから教えて 偏らないってどういう意味? 1万回やると「6」は1666回出るの?それとも1667回出るの?
/[A-Z0-9]{1,3}号室/
/[A-Z0-9]{1,3}号室/i または /[A-Za-z0-9]{1,3}号室/
618 :
607 :2006/02/12(日) 20:43:14 ID:???
>>616-617 それだと、
>push @a, "1FC5号室";#うまくいきます
などで残念なことに。
619 :
nobodyさん :2006/02/12(日) 23:28:00 ID:ptODJMag
削除パスワード機能のついた掲示板を設置しているんですが 削除パスワードが“1111”や“1212”、“1122”みたいな単純なパスワードを弾くには どうすればいいでしょうか? if ($password = ~ /1111/){ $error = 'エラーです'}; if ($password = ~ /1212/){ $error = 'エラーです'}; みたいにいちいち指定するよりもスマートな方法を伝授してください
"単純"の定義が・・・
621 :
619 :2006/02/12(日) 23:42:10 ID:ptODJMag
削除パスワードは4桁の英数字にしてあるので 1111 などの連続 1212 1122 1222 などの2つの種類の文字のみ のつもりです
622 :
604 :2006/02/12(日) 23:54:16 ID:???
>>613 うまくいきました。ありがとうございます。
調べて初めて知ったのですが、UTF8だと文字の途中のバイトでマッチしなくてすむようなので、
このやり方が適切みたいですね。
>>614 [\x81-\xfc]のあとのドットで2バイト目をマッチさせてるんですね。
ドットは任意の1文字としか考えてませんでしたので、途中の1バイトを1文字とみなして
マッチさせるとは思いもしませんでした。勉強になります。
>>616-617 そのやり方でも上記データを処理できますが、アルファベットは大文字固定で、
長さは3文字以上もありうるので[A-Z0-9]+になります。レスありがとうございました。
my %seen; if (scalar (grep { !$seen{$_}++ } split //, $password) <= 2) {} とかどうだろう。
624 :
619 :2006/02/13(月) 00:18:53 ID:NkDDMowL
>>623 どうもです
書き忘れましたけど最初↓
if ($password = ~ /(.)(\1|(.))(\1|\2)(\1|\2)/){ $error = 'エラーです'};
これだとなんかおかしいんです
どこがおかしいのか自分でも
3桁程度って言ってるからわざわざ3桁までにしたのにorz
626 :
nobodyさん :2006/02/13(月) 01:07:12 ID:bzAWjmTk
WindowsのApacheで自宅サーバを立てました(ActivePerl)
プログラム中に
print $env = $ENV{'QUERY_STRING'};
と文を書き
$envに「name=maruyama」が入ることを期待して
URLに
http://www.hogehoge.jp/cgi-bin/index.cgi?name=maruyama を打ち込みましたが「Internal Server Error」となります。
この場合URLの「?」の後ろ(name=maruyama)をブラウザに表示させるにはどのようにしたらよいのでしょうか?
my($query) = $ENV{'QUERY_STRING'} || ""; print $query;
あっ、こんてんとたいぷ はちゃんと書いてね
HelloWorld!から初めて欲しいね。
630 :
619 :2006/02/13(月) 01:23:47 ID:NkDDMowL
>>624 をお願いします
if ($password = ~ /(.)(\1|(.))(\1|\2)(\1|\2)/){ $error = 'エラーです'};
>630 最後の2文字を入れ替えてごらん それと・・・ >629
632 :
nobodyさん :2006/02/13(月) 01:37:18 ID:bzAWjmTk
>>627 違うところが間違ってました。
お答えありがとうございました。
自己解決しました。
ご迷惑をおかけしました
633 :
619 :2006/02/13(月) 01:38:58 ID:NkDDMowL
>>631 if ($password = ~ /(.)(\1|(.))(\1|\2)(\1|\2)/){ $error = 'エラーです'};
でも
if ($password = ~ /(.)(\1|(.))(\1|\2)(\1|\2)/){ $error = 'エラーです';}
でも結果は同じでした
(.)(\1|(.))(\1|\2)(\1|\2) ←ここをどうすればいいんでしょうか?
>621 # 9文字以下はエラー if(length($pass) < 9){ &error(); } # 数字小文字大文字記号が混ざってないとエラー if(!(($pass =~ /\d/) && ($pass =~ /[a-zA-Z]/) && ($pass =~ /[_!#$%&'()=\-"\[\]\|{}\/\.,\?]/))){ &error(); } # 同じ文字が連続したらエラー if($pass =~ /([0-9a-zA-Z])\1/g){ &error(); }
635 :
634 :2006/02/13(月) 02:20:28 ID:???
最後の行修正 $pass =~ /(.)\1/g
636 :
619 :2006/02/13(月) 02:25:30 ID:NkDDMowL
>>635 どうもです。
2種の文字で構成されるパスの場合のエラーの場合どうすればいいでしょうか?
お前ら釣られすぎ
>>625 それでも "1階23号室" が "K23号室" になっちゃってダメじゃね?
640 :
634 :2006/02/13(月) 04:00:03 ID:???
>636 ちったぁ考えろ 終了
641 :
619 :2006/02/13(月) 04:12:30 ID:???
642 :
619 :2006/02/13(月) 04:54:25 ID:???
ある入門書には、 open(UNKO "kusai.txt"); @BENKI=<UNKO>; みたいにopen()関数で開いたテキスト内容(別にテキストじゃなくても良いが) を配列に代入してるけど、スカラーじゃ駄目なの? スカラーだと変数が32bitしかないから、エラい人が個々の配列にに自動で文字列を 一文字づつ代入してくれるから?
644 :
643 :2006/02/13(月) 14:26:52 ID:???
ごめん、日本語になってない ○rz 脳内補正よろしく。
>>643 <>はスカラーコンテキストで使用すると一行読み込む。( $hoge = <FUGA> )
リストコンテキストで使用するとファイルをすべて読み込む。( @hoge = <FUGA> )
一気に配列に読み込む必要性が無ければ、
スカラーコンテキストで一行ずつ読み込んだ方が使うメモリーは少なくてすむので
私としてはそうすることをお勧めしたい。
しかし、一気に読み込むことでファイルをロックするべき時間が短くなるという利点もあり、
そういう風に一気に読み込むことを好む人もいる。前にこのスレで議論になったこともあった希ガス。
> 個々の配列にに自動で文字列を一文字づつ代入
配列の個々の要素に一文字一文字、ということ?一行ずつの文字列が入るよ。
$hoge[0] = "foo\n";
$hoge[1] = "bar\n";
> スカラーだと変数が32bitしかないから
Perlでは内部的に自動で整数型、不動小数点型、文字列型などを変換する。
ユーザ側は通常大きさを考えるようなことは無いし、この場合では文字列型になる。
>644 # メモリの許す限り全Read @lines = <IN>; # 改行まで $line = <IN>; メモリ使用量に関して645さんのを補完すると foreach (<IN>){ 〜処理〜 } じゃなくて while (<IN>){ 〜処理〜 } です。 ・・・だよね? (;´∀`)
数字だけのを弾くとかすれば?どこらへんまで弾きたいのか分からないから何とも言えない
画面をFRAMEで縦に2分割してデータの読み書きのプログラム作ってます。 上のaaa.cgiはフォーム入力からデータをファイルに書き出すCGIです。 SUBMITで自分自身を呼び出して何回も書き込めるようにしています。 下のbbb.cgiはaaa.cgiで作ったファイルからデータを1件づつ読み込んでいます。 【疑問】aaa.cgiでSUBMITを押してもbbb.cgiが動かないので画面のデータが更新されない。 【希望】aaa.cgiで更新したデータをすぐに下のbbb.cgiを動かして画面を更新したい。 bbb.cgiに更新ボタンを設置するのはやりたくない。 どうすればいいでしょうか?
チャット用のcgiをどっかから拾ってきて設置する。
> foreach (<IN>){ 〜処理〜 } > while (<IN>){ 〜処理〜 } この二つって何が違うのでつか?
リストを最初から最後まで繰り返す。 条件式が真の間繰り返す。 行入力演算子のときはwhile。
>648 そんなあなたには つ【JavaScript】
aaa.cgiが更新されたのを認識したらparent.frames[1].以下略とかで更新
654 :
648 :2006/02/13(月) 23:48:12 ID:???
649さん、そういえばチャットと同じ構造でしたね。気がつきませんでした。 652さん、その手もありましたか。調べてみます。 653さん、キーワードありがとうございます。やってみます。 ヒントありがとうございました。<(_ _)>
655 :
nobodyさん :2006/02/14(火) 00:32:58 ID:INKxTjsz
print qq(<FORM method="POST" action="$CGINAME">\n); print qq(<INPUT type="submit" value="push">\n); print qq(<input type="hidden" name="mode" value="change">\n); print qq(</FORM>\n); これを実行する(WEBページでPUSHボタンを押す)と「ファイルのダウンロード」(ローカルに保存)となってしまい、CGIが実行しません。 CGIを実行させるにはどのようにしたらよいのでしょうか?
>>650 ・foreachやforはリストを元にしたループも可能。リストコンテキスト。ループ前に全部読む。
・while(<FH>)はwhile(defined($_ = <FH>))の略記。スカラーコンテキスト。ループ1周で1行読む。
>>655 実際に実行されてる可能性もある。とりあえずそれをダウンロードして中身をチェック。
CGIのプログラム本体が落ちてきたのならサーバ側の設定の問題でPerlは関係ないだろう。
657 :
655 :2006/02/14(火) 01:45:00 ID:INKxTjsz
ありがとうございます、 Apacheの設定ですかねえ。 どこをどのように書き換えたらよいのかよくわからないです・・・。
Apacheの質問は自宅鯖板でどうぞ。
CGIでPOSTで受け取ったデータを使うとき、 read(STDIN, $str, $ENV{'CONTENT_LENGTH'}); は $str = <STDIN>; とどこが違うんですか?
俺も具体的なことわからなかったからググると2分でわかった
URL Encoded しかあつかわねぇ!ってなら差は無いけど Multipart を考慮するなら read を使う
662 :
643 :2006/02/14(火) 13:54:25 ID:???
みなさんどうもありがておう。 つまり便器に入ったウンコを一段ずつ取り出すには配列の個々にアクセスすれば良い訳ですね。
663 :
nobodyさん :2006/02/14(火) 16:36:29 ID:TPTf1Qt3
全角文字を含む入力データのチェックをしたいのですが、 (ひらがなのみとか、全角文字のみとか、半角英数のみとか) 何か情報がまとまってあるところないでしょうか? というか、今ひらがなのみはなんとか以下のコードで動いたんですが print "Content-type: text/html; charset=Shift_JIS\n\n"; $pattern = '(?:\x82[\x9F-\xF1])*'; $data =~ /$pattern/; if ($& eq $data){ print "match"; }else{ print "unmatch"; } exit; なんかあやしいです。 回りくどいし
664 :
nobodyさん :2006/02/14(火) 16:47:09 ID:OAiNE+tI
1 :知りたいこと cgiが”更新 ”ボタンで呼び出されたのかどうかが知りたい 2 : やってみたこと、 cgi-lib.plの &ReadParse(*form)でformの値を取得してみた。 3 : でも何も新しい値が入っていない ごめんなさい、どうやって類似の記事を探したらいいのかわからなくて せめてヒントをお願いします。m(_ _)m
よく使われるhogeって何?
>>665 サンプルコードなどで適当に変数名をつけるときに使う
英語ではfooやbarが使われるのでfoo,barについてはrfcにもなっている
ほげ学のサイトがあるので探してみ
>664 つ【アクセスログ】
>>664 本当にやりたいことは違ってたりしない?
二重投稿を防ぎたいとかそういうことだったりしない?
たまには頭使ってみようかな・・・ コントロールコードを拒否したければ \x0-\x1f の範囲でオケなのかな?
671 :
nobodyさん :2006/02/14(火) 22:37:15 ID:mb5R1R6v
すいません質問させてください
Perlで作ったおみくじCGIをサイトに置いたんですが
わたしのサイトに来てくださる人の携帯(DoCoMo)では動作しないって言われました
それでわたしも携帯で動作を確認するとやっぱり動きませんでした
PCでは問題なく動作するのですが携帯向けには何かしなければならないのでしょうか?
>>8 -で紹介されているサイト様も見てみたんですが書いてありません
詰まってしまいました
どなたか原因が分かりますでしょうか?
673 :
nobodyさん :2006/02/14(火) 23:13:17 ID:mb5R1R6v
>673 誘導してもらってるのに、全然読んでないことだけは分かった。 シュミレータで確認汁。 それと、動かないだけじゃわかりません。
× シュミレート ○ シミュレート ここもゆとりんぐ全開かwww
676 :
nobodyさん :2006/02/15(水) 00:02:40 ID:TfAwMHcm
>>674 名前を入力してもらいボタンを押すと運勢が出るという
おみくじCGIでPOSTメソッドです
携帯だとボタンが押せない状態なんです
シュミレート の検索結果 約 58,200 件中 1 - 10 件目 (0.24 秒) 企業でも普通に使ってるみたいw
企業が使ってるから正解ではない ゆとりんぐは勉強してろ
(´-`)。oO(…skk で /simulate で変換すればいいのに…)
1skk=3,7yenだそうだ
682 :
664 :2006/02/15(水) 01:44:50 ID:AsKZTDBd
>667 668サンクス。本当にやりたいことは a.cgiのボタンを押す->入力されたデータにエラーが無いかチェック 0.エラー -> a.cgi でエラー表示 1.エラーがない ->a.cgiでBingo表示 0の状態でF5押しまくってると1の画面が表示されてしまいます。 a.cgiで結果を表示させるのが、そもそもの間違いなのでしょうか?
683 :
664 :2006/02/15(水) 01:57:37 ID:???
このスレに要点を書いてみたら普通におかしいな>682 入力されたデータにエラーが無いかチェック に内在バグがきっとあるに違いない。という方向でちょっとダイブしてきまつ。
つ チラシの裏
>>676 そういうのは実際のソース見ないとわからんよ
Javascript使ってる可能性も考えられるしね
>>669 それって、二バイト文字の1btyle目のコードですよね。
組み込んでみます。
ちなみにこういうのって一覧表のあるサイトってありますか?
今は、IMEパッドで見てるんですが、なんか微妙に異なるようですので。
688 :
nobodyさん :2006/02/15(水) 15:21:01 ID:PmYHM0Bw
次の文でFormの値を取り込んでいるのですが、この処理を行った場合その後の処理は無視される理由が分かりません。 分かる方がおりましたら教えてください。 subloadFormdata{ my ($query, $pair); read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); print $query; foreach $pair (split(/&/, $query)) { my($key, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; $value = jcode::sjis($value); $value =~ s/&/&/g; $value =~ s/</</g; $value =~ s/>/>/g; $value =~ s/\x0D\x0A/<br>/g; $value =~ tr/\t/ /; $FORM{$key} = $value; } } ------------------------------------- たとえばメインルーチンで print "ここは出力される"; loadFormdata(); print "ここは出力されない";
subloadFormdata || jcode::sjis 呼べない
690 :
nobodyさん :2006/02/15(水) 16:11:29 ID:RdFiluwL
>>685 ソースを見なきゃ分からんようなCONTENT_LENGTHのことだと
も気づかないアフォは発言すべきじゃないな。
>>686 ~ /[\x81-\xff][\x40-\xff]/ ←これで全角全て拾える
>>690 DoCoMoはContent-lengthが必須なのは知ってるがボタンが押せないという表現が気になった
>691 だから、HTML見直せとiモードの解説サイト貼ってあるのにw
Content-Lengthは吐かなくても問題なく表示できる。 -1を吐いた場合ですら表示できる。
少なくとも Apache で CGI 経由なら、Content-Length ヘッダは httpd が補完してくれるのでプログラム側で吐く必要は無い。 むしろ陽に吐いた方が、自動広告挿入などでサイズが変わる 場合に不具合の元となる。
>>694 > 少なくとも Apache で CGI 経由なら、Content-Length ヘッダはhttpd が補完してくれるので
ホント?
socketを使用してSSL通信を試みているのですが、下記のエラーで
はまってしまっております。
Bad Request
Hint:
https://example.com:443/ ソースは下記で、HTTPでは正常接続の確認が取れました。
ご教示いただけますと幸いです。
use Socket;
my ($host, $filename, $data) = @_;
my $return_value;
my $port = 443;
my $iaddr = inet_aton("$host") or return 0;
my $sock_addr = pack_sockaddr_in($port,$iaddr);
socket(SOCKET,PF_INET,SOCK_STREAM,0) or return 0;
connect(SOCKET,$sock_addr) or return 0;
select(SOCKET);
$| = 1;
select(STDOUT);
my $len = length($data);
print SOCKET "POST /$filename HTTP/1.0\n";
print SOCKET "HOST: $host:$port\n";
print SOCKET "Content-Type: application/x-www-form-urlencoded\n";
print SOCKET "Content-length: $len\n\n";
print SOCKET "$data";
print SOCKET "\n";
while(<SOCKET>) {m/^\r\n$/ and last;}
while(<SOCKET>) {$return_value .= $_;}
close SOCKET;
return $return_value;
698 :
nobodyさん :2006/02/15(水) 22:48:50 ID:OyUmOolC
>>688 × subloadFormdata
○ sub loadFormdata
>>697 書き方はあってるみたいだけど、なんだろうね。
SocketがもしかしたらSSL通信に対応していないのかもしれない。
しかし確証はない
700 :
nobodyさん :2006/02/15(水) 23:32:33 ID:PmYHM0Bw
print $FORM{'hohehoge'}; とやるとフォームのデータが表示されるのですが、 $value = "hogehoge"; print $FORM{'$value'}; とやると何も表示されません。 hogehogeを変数にして、$FORM{'hohehoge'}と同じ内容のものが表示されるようにするにはどのようにしたらよいでしょうか
701 :
nobodyさん :2006/02/15(水) 23:43:05 ID:??? BE:636768498-
× print $FORM{'$value'}; ○ print $FORM{$value};
それか print $FORM{"$value"}; だね。
703 :
697 :2006/02/16(木) 00:29:46 ID:???
>>699 さん
ご返答有難うございます。
サーバを変えてみたのですが、やはり同じBad Requestが
返ってきてしまうというのが現状です。
もう少し頑張ってみます。
状況が変わり次第ご報告とさせていただきます。
704 :
700 :2006/02/16(木) 00:43:41 ID:P0dyMCan
あ、それでいけるんですね! すいません。ハマってました^^; ありがとうございました!
>>697 SocketでSSL通信やるなら自前で暗号化をやらなきゃならないが、そのコードはどこにあるのかね?
俺ならSocketでやるなんて大それたこと考えずに迷わずLWP。
>>699 わからないなら、それであってるとか、いい加減な回答しないで引っ込んでろよ。
706 :
nobodyさん :2006/02/16(木) 12:37:14 ID:ZVhjliSj
cgi-lib.plを使い &ReadParse; として、%inを多様しているスクリプトがあります。 これをCGI.pmへ変更したいのですが $in{'name'} ↓ $q->param('name') という変更をしないで$in{'name'}のまま使うには どのような記述をすれば良いのでしょうか。 $incfnも利用しているので、こちらの対処方法もお願いします。
何で変更したいの? cgi-libでいいじゃん。 君には十分だよ。
>>706 どこかにソースうpしてくれれば、対応してやるよ。
抽象的な質問で申し訳ないけど教えて欲しいっす。 言語切り替えが出来るように作ってあるページで、 フランス語なんかに言語を切り替えると文字化けして、その文字化けがタグを侵食したり して表示が崩れたりします。フランス語やドイツ語を扱う時に注意する点ってどういうとこ だか、誰かアドバイスもらえませんか? ページは全部Perlで組んでます。
UTF-8人生で
index.html内で <form action=aaa.cgi> <input type=submit value=更新> </form> としているのですが、これだとボタンをクリックすると画面がaaa.cgiに移動してしまいます。 画面が一切変化しないでaaa.cgiを動かすにはどうすればよいでしょうか?
>>711 つ <form action="aaa.cgi" target="_blank">
714 :
711 :2006/02/16(木) 20:32:43 ID:???
レスありがとうございます。
>>712 別窓も開かない形にはできないでしょうか?
715 :
711 :2006/02/16(木) 20:37:34 ID:???
>>713 おぉ!できました!ありがとうございました。
>>706 perldoc CGIの「FETCHING THE PARAMETER LIST AS A HASH」という項目を読め。
717 :
676 :2006/02/17(金) 00:50:26 ID:LOkWB/9e
>>685 こんなソースです↓
if ($ENV{'REQUEST_METHOD'} eq "POST"){
read(STDIN, $post, $ENV{'CONTENT_LENGTH'});
}else{ $post = $ENV{'QUERY_STRING'};}
for (split(/&/, $post)){
($word, $value) = m/^(\w+)=(.*)$/;
$value =~ s/\+/ /g;
$value =~ s/%([0-9A-F]{2})/pack('C', $1)/egi;
$q{$word} = $value;}
print <<EOS;
"Content-Type: text/html; charset=Shift_JIS"
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>たいとる</title>
</head><body>
〜略
PCでは大丈夫ですが携帯では表示はしても反応なしです
どなたかフォローお願いします
>>717 print <<EOS;
"Content-Type: text/html; charset=Shift_JIS"
これおかしくね?
何でダブルクォートが・・
つか略すな。そこも大事だ。
719 :
676 :2006/02/17(金) 01:29:23 ID:LOkWB/9e
>>718 お前はそれだけの情報で足りると思ってんのか?
エスパーさん向けだな。
つか
>>719 で萎えた。
名前の欄はちゃんと確認しようねボクちゃん。
おみくじCGIとか小学生でもやらねーよwwwwwwww
<title>676と愉快な仲間達</title>
>>718-725 悔しいのは分かるがContent-lengthも知らない香具師はとりあえず黙ってろ
最近アレだな、厨房っぽいのが常駐してんだな
<title>ゆかいなどうぶつ</title>
>>727 構ってもらえなかったのが相当寂しかったんだよ。生暖かく見守ってあげようよ。
<title>みんな、学生さんかな?</title>
さすがWebProg板
732 :
706 :2006/02/17(金) 04:51:48 ID:RcUmmaVq
>>716 ありがとうございます。
use CGI;
CGI::ReadParse();
とすることで、%inをそのまま利用でき、$incfnも$inへ変更してファイル名が無事に取得できました。
ただ、マルチパートの画像を取り出すことができません。
open (OUTFILE,">>/usr/local/web/users/feedback");
while ($bytesread=read($filename,$buffer,1024)) {
print OUTFILE $buffer;
}
close $filename;
としても0byteとなってしまいます。
今まで調べて試行錯誤してみましたが、どうにもなりませんでした。
どなたかアドバイスを頂けないでしょうか。
html の <form> タグがある行を書いてごらん
734 :
706 :2006/02/17(金) 04:58:30 ID:RcUmmaVq
>>733 <form action="./***.cgi" method="POST" ENCTYPE="multipart/form-data">
としております。
input radioでデータを取りたいんですが何故かデータが転送されないんです。
そうですか。 次からは独り言はチラシの裏にでも書いてね。
>>732 $filenameの内容をどこから取得してるか明かせ。
多分、問題はそこ。
>>732 どうでもいいが
close OUTFILE;
とやってファイルハンドルをクローズじゃまいか
>739 よく気が付いたなw ちゃんと閉じられてなかっただけっていうオチかな? でも最後にちゃんと閉じられなくてもスクリプトが終われば閉じられると思ったし、ん〜なんだろ
つか $filename がどういった経緯でセットされてるか分からんので特務レベルエスパーじゃないと(;´Д`)
>>741 でもまあ $filename っていう変数名からして十中八九 read() の使い方間違えてるんだろうね。
もしかして read("d:\test.txt", $readduff, 1024); みたいな使い方を想像してるのかな?
LWPを使用しhttps接続まで試みたのですが、httpsのみ接続がうまくいきません。
Crypt-SSLeay-0.51はインストール済みでございます。
ソースは下記です。
ご教示いただけますと幸いです。
sub post_request{
use LWP::UserAgent;
my ($req_url, $data) = @_;
my $ua = LWP::UserAgent->new;
my $req =
HTTP::Request- >new(POST => $req_url);
$req->content_type('application/x-www-form-urlencoded');
$req->content($data);
my $res = $ua->request($req);
if($res->is_success){
return $res->as_string;
}
else{
return "";
}
}
なんで SSLeayを使わない
$textの中から「title」という文字を検索したいのですが $tmp = index( $text , 'title' );としました。 しかし、「title」だけではなく「TITLE」という文字の可能性もあり そちらも同時に検索したいのですが、良い方法はありますか?
>>745 SSLeayはインストールさえしておけばLWPが自動的に
使用してくれると仕様書に書いてありましたが、認識に
相違がございますでしょうか。
>>746 正規表現こそがPerlの華。
$text =~ /title/i
だけどこれじゃ位置を知ることはできないから、使える用途はやや限られる。
多くの場合位置を知らなくても処理できるんだけどね。
本当にそれが現れる位置を知りたいなら、先に小文字に合わせてしまうという手がある
$tmp = index( lc $text , 'title' );
>>748 下の方法で上手く行きました。
ありがとうございます。
>>748 @-でわかるよ。
% perl -e '$text="aaaTitle"; $text =~ /title/i; print $-[0];'
3
753 :
nobodyさん :2006/02/18(土) 02:12:59 ID:Hc0+hkLt
携帯だと実行できません なので携帯でも実行できるように改造おねがいします if ($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $post, $ENV{'CONTENT_LENGTH'});} else{$post = $ENV{'QUERY_STRING'};} for (split(/&/, $post)){ ($word, $value) = m/^(\w+)=(.*)$/; $value =~ s/\+/ /g; $value =~ s/%([0-9A-F]{2})/pack('C', $1)/egi; $q{$word} = $value;} if ($q{'WORD'} ne ''){ for (split(/\r*\n+/, $q{'WORD'})){next unless /(.+)/;$word = $1;} } print <<EOS; "Content-Type: text/html; charset=Shift_JIS" <html><head> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>たいとる</title> </head><body> $word <form method="POST"> <input type="SUBMIT" value=" テスト "><input type="text" name="WORD"> </form></body></html> EOS
>>753 おみくじCGIの方ですか
<form method="POST">
actionを指定しないと確かドコモじゃ実行できないんじゃなかったか。
つか普通に記述ミスだろ
756 :
nobodyさん :2006/02/18(土) 02:56:52 ID:Hc0+hkLt
>>755 記述忘れでした
ありがとうございました
まだおみくじやってんのか(;´Д`)
リスト1 1139355934 1139301779 1139325935 1139231627 1139409916 リスト2 1139231627 1139301779 1139355934 1139325935 のようにリスト1とリスト2があって、それぞれ$list1[連番]$list2[連番]のようになっています。 リスト1の上から順に読み込んで、読み込んだ内容がリスト2のどれかと一致したとき $check[$list1の内容]を1にしたいと考えています。下のようにやってみましたがうまくいきませんでした。 どのようにしたら実現できるのでしょうか。ご教唆お願いします。 $num=-1; until($list1dir_filenum==$num){ $num++; print "$list1name[$num]\n"; $list2num=-1; until($list2dir_filenum==$list2num){ $list2num++; print "$list2name[$list2num]\n"; if ($list1name[$num]eq$list2name[$list2num]){ $val=$list1name[$num]; $namecheck[$val]="1"; } } }
>>758 言ってる事とやってる事が違うような、、
761 :
758 :2006/02/18(土) 08:29:29 ID:???
>>759 すいません。goo辞書で確認してみたら自分が間違いでした。教示ですね。ありがとうございます。
で、質問のほうはどのようにしたらうまくいくのでしょうか。お願いします。
>>758 http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq4.html#data__arrays my @list1 = (0..9, 5..9);
my @list2 = (1, 5, 10, 10);
my %check;
{
my(%saw1, %saw2, %count);
# ++$count{$_} == 2 && ++$check{$_} for # 要素が多い時
# %check = map ++$count{$_} == 2 ? ($_, 1) : (), # map で一気に
%check = map +($_, 1), grep ++$count{$_} == 2, # 段階を踏んで
grep(!$saw1{$_}++, @list1), # それぞれのリストが既に
grep(!$saw2{$_}++, @list2), # ユニークなら必要無し
;
}
print map "$_\n", sort { $a <=> $b } keys %check;
確認してないけど、だいたいこんな感じかな? for $i (0 .. $#list1){ $check[$i]= grep($list1[$i] eq $_, @list2); }
>>758 > $check[$list1の内容]
早まるなっそんな馬鹿でかい数を配列の添え字に使ったら
すごい量のメモリが確保されるぞ
俺さあ、エルピーダの仕事してるんだよね。 世の中こういうヘボだらけになって、メモリをガンガン使って欲しい。
もし1要素1バイトとしたら理論的には約1ギガだけど、実際にはどれぐらいになるんだろう??
入れる値によって可変するからLONGなら8GB テキスト入れた日にゃ・・・Perl落ちw
ってか Stringであつかえばいいんちゃうの・・?
・・・・ ごめ! ハッシュかと思ってた! 配列かYO!!
実際にはそんな事にならないから。 嘘だと思うならやってみれ。
Out of memory っていわれるね
773 :
765 :2006/02/18(土) 13:21:35 ID:???
Out of memoryといわれたらデータ構造考え直さずに、64ビット化しろ。 頭使わず、メモリ使え。
数年前に通ったPerl教室じゃ おみくじこそPerlの真こっちゅおって言ってたなぁ・・・ この前通りかかったら別の教室になってた
いいじゃん、randの使い方の勉強にはなるぜ
お神籤は、また戻しちゃうからなぁ。。。 くじ引きみたいなのがよろしいかと@randの使い方?(って好きなように使えばいいけれども)
Larryはおみくじ引かせるためにPerlつくったんですかそーですか
779 :
nobodyさん :2006/02/19(日) 01:32:35 ID:xuHW0Wkn
一行目にカウンターを入れたいので、二行目からforeachでまわしたいのですけど、 どんな風に書いたらよいですか? データファイル 4234 ←一行目(カウンター) さいたま市<>県庁<>アリーナ<>レッズ ←二行目以降はループで 川越市<>時の鐘<>古都 秩父市<>祭り<>花の街 プログラム open(FILE, "<hogehoge.dat"); eval{ flock(FILE, 1) }; @log = <FILE>; 一行目の読み込み @logの一行目 二行目以降はこの処理 @logの二行目以降
>>779 カウンタと次からのデータは切っても切れないものなの?
違うファイルにしてもいい希ガス。
で、foreachじゃなくて、for (my $i = 1; $i ++; @log) {}
で、いい希ガス。
shiftしなさい。
782 :
nobodyさん :2006/02/19(日) 01:49:42 ID:??? BE:102385038-
my($readline) = <FILE>; $readline =~ s/\x0D\x0A|\x0D|\x0A/; my($cnt) = int($readline); while($readline = <FILE>){ 〜処理〜 }
>>779 配列に読み込んでforeachするのが良いかどうかは置いといて。
一行最初に読めば良いじゃん。
open(FILE, "<hogehoge.dat");
eval{ flock(FILE, 1) };
$counter = <FILE>;
@log = <FILE>;
┌→┐ ↑話↓ └←┘
>785 しょうがねぇじゃん 過去ログ読まねぇんだもんorz
┌←┐ ┌→┐ ↓ ↑ ↑ ↓ └→┘ └←┘ ↑↑ ─────── 低 気 圧
788 :
nobodyさん :2006/02/19(日) 19:19:24 ID:sHmg7IfX
質問させてもらいます 今Z-Z BOARDをレンタルしているのですが、こんど自前の掲示板を設置したいと思っています どうしても利用者のトリップを引き継ぎたいのですが設置しようと考えている掲示板は 暗号化の部分がこのようになっています sub tripmake{ my($key,$salt,$trip); $_[0]=~s/◆/◇/g; if($_[0]=~/#(.+)/){ $key=$1; $salt=substr($key."H.",1,2); $salt=~s/[^\.-z]/\./go; $salt=~tr/:;<=>?@[\\]^_`/ABCDEFGabcdef/; $trip=substr(crypt($key,$salt),-10); $_[0]=~s/#(.+)/◆<\/B>$trip/; } return $_[0]; } Z-Z BOARDのトリップにすることは可能でしょうか? 皆様よろしくお願いいたします
>可能でしょうか? 可能です 終了、次の質問どうぞ
文字コードで困っています。 LWPのgetメソッドでページの情報を取ってきたのですが その取ってきたページで使われている文字コードが何であるかを 知る方法は無いでしょうか?
jcode.pl の getcode
Jcode.pm の getcode
Encode::Guess
utf-8のために、Encodeのがいいかもね。
NKF の・・・、無理か・・・
796 :
788 :2006/02/19(日) 22:58:25 ID:???
数値をどのようにしたら実現できるのでしょうか。ご教唆お願いします。
もしかしてトリップ盗聴
798 :
nobodyさん :2006/02/20(月) 00:26:00 ID:ppD/ecqF
m/$x/; とかしたときに、$xのなかにある正規表現の特殊文字を普通の文字として扱う場合はどうしたらいいですか
quotemeta $x しておくとか /\G$x\E/ しちゃうとか。
文字コードに答えて頂いた方、ありがとうございました
jcodeのgetcodeを使いました。
>>793 も調べてみようと思います。
804 :
801 :2006/02/21(火) 02:29:14 ID:???
>>801 です。
jcodeを利用したのですが、まだ文字化けが起こります。
$ua = LWP::UserAgent->new();
$res = $ua->get( $inurl );
if($res->is_success)
{
$title = $res->title;
&jcode::convert( $title , "euc", "", "z");
}
else
{
#異常終了処理
}
ページ取得、タイトル取得には成功しているのですが。
jcodeの使い方は合ってますか?
私の使い方が正しくないのでしょうか?
jcodeでは希望の処理はできないのでしょうか?
Encodeを使えば回避できますか?
取得のページがutf-8とかじゃ?
>>804 渡すのは型グロブかリファレンス
&jcode::convert( \$title , "euc", "", "z");
ヒアドキュメントで書かれたものなら、変数に収めてlengthできるんですけど、 普通のプリント文をlengthするにはどうしたらいいんでしょうか? sub hoge{ print 'momoko'; return; } この、サブルーチンhogeで出力される'momoko'の長さ(6文字)を計りたいのです。 $a = length(&unko); print $a; だとうまくいきせん。どうやればいいんでしょうか。
>>807 &unko がどこから出てきたのかわからないけど
サブルーチンの戻り値にセットすればどう
>>807 どうしてもprintを使いたいならIO::ScalarなりIO::Stringなり、
さらに必要ならIO::Teeなりを使う必要がある。
810 :
807 :2006/02/21(火) 17:54:07 ID:???
unkoじゃなくてhogeでした。
>>808 戻り値にセットしてもうまくいきません・・・
おはようございます。 サイトに来てくれた人のHTTP_REFERERを保存していて どんな単語で検索して来たのかを表示しようと思ったんですけど うまく表示されない場合があります。 $value =~ tr/+/ / ; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("H2", $1)/eg ; jcode::convert( *value, 'euc' ); 調べたんですけど、だいたいどこもこのくらいしか書いてないんです。 他に何か必要なことがあるんでしょうか?
GoogleなんかはUTF-8だからJcode.pmとか使え
おぉ!化けなくなりました。 ありがとうございましたmm()__
ゲットの方法でポストすることって出来ますか? 詳しく言うとボタンをつかわいで変数にデータを入れる方法とかなんですが・・・ その場合後ろのタイトルとかに?をつけてポストとか書けばいいんでしょうか? なんとかしてボタンじゃなくてリンクだけで送信されるようにしたいのですが。 宜しくお願いします。
複数の呼び出し元からアクセスできて、呼び出し元の環境変数を参照して、 それぞれ対応したページを生成する掲示板を作っています。 その掲示板に’ホームへ戻る’のリンクをつけて、その呼び出した元のページへ帰るようにしたいのですが、 どのような方法があるでしょうか? 最初はリファラーをクッキーに保存しておけばいいかなと思ったんですが、 imodeはクッキー使えないみたいなので困っています。 他の方法があれば教えてください。
>816 クリック保証型の詐欺ですか (; ̄^ ̄)
>818 面倒くさいだろうけど、<input type="hidden"〜 を使うしかないんじゃないかな
ハッシュのハッシュの配列の値を取る記述がうまくいきません。 'KKK'をプリントしたいんですが・・・ どうやればいいんでしょうか。 $a = { 1 => 'aaa', 2 => 'bbb', 3 => 'ccc', 4 => $b->{test}[0] }; $b = { test => ['kkk','yyy'] }; print $a->{4}; # KKKをプリントしたいけどうまくいかないorz
$bを$aより先に定義。 それと$a,$bはsortで使う特殊変数だから、テストでも使わないのが吉。
822 :
820 :2006/02/22(水) 18:36:33 ID:???
>>821 順番の問題でしたか。トホホ・・・
サンクスです。
>>823 エラーメッセージをコピペしないところが悪いんじゃないかなと思った
最近はEncodeもJcodeも入ってる貸し鯖が増えてると思ってたんだけど
そうでもないのかな?
みんなEncodeって使ってる? utfフラグとかめんどくさくて結局Jcode使ってる。
>>824 すいません。
エラーは 500 Internal Server Error です。
use Jcodeをevalでくくってもだめでした。
>>826 うう。そっちじゃなくて、
use CGI::Carp qw(fatalsToBrowser);
を仕込んでおいたら吐いてくれそうなほうのエラーメッセージ。
うう、すいません。 CGI::Carp使ってみました。 でも500エラーのままかわりません。 use Jcode;をコメントにするとエラーはなくなります。 use Jcode or die("asdf");は無理なんでしょうか?
>>825 Encodeのある今、Jcodeなんてキモくて使えない。
utfフラグが面倒だったら常にfrom_to使えばいい。
〜が?になる問題は解決したのか?
>>831 どう解決するの?
ググり方がよくわからん
答え教えて
問題の起こるコードを見せれ。
use lib してないに一票
>>823 use lib 'ドキュメントルート/lib;
ってすればいいんじゃないの?
>>835 山田家の逆襲を参考にファイルごとevalしてみたらこんなのが出ました。
Can't locate auto/Jcode/Unicode/utf8_euc.al in @INC
( (@INC contains:
./lib
/usr/lib/perl5/5.8.0/i386-linux-thread-multi
/usr/lib/perl5/5.8.0
/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.0
/usr/lib/perl5/site_perl
/usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.0
/usr/lib/perl5/vendor_perl .) at lib/Jcode/Unicode.pm line 64
このline64ってのはコメント除いた行数なんですかね?
>>836 やったけどだめだったんです。
そりゃ間違った文法だもん 動いたら、それのほうが問題
eval しろというのは、以下のようにすることをいいまつ。 eval { require Encode; }; if ($@) { print $@; } eval 使う時って、use でなくて、require しないと止まるんやね。 あと、eval ブロックは、; セミコロン付けないといけないので、きをつけるべし。
eval("use Omaemona"); print $@; …じゃダメなの? 拙い自分用に拙く作ってみました。% hoge.pl Net::SMTP したりして遊ぶ。 #!/usr/local/bin/perl -w use strict; if (!$ARGV[0]) { die("まじめにトラップする気がない。\n"); } eval("use $ARGV[0]"); if ($@) { print $@, "\n↑読め。\n"; } else { print "$ARGV[0]が使える気配。\n"; }
(´-`).。oO(perl -e 'use Hoge' で十分な気がする。。。)
>>841 そんな事言ったら perl -MHoge で十分
お世話になります。
eval("use Jcode");
ではエラなしの様子です。
eval{ Jcode::convert($hoge,"utf8","euc-jp"); };
だと
>>837 と同じエラがでます。
間違えて
eval{"use Jcode"};
としたときは
Undefined subroutine &Jcode::convert called
とでました。
perl -e 'eval("use unko");' これだけ実行すると何もエラー吐かないわけだけど。
evalしたなら$@で補足しないと意味ないだろ。 perl -e "eval('use unko'); print $@"
>>845 それで、藻前が書いた unko は本当に拾えるんか?
例に下ネタがある時点で答える気0
「埼玉県蕨市ヘロ」というバイナリ文字が入力されたらしく、 SQL発行(insert)時に止まってエラーになったみたいなの ですが、この現象を回避する方法をご教示いただけますと 幸いです。 DBはPgモジュールを使用し、Postgresで管理しております。 たしかにコマンド直打ちでSQLを実行してみると、ターミナルが 停止してしまいます。。
MySQL で UTF-8 を使うようにして解決。
>>849 漢字コードとかも書きましょう。DBのテーブル側も。
CDBI とか DBIC とか使うとどうだろう。 ちゃんとエスケープしてくれるんじゃないかな。
すみません。 肝心のバイナリが貼り付けられませんでした。 「蕨市」と「ヘロ」の間には、エディタで開いて「SV」という 反転文字が入っております。 コードはSJIS→EUCに変換したものです。
> 「埼玉県蕨市ヘロ」というバイナリ文字が入力されたらしく、 元の文字列って何だろう? そういうことも示せないってのは馬鹿かなにか?
855 :
849 :2006/02/24(金) 00:22:49 ID:???
皆様の早急なご返答、誠に感謝しております。 本当にありがたいです。。 もう少し具体的に説明させていただきますと、フォームはSJIS ですので、入力があった文字はプログラムの先頭でEUCに 変換されます。 それをSQLにいれてinsertするのですが、その際に 「蕨市 〒ヘロ1-5-15」 ↑ 血管が浮き出るようなマーク このような文字列でSQLが止まってしまっていることが発覚し、 改修していたのですが、どうしてもこのバイナリを処理すること ができず困り果て質問させていただきました。 バイナリ文字は秀丸エディタで開くと、「SV」という反転文字が 入っております。 説明不足で申し訳ありません。
それで、何で藻前の仕事を漏れ等がしないといかんのかと。バカじゃねーの?
857 :
849 :2006/02/24(金) 00:34:50 ID:???
>>856 おっしゃるとおりです。
スレ汚しすみませんでした。
一件落着 はい次
この展開ヒドス。
861 :
849 :2006/02/24(金) 00:38:43 ID:???
なんだかかわいそうにも見えるな 849が自殺していないことを祈る
この程度で自殺なんかしたら笑い話だなw
元の文字列と、変換後のバイナリデータのヘキサダンプ、 何を使って変換したのか(できればモジュールのバージョンも)が分かれば、 原因も分かるかもね。
簡単なcgi(UAがこれならこれ、こっちならこれを表示、というもの)を書いて、ローカルでテストしてokだったので、サーバーにアップしてみたのですが、 500エラー(文法エラーですよね?)になりました。 チェッカなどにかけてみると、 In string, @808 now must be written as \@808 at index.cgi line 70, near "@808" index.cgi had compilation errors. と、出たのですが、意味が分からなくて、ググってみたんですが当該情報が見つかりませんでした。 何が問題か、分かる方いましたら、お教えくださいますようお願いします。
>>865 sjisで全角スペースの下位バイトが0x40で"@"だから" 808"ってリテラルがどっかにあるのかも
>>866 有難う御座います
808なんて記述してないと思い込んで、確認してなかったですが、
(ファイルサイズ 808KB)
ってのがあってそこに\つけたら直りました
ほんと助かりました
全角スペースと8でダメなんだ。
全角の2バイト目が @ じゃなかったっけ?
UTF-8 使っとけばおk
もういい加減shift_jis関連の質問秋田
テンプレつーか診断フローチャートみたいのがあると良い気がする。 1. 日本語文字列を使っている: YES => 2, NO => 30 2. Shift_JIS を使っている: YES => 10, NO => 3 3. EUC-JP を使っている: YES => 5, NO => 4 4. UTF-8 ... みたいな。
まあ、いいだしっぺが勝手にやってくれればよろしい。 使いやすければ使うし、そうでなければ無駄働きw
そうね。よさそうなら手伝うから873はたたき台よろしく。
多分やらないから、何度も同じ質問に答えればよろしいw
質問に答えず罵倒するということも可能。
テンプレ(できれば1)に Shift_JIS のスクリプトにはお答えできません
879 :
nobodyさん :2006/02/24(金) 15:59:44 ID:hXh5LOuq
ググっても見つけられませんでしたので、 こちらで質問させて頂きます。 サーバのローカル上にある画像ファイルのMIMEタイプを 判別したいのですが、どうすればよろしいでしょうか? GIFとJPEGが区別できるだけでいいです。 できることならモジュールとか使わず、 今のスクリプト上にシンプルに書きたいのですが。
880 :
879 :2006/02/24(金) 16:03:26 ID:hXh5LOuq
↑ 画像のMIMEタイプって変ですね…。 画像のフォーマットの種類を判別したいのです。 よろしくお願い致します。
バイナリオープンしてヘッダを調べる
sub get_type{ $file = $_[0]; open (FILE, "$file"); read (FILE, $data, 4); close (FILE); ($type) = unpack ("H4", $data); if ($type eq "ffd8") { $type = "jpg"; } elsif ($type eq "8950") { $type = "png"; } elsif ($type eq "424d") { $type = "bmp"; } elsif ($type eq "4749") { $type = "gif"; } else { $type = "知るかボケ"; } return ($type); }
ここって、口は悪いが何気にいい奴多いよなw 口悪くて性格も悪いやつもかなり混じってるけど。
884 :
879 :2006/02/24(金) 16:53:33 ID:hXh5LOuq
>882 特に問題は発生しないだろうけど、Win も考えるなら read の前に binmode を
886 :
nobodyさん :2006/02/25(土) 01:58:25 ID:qE7CF1Aw
どなたかお知恵をお貸しください。 外部ファイル呼び出しについて質問なのですが、呼び出し時に関数を 与えて呼び出す事は可能なのでしょうか? ニュアンスとしましてはmain.cgiというソースの中に外部ファイル (gaibu.cgi)を呼ぶ時にgetデータの送り方のように require("gaibu.cgi?data=1"); としてgaibu.cgiへdata=1という関数を引き渡したいのですが・・・ main.cgiから渡されたdata=1というのをチェックして、gaibu.cgiの方で main.cgiへ引き渡す関数を指定したいのですが。 妙な文章で申し訳ありませんが、どなたか宜しくお願い致します。
use 使えば?
エスパー待ちだなこりゃ
>>886 requireしてあんたが使う関数に、引数を渡してやれば良い。
最後の3行が名探偵も解けなさそう
「関数」と「引数」を混同している?
引数に戻り値のある関数を指定するって意味だろ
エスパーへの道程は長そうですが、 $ENV{"REQUEST_METHOD"} = "GET"; $ENV{"QUERY_STRING"} = "data=1"; my $data = `gaibu.cgi`;
>>886 そのスクリプトは、不特定多数がアクセスするような鯖に置くのかな?
>>893 > my $data = `gaibu.cgi`;
はつみみです。
896 :
nobodyさん :2006/02/25(土) 11:37:16 ID:JV6sbN7w
CSVファイル(最終行にだけ必ず特定の文字列XXXが含まれている) を読み込んで、その最終行だけを行ごと削除して出力したいのですが ググっていろいろ調べて試したんですがうまくいきません。 よろしくお願い致します。
>>896 (1) CSVファイルを一行ずつ読み込む
(2) 行がXXXでなければprint
(3) 終了
暇だから釣られてみた ロックとかエラー処理は自分で付け加えてね open(IN, "inputfile.csv");open(OUT, ">outputfile.csv");while(my $inline = <IN>){if($inline =~ /XXX/){print OUT $inline;}}close(IN);close(OUT); … どこのセルにXXXが含まれてるか分からんからこれ以上は無理
軽く間違えたw if(!($inline =~ /XXX/)){〜
!~ 使えよ。
初心者の初心者による初心者のための質問スレ
初心者の初心者による初心者のための底辺質問スレ
臭いでわかる
汚物は消毒(ry
臭いでわかるための方法をきぼん。
汚物を消毒したからといって、汚物のままなのでは?
消毒しても癒されない。
質問があります。 今Perlの勉強の為に掲示板を作ってるんですが、 例えば十バイト毎に段落を変えたい場合どうすれば良いのでしょうか? なにとぞご教授下さい。
substr
>>910 It's 書き込みテスト
お前、これを10バイトで段落変えてみろ
S-JISなのかEUCなのかUTF-8なのかUTF-16なのかで(ry
>>910 1) 10バイトを別の文字列にコピー
2) その文字列を正規表現などで、正しい文字列かチェック
3) 正しくなければ、1バイト減らしてコピーして2)へ戻る
4) 正しければ終了
UCSだったr(ry
(ry
917 :
nobodyさん :2006/02/26(日) 16:03:42 ID:QDNmTDhH
すいません。perl初めてまだ数日の者ですので馬鹿みたいな質問 ですが宜しくお願い致します。 Q.関数の値を代入する際、サイズの制限はあるのでしょうか? 例えば私が考えているので $test = "<table width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">・・・"; などのように関数にそのままHTMLソースを入れているのですが結構なサイズ になってしまうので不安です。
> すいません。perl初めてまだ数日の者ですので馬鹿みたいな質問 > ですが宜しくお願い致します。 ということにしたいのですね。:) ちなみにどう「初め」たのか教えてください。
1: 自分はこういう事がしたい。 2: それでこんな風にやってみたが・・・ 3: こんなエラーが出て上手く行かなかった。 もちろんどこまで「結構なサイズ」が変数に代入できるかを試した上での質問だよな?
どうでもいいけど共有鯖でテストするなよ 自鯖でテストしろよ
>>917 多分、メモリが許す限り。
使用メモリに制限がかかっていたら、そこまで。
関数つか変数だろ?
うむ。みんなすごいな。
なんかもう全部の質問がネタに見えてきた 末期かな
御臨終です
>>920 ごめんなさい、自鯖というのは何でしょうか?
それでテストということは、テストを行う環境ということでしょうか?
だってネタだし。
屑どもが・・・
IPアドレスを変化させてスキャンするようなものを書きたいのですがうまくいきません。 どのように書いたら良いのでしょうか?変数の選び方が間違っているのでしょうか? ちなみに、現在は下のプログラムで、"192.168.0.1:80"をポートチェックしています。 for ($i = 0; $i<3; $i++) { $port=80; $ip_add=192.168.0.1; #↑の行を $ip_add=192.168.0.1+$i; みたいにしたい。 &CheckPort($portNo,$ip_add); }
931 :
勉強中 :2006/02/26(日) 22:16:58 ID:???
Perlでは、 「NULL」と「LOW-BALUE(1バイトの'00')」は 違うものなのでしょうか???
Perl使った事あるのでしょうか???
PerlにNULLなんてないよ。
ちなみに文字列とかにはヌル文字('¥0')使えるよ。 Cと違ってperlは文字列長を管理してるからヌル文字が境界にならない。 1文字だけの文字列を作っても、 内部ではreallocが多くならないように、長めにメモリが割り当てらる。 で、文字列長は1文字、とスカラ構造体のどっかに値が入る。 なので文字列にヌル文字入ってても平気。
何か知らんけど、気が済むまでスキャンしてろ。 my $port = 80; for (my $x = 0; $x < 256; $x++) { for (my $y= 0; $y < 256; $y++) { my $ip_addr = sprintf("192.168.%d.%d", $x, $y); CheckPort($port, $ipaddr); } }
痛いソース・・・
>>937 もっとマシに書ける?
わかりやすく、かつ、バグがない書き方だと思うけど。
以前に作った IP アドレスを10進数に変換する関数だけどつかってみてくらさい ただ、自分の環境でしかテストしてないので間違いがあるかもしれないです 戻り値が 0 の場合はエラー判定してください sub ip2dec{ my($ip) = $_[0]; my($basedec) = 256 * 256 * 256 * 256; # ベースとなる値 my(@quadip) = (0, 0, 0, 0); my($ipdec) = 0; # 10進に変換された IP @quadip = split(/\./, $ip); # 全ての値が 0 〜 255 に収まってるかチェック for(my $i = 0; $i < 4; $i++){ if(($quadip[$i] < 0) || ($quadip[$i] > 255)){ return 0; } } for(my $i = 0; $i < 4; $i++){ $basedec = $basedec / 256; $ipdec += $basedec * $quadip[$i]; } return $ipdec; }
> my($ip) = $_[0]; shift 使えよ。
修正した my($ip) = $_[0] || "";
>>939 取りあえずfor (my $x = 0; $x < 256; $x++)→for (0 .. 256)な。
それだと 0 が渡ってきたとき "" になるんだよね。
>>942 /16 用にネストしてるけど、どうするんだろう。
my @ip = (192, 168, 0, 0); foreach(1..65537){ print join('.', @ip), "\n"; foreach(reverse @ip){ ($_ = $_+1 & 255) and last; } }
そんなひねくれた書き方すると、バグ探しが面倒。 でさ、65537 って、0x10001 なんだけど。
>942 $x なんて使ってないし・・・ >943 my($ip) = $_[0] || ""; そこには書かれてないけど if(!$ip){ return 0; } で抜けるようにした ちなみに &ip2dec("220.110.54.66"); みたく呼ばれることを想定
黙って Socket::inet_aton() か Socket6::inet_pton() 使えよ。
あるものに頼ってばかりいると「思いつく力」 が欠けてくるので 出来るところは自分で書いた次第です
950 :
945 :2006/02/27(月) 02:02:33 ID:???
my $ip = unpack("N", pack("C4", (192, 168, 0, 0)));
foreach(0..65536){
print join('.', unpack("C4", pack("N", $ip+$_))), "\n";
}
>>946 ただのカウンタだから。
カウントする回数は適当にどうぞ。
>>942 すごいスーパーハカーですね。
for ($x = 0; $x < 256; $x++)
と
for $x (0 .. 256)
って同じ結果を得られるんですかね?
>>944 そんならfor my $x (0 .. 256)でOKですぅ〜。
気付いても黙っていてあげるのもやさしさですよ?
>952 それでforのなかで$xが扱えるの? いい事しりました
>>951 うっせ!そんなので下らない文字レスするなハゲ!あああ、私が悪うござんした。ケアレスミスぐらい多めに見ろやハゲ。
何気に人が多いでつね。 デスマ中でつか?
必死に文献探してやっと間違いが分かったくせして・・・
いやー、釣れた釣れた
大体、釣れたって後から宣言する奴は返す言葉がなくなった奴だな。
960 :
945 :2006/02/27(月) 02:14:36 ID:???
書くソースもつまらなければ返しもつまらないな
初心者が集まって下らないことを言いあってる糞スレはここでつか?
AをAにデコードするのはどうすればいいですか?
my $string = "???"; $string =~ s/?([0-9]+);/chr($1)/eg; print $string; #ABC
1行目みすった。 my $string = "ABC"
2行目も
ほんとこのスレ初心者ばっかでワロタ
↑初心者
perlにて以下のような事は実装可能でしょうか。 可能であれば教えてくらはい。 ページAからページBに遷移した場合は1としてカウントし、 ページB内で何度更新しても1としてカウントする。 ページBからブラウザの戻るボタンを押してページAに戻り 再びページBに戻ってきた場合は1としてカウントする。 ただし、ページAはこちらでは操作出来ない(弄くれない)ものとする。 最初はリファラーチェックすればいけるかなぁと思ったんですが ページAから遷移した状態のページBで何度更新してもページAの リファラーが返っていたのでタメポですた。 何かいい案があれば教えてくらはいませ〜。
ページAでクッキーセットしてページBでクッキー削除 なのでページBでリロードしてもクッキーが取得できないのでカウントアップしない ってのはどうだろか
セッション
>>970 レスありがd
しかしながら
>>969 で書かせて頂きましたように
ページAはこちらでは操作出来ません。
よってページAでクッキーをセットってのが不可能となります。
またクッキーやJavaScript等は一切使えません。
そこ(ページAやページB)へアクセスしてくるのが
クッキーやJavaScriptに対応したものだけとは限らない為です。
わがまま言ってすいません。
こちらでは操作できないページAって、 早い話が「他人のサイト」扱いだと思えばいいの?
セッション使ったリロードチェックでやってる事と同じ事をすれば良い。 基本だから、セッション、リロードチェック辺りでぐぐって。 Bで毎回uniq IDを生成するんだよ。
んじゃログファイルにIP保存して戻るボタン押した時にそのIP削除&ロケーションで戻してあげな。 リロードしてそのIPあったらカウントしないってのはどう
>>972 CookieやJSオフにしているユーザのことを考えるなら、
リファラを送らないように設定しているユーザも考えることになると思うが。
変数 $testの内容が、同じディレクトリにあるtest.datにしたいのですが、出来るのでしょうか。 簡単すぎるのか、検索では出てきません。 よろしくお願いします。
979 :
969 :2006/02/27(月) 23:59:40 ID:???
>>975 了解です。
いろいろとググりましたが
もっとググってみます。
>>976 >>戻るボタン押した時にそのIP削除
知識不足で申し訳ないです。↑はどのようにやればいいんでしょうか?
>>977 確かにそうですね。
ごめんなさい。
>>979 PHPのサンプルを見ると分かるかもね。
「セッション リロード対策」とかでググって。
そこまでやるかは別だけど。
>>979 <form action="cgiファイル" method=post>
<input type=hidden name=mode value=back2A>
<input type=submit value="Aに戻る">
</form>
--------
上で呼んだcgiファイル(Bでもいいや)で
・IPをログファイルから読み込んで削除
・最後にLocationでAに飛ばす
次スレ待ち保守
984 :
978 :2006/02/28(火) 23:58:59 ID:???
>>980 perl 外部ファイル などで検索して、この方法にたどり着いたのですが、できなかったので、質問させていただきました。
でも、いまやって見たら、無事にできました。 ありがとうございました。
985 :
nobodyさん :2006/03/01(水) 13:00:29 ID:042Ft4VL
Image::Magick 使えばかんたん。
Perl+sendmailのメールフォームなのですが、
無事送信出来る時と出来ない時があるのは、
Perlの書き方がまずいのでしょうか?
ググってみたものの、送信できない事はよくあるようですが、
(注意書きで「送信できない場合は
[email protected] までご連絡ください」のような)
原因は何なんでしょうか?
どんなコードなのかわかんないから、まずいかどうかも原因もわかんないけど
> (注意書きで「送信できない場合は
[email protected] までご連絡ください」のような)
これは action="mailto:〜" で片づけてる場合が多いんじゃないのかな。
あと、JavaScriptが効いてないと送信できないサイトでも見かけた。
Web サーバの error_log とかメールサーバの maillog は見れないの?
Perl使ってます 画像処理にimagemagicとGDと2種類あるようですが、 グラフとか書きたいならGD グラフを書くこと以外ならImageMagic っていう認識でいんでしょか?
991 :
987 :2006/03/01(水) 14:35:24 ID:???
>>988 ソース見てもらうのは悪いかなと思てたのですが…
うpしましうた。
※設定部分は省いてあります
http://up.spawn.jp/file/up12772.txt ちなみに、JavaScriptは使ってません。
>>989 見れます。で、見てみました。
が、どうやら入力フォーム→確認画面までは到達し、その後送信ボタンを押しても何の反応もしなく
エラーすらも発生しないようなのです。
なので、それらしいログはなかったです。(まだざっと見ですが)
セキュティソフトとかが悪さしてる場合があるらしいですが、
4分の1の人が送れないらしいので、
さすがに問題は別なのかなと思ってます。
出力してる HTML が不完全とかは?
993 :
987 :2006/03/01(水) 15:31:10 ID:???
>>992 確認画面でのソースも確認したのですが、
特に問題はなさそうでした。
正常に送れている人もいるので…
>>991 クラックしてくださいと言わんばかりのソースでつね。
>&jcode'convert(*sub_msg,'jis'); > print MAIL "Subject: $sub_msg\n"; おい。RFC 嫁。
996 :
987 :2006/03/01(水) 15:54:21 ID:???
ソースが未練
referer チェックされてるっぽい。
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。