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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2007/02/10(土) 19:21:23ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

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

前スレ http://pc10.2ch.net/test/read.cgi/php/1164519503/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0331nobodyさん2007/03/12(月) 02:10:14ID:???
そんな化石でも素人がデコード用の手続きを書くよりマシ。
0332nobodyさん2007/03/12(月) 11:05:45ID:???
自分でそこ書く経験って大事だと思うけど。

>>326
まず$form{'page'}をprintしてみては?ちゃんと入ってる?
0333nobodyさん2007/03/12(月) 14:21:21ID:???
>>330
cgi-libのほうがシンプルで速い(軽い)ってメリットもあるんじゃね
0334nobodyさん2007/03/12(月) 21:46:55ID:???
CGI.pmって重いの?
どんなデメリットあるんだろう・・
0335nobodyさん2007/03/12(月) 22:41:31ID:???
今のマシンでならたいした差なんてないよ。
古いコードの保守ならともかく、これから新規で書くんならCGI.pmがオススメ
0336nobodyさん2007/03/12(月) 23:33:07ID:???
たしかに重いよな なんでわざわざこんなに重くつくったんだろう。。
0337nobodyさん2007/03/12(月) 23:59:28ID:???
いまどきCatalyst+TTが普通なのでCGI.pmなんて軽いほう。
0338nobodyさん2007/03/13(火) 00:12:24ID:???
Cat+DBIC+TTぐらい普通だからな。
0339nobodyさん2007/03/13(火) 00:12:38ID:???
どうせクエリのパースくらいしか使わないんだったら
CGI::Minimalあたり使ってろよ
0340nobodyさん2007/03/13(火) 00:37:46ID:7SHHDDju
CDBIで論理削除って表現できる?
色々調べたけどお手上げ…
0341nobodyさん2007/03/13(火) 00:43:35ID:???
CGI::Lite
0342nobodyさん2007/03/13(火) 00:59:27ID:???
>>340
単純なテーブルならデータにdel_flgとか持たせとくとか
別にテーブル作ってIDとdel_flgで状態を管理とか
0343nobodyさん2007/03/13(火) 01:21:54ID:7SHHDDju
>>342
package Item;
__PACKAGE__->columns(Primary => qw/id/);
__PACKAGE__->columns(Others => qw/name maker note del_flag/);
__PACKAGE__->has_many(groups => 'Group');

package Group;
__PACKAGE__->columns(Primary => qw/id/)
__PACKAGE__->columns(Others => qw/name del_flag/);
・・・

CDBIでリレーションしてる他のテーブル(例えばGroup)
にもdef_flagのようなフラグをつけていて、

@data = Item->search_like(name => 'pc');

みたいな時に、Groupが論理削除されている場合は拾って来ないようにして、

Item->groups->name

には生きているデータだけ持ってきたいのだけど…
0344nobodyさん2007/03/13(火) 01:27:58ID:7SHHDDju
>>343
package Group;
__PACKAGE__->columns(Primary => qw/id/)
__PACKAGE__->columns(Others => qw/name item del_flag/);
・・・
でした。因みに出力はTTです。
0345nobodyさん2007/03/13(火) 01:31:58ID:7SHHDDju
@data = Item->search_like(name => 'pc', del_flag=>0);
とかだと、Itemの削除したものはあがってこないが、
Groupの方は関係ないから普通に拾ってきてしまうのよね…

>>342 <早速のレスありがとうございます。
0346nobodyさん2007/03/13(火) 04:25:58ID:???
今時は DBIC じゃね?
0347nobodyさん2007/03/13(火) 07:08:26ID:???
DBICだと簡単?
0348nobodyさん2007/03/13(火) 10:54:37ID:???
やることはDBICも一緒
0349nobodyさん2007/03/13(火) 12:59:08ID:RaCGoxpM
今、掲示板を改造してんだけど
$in{'name'}ってのを$in{'$rand'}ってやって乱数にしたいんだけど
どうやってやればいいんでしょうか?
ちなみに$randは乱数です。
0350nobodyさん2007/03/13(火) 13:14:50ID:???
$rand = sprintf( "%04d", int( rand( 9999 )));
$in{$rand} = 'hogehoge';
0351nobodyさん2007/03/13(火) 13:20:42ID:RaCGoxpM
>>350
動きません・・・・
0352nobodyさん2007/03/13(火) 13:26:14ID:RaCGoxpM
すみません、詳しく書きます。

<input type=text name="OMbqcVSSOZkugP167bljsl3zHt5uVk" size=28 value="">
書き込みのフォームがこんな感じになっていて、name"$rand"ってなっています。
ですが$in{'name'}を$in{'$rand'}にしても書込みをさせてくれません・・・。
どうすればできますでしょうか?
0353nobodyさん2007/03/13(火) 13:28:17ID:???
%inってたぶんフォームから受け取ったデータなんだろうけど、そのキーを乱数にしたいっていったどういうシチュエーションなんだろうか
0354nobodyさん2007/03/13(火) 13:30:12ID:???
$in{$rand}

$randにしかるべき文字列が設定されているのが前提だが。
0355nobodyさん2007/03/13(火) 13:34:38ID:RaCGoxpM
荒らし対策でname="name"って書いてある部分を乱数にかえたいと思ってます。
ですが$in{$rand}ってやっても全然書き込み出来ません・・・。
0356nobodyさん2007/03/13(火) 13:41:49ID:???
思うにform出力するときと書き込みのときで$randに別の値が入ってるんじゃないか
0357nobodyさん2007/03/13(火) 13:42:19ID:RaCGoxpM
ではどうすれば同じに出来ますか?
0358nobodyさん2007/03/13(火) 13:43:39ID:???
乱数じゃなくていいだろ
0359nobodyさん2007/03/13(火) 13:46:07ID:RaCGoxpM
乱数の方がいいんです・・・
0360nobodyさん2007/03/13(火) 14:05:26ID:???
スカラー変数の中身に入っている文字列に、右から等間隔で記号を挿入したいんです。
たとえば、$i に 1234567890 が入っていたら、 1A234A567A890 とか、1 234 567 890 といった感じです
いい方法あったら教えてもらえませんか?
0361nobodyさん2007/03/13(火) 14:05:53ID:???
ロジックは自分で考えろ
コーディングでエラーが出たら質問するといい
0362nobodyさん2007/03/13(火) 14:06:49ID:???
>>360
日本語含む?
0363nobodyさん2007/03/13(火) 14:10:45ID:???
>>362
含みません。スペースやタブといった空白文字も含みません。
0364nobodyさん2007/03/13(火) 14:11:09ID:???
複数のcookieを書き込もうとしているのですが

@ck = ("a", "b", "c", "d", "e");
for($i = 0; $i < 5; $i++){
 $array[$i] =~ s/([^\w\=\& ])/'%' . unpack("H2", $1)/eg;
 $array[$i] =~ tr/ /+/;
 print "Set-Cookie: $ck[$i]=$array[$i]; expires=Tue, 01-May-2008 11:32:58 GMT;<br>\n";
}

とやると最初のaしか書き込まれません。
全て書き込むためにはどのようにすればいいのでしょうか?
(@arrayには正しく値が入っています)
0365nobodyさん2007/03/13(火) 14:11:18ID:???
>>360 数値の3桁コンマ区切りなどで検索すればいい。
0366nobodyさん2007/03/13(火) 14:12:24ID:???
1 while s/(.*\d)(\d\d\d)/$1,$2/g;
0367nobodyさん2007/03/13(火) 14:16:18ID:???
>>365-366
ありがとうございました、参考にしながら、自分でも調べてみます。
0368nobodyさん2007/03/13(火) 15:39:13ID:???
スレッド式の掲示板を作っているのですが、
「スレッド一覧を表示する」のと、「1スレッドの投稿内容を表示する」のは、
別々のcgiで分けた方が良いのでしょうか?それとも一つのcgiファイルで
場合分けした方が良いのでしょうか。
この様な掲示板を作ったことがない素人なので、かなり迷っています。
普通は分けるもんなんでしょうか?
0369nobodyさん2007/03/13(火) 15:52:30ID:???
普通とか無いから。
フリーで配布してるやつの中身見てみたら?
コーディングスタイルはおすすめできないけど。
0370nobodyさん2007/03/13(火) 16:00:28ID:???
普通というか、cgiファイルを分散させればそれだけ負荷がかからない(プロセスが滞らない)
と思ったんですが、どうなんでしょうか。
0371nobodyさん2007/03/13(火) 16:12:51ID:???
負荷を気にするほど重いんならmod_perlなりfastcgiなりにいくべきではないか。
0372nobodyさん2007/03/13(火) 16:41:42ID:???
1ファイルで分岐させて処理を分けるか
複数ファイルでファイルごとに処理を分けるか
どちらもメリット/デメリットあるのでお好きに。
0373nobodyさん2007/03/13(火) 17:22:38ID:???
複数ファイルでのデメリットってさ、管理がマンドクサイってだけじゃね。
小分けして複数ファイル管理のほうがUNIX的だな
0374nobodyさん2007/03/13(火) 18:12:46ID:???
sendmail程気にするようなものでもない。
0375nobodyさん2007/03/13(火) 23:17:29ID:???
単刀直入に質問。IPに改行が入ってることってあるの?
0376nobodyさん2007/03/13(火) 23:29:41ID:???
あるある。そりゃあしょっちゅうよ。
0377nobodyさん2007/03/13(火) 23:34:43ID:???
ねーよ
0378nobodyさん2007/03/14(水) 02:26:48ID:???
普通は無いけど、データは全て検証するのがセキュリティの基本だよ。
IPアドレスだったら正規表現で入力段階で正当なものかを確認。正当じゃなったらサニタイズじゃなくて、エラー処理な。
基本的にIPアドレスは安全だけど、サーバソフトの脆弱性などで不適切なデータが来る可能性は完全に否定できないから、リスクは最小限にすべき。

ついでに、リモートホストはもろ好きな文字列を指定できるから超注意。
殆どの配布CGIでは何の対策もしていないが、DNS登録権限があれば、リモートホストにタグいれることだって出来る。

そして、出力時には、全ての変数 (汚染の可能性があるかないかは別にして) に対してHTMLタグの無効化処理を行うか、
出力文字列も全部無効化するサブルーチン通して、タグが必要な場合には、別サブルーチンを通すべき。
たかが、XSSであっても、同じサーバ上のすべてのサービスに影響がでるし、Cookie漏洩したらセッションハイジャックされるのだから。
0379nobodyさん2007/03/14(水) 10:33:43ID:???
要約すると、へぼはCGI作成禁止と。
0380nobodyさん2007/03/14(水) 11:53:05ID:???
>>378
出力時にエスケープしとけばセキュリティ上は問題ないのでは?<へぼの考え
0381nobodyさん2007/03/14(水) 12:43:20ID:DiCI2BZs
質問していいですか?

<a href="2ch.cgi?page=2">2ch</a>

のように2ch.cgiにpage=2というようなパラメータを渡すときなのですが、
渡すパラメータを数種類もためせたい場合はどうやればいいのでしょうか?
0382nobodyさん2007/03/14(水) 12:53:48ID:???
2ch.cgi?page=2&aaa=bbb&ccc=ddd

ただし XHTML なら & じゃなくて &amp;
0383nobodyさん2007/03/14(水) 12:55:05ID:DiCI2BZs
>>382
ありがとうございます!たすかりました!
0384nobodyさん2007/03/14(水) 13:55:05ID:???
ナウなCGIでは&ではなく;で区切る。
0385nobodyさん2007/03/14(水) 15:23:52ID:???
/ で区切るのもSEO的にグッドです
0386nobodyさん2007/03/14(水) 19:55:54ID:???
/ってディレクトリと間違えそうだな
2chも/なんだっけか
0387nobodyさん2007/03/14(水) 19:59:38ID:???
見ての通りWebPorg板だから深く考えないで良いよ
03883782007/03/14(水) 23:35:50ID:???
>>380
XSS対策に限って言えば、出力時のHTMLタグの無効化処理だけで問題無いし、入力時にサニタイズ(文字列の変換)をするといったトリッキーな処理はすべきじゃない。

IPアドレスの形式のチェックが必要というのは別の意味で。
IPアドレスというのは掲示板に犯罪予告が書き込まれた場合に警察に情報提供する場合などに必要な情報。
例えば、WebサーバのバグやWebサーバとの連携障害などで、サーバから本来送られてくるべき変数が送られてこなかったり受信できなかったりすることは想定される範囲。

なので、$ENV{'REMOTE_ADDR'} の内容をそのまま記録するのではなく、
・データが送信されてきたこと
・少なくとも型が正当であること
を正規表現で確認し、エラーだったらそこで弾くべき。

ちなみに、Kent Web で配布されている Web Patio などのCGIには、投稿者情報記録機構に重大な欠陥がある。
それは、$ENV{'REMOTE_ADDR'} じゃなくて $ENV{'REMOTE_HOST'} をそのまま記録していること。

$ENV{'REMOTE_HOST'} は 実は詐称できる情報。
一般家庭のようなISP契約じゃあ詐称できないが、漏れが契約しているような企業向けの回線だと、DNSの登録権限が譲渡される場合がある。
ってことで、2cher.example.com に詐称することだって出来る。(host名に < や > を入れることも可能。)

Apache などで host 名でアクセス制御をした場合には、

(1) 接続元のIPアドレスを取得して、それに対するリモートホストをDNSのPTRレコードを参照することにより取得して、
(2) 取得したリモートホストに対する Aレコードを取得して、
(3) (1) と (2) の内容が同一でなかったら無効にする。

という処理を行っているのに、Kent の CGI がやってるのは (1) だけ。
0389nobodyさん2007/03/15(木) 00:13:01ID:???
そんなことより過去ログ倉庫が規約違反だか何だかで
表示されないんだけど強制アフィでも仕込んでたんか?
0390nobodyさん2007/03/15(木) 02:32:50ID:???
>>388
今北産業
0391nobodyさん2007/03/15(木) 02:36:48ID:???
>>390
CGIを作るのに必要な勉強はPerl言語の勉強だけでは無い。
その前にTCP/IPの仕組みやDNSの仕組み、Apacheなどのサーバの仕組み、Linuxの仕組みなどを勉強すべきだ。
そうしないとセキュアなプログラミングをすることはできん。
0392nobodyさん2007/03/15(木) 05:31:26ID:???
>>391
そんなことなんかどうでもいいので、セックスするのに必要な知識を教えてください。
0393nobodyさん2007/03/15(木) 05:54:55ID:???
>>378、388
はどこから突っ込んでほしいのかな?
0394nobodyさん2007/03/15(木) 06:03:54ID:???
> はどこから突っ込んでほしいのかな?

アナルのほうに中田氏でおねがいします。
0395nobodyさん2007/03/15(木) 08:46:50ID:???
あ゙あ゙あ゙あ゙あ゙あ゙あ゙過去ログ見に来たのい゙い゙い゙い゙
0396nobodyさん2007/03/15(木) 10:48:13ID:???
>>394
アーッ!
0397nobodyさん2007/03/15(木) 11:24:31ID:???
>>386
つmod_rewrite
0398nobodyさん2007/03/15(木) 12:00:10ID:???
>>388
> (host名に < や > を入れることも可能。)
そんなresolverのバグを力説せんでも。
まともなresolverならそんな名前が返って来たらエラーを返す。
0399nobodyさん2007/03/15(木) 13:41:02ID:???
>>388
手元で実験できるマシンで実験してみたが、FreeBSD 7-currentも玄箱linuxも、
"<"や">"が入った名前ははじく。Windowsは今実験できん。

おまえは、どんな腐った環境を前提にものを言っているんだ?
0400nobodyさん2007/03/15(木) 21:01:34ID:???
>>398-399
bind1 (1990年ごろ公開) とか
04013992007/03/15(木) 23:10:10ID:???
Win2Kはエラーにしてないな。
Windowsをサーバにしない理由が一つ増えた。
0402nobodyさん2007/03/16(金) 00:39:54ID:???
せめて2003だろ
0403nobodyさん2007/03/16(金) 02:10:14ID:???
逆引きの設定してない、正引きと食い違うIPアドレスなんて、いくらでもある。
そんな厳密な制御してもクレームの山になるだけだと思うけど。
0404nobodyさん2007/03/16(金) 02:20:09ID:???
>>403
そういういい加減な処理をしたいなら、リモートホストのほかにIPアドレスも記録するべき。
犯罪予告の投稿者ホストが政府機関に成りすましたホストだったらどうするの?
下手したら管理者が責任を問わされるぞ
0405nobodyさん2007/03/16(金) 03:22:19ID:???
>>404
べつにどうでもよくね?
0406nobodyさん2007/03/16(金) 03:26:33ID:???
>>405
ひろゆきみたいに告訴されて賠償地獄になってもいいならご自由にどうぞ
0407nobodyさん2007/03/16(金) 03:33:49ID:???
てst
0408nobodyさん2007/03/16(金) 04:18:14ID:???
> ひろゆきみたいに告訴されて賠償地獄になってもいいならご自由にどうぞ

べつにどうでもよくね?
0409nobodyさん2007/03/16(金) 10:09:23ID:???
ひろゆきは逃げ続けてるんだよなw
一番性質が悪いタイプw
0410nobodyさん2007/03/16(金) 10:35:41ID:???
>>391
> その前にTCP/IPの仕組みやDNSの仕組み、Apacheなどのサーバの仕組み、Linuxの仕組みなどを勉強すべきだ。

おれIPとかUNIXとか全くわからないんだけど
どう勉強すればいい?
0411nobodyさん2007/03/16(金) 10:40:57ID:???
>>404
おめーが記録したログに信憑性なんか無いから心配しなくて良い。
0412nobodyさん2007/03/16(金) 12:42:30ID:???
>>404
そういうの書き込みされたら、すぐに削除すればいいんじゃない?
大体ここみたいに大きなところを管理しているわけじゃなかろうに…
0413nobodyさん2007/03/16(金) 18:46:21ID:???
鯖に入ってないモジュールをuse hogeしてるから、
hoge.pmとかを置いてrequireで読み込ませようとしてるのだけど、一部出来ないので質問。

とりあえず、use hoge;はrequire hoge;にして同じ階層にhoge.pmを置けば問題なかったけど、
use POE::Component::IRC::Common qw(:ALL);みたいなのはどうすればいいのか教ええてクリ。
エラーメッセージ見ると
Can't locate POE/Component/IRC/Common.pm
って書いてるのでそのディレクトリ作って置いてみてもダメみたいだった。
requireで hoge::moge みたいに :: の指定がされてる場合は、
素直に同階層に置いちゃって require Common; で指定しちゃって問題ないのかな。
0414nobodyさん2007/03/16(金) 18:56:35ID:???
適当なデレクトリ作って
そこにモジュールいれて
use lib すればいいよ
0415nobodyさん2007/03/16(金) 19:06:52ID:???
おお、ナルホド。
それならまとめて放り込めば良いのね。
ありがと!

0416nobodyさん2007/03/17(土) 02:24:03ID:???
>>415
もうちょっと丁寧な解説は
http://www.nishishi.com/blog/2005/12/perl_module_per.html
0417nobodyさん2007/03/17(土) 04:24:56ID:tNPzkWAm
perlで文法が間違っているのを指摘してくれるソフトってないでしょうか?
毎回メモと睨めっこしているんですが
よろしくおねがいします
0418nobodyさん2007/03/17(土) 04:28:18ID:???
冗談顔だけにしてよ。
0419nobodyさん2007/03/17(土) 05:06:00ID:tNPzkWAm
無理なんでしょうか?
0420nobodyさん2007/03/17(土) 05:33:05ID:???
>>419
perl -cw スクリプト.cgi
とか。
0421nobodyさん2007/03/17(土) 05:35:33ID:???
一番手っ取り早いのは、色付けしてくれるエディタを使用することだな。
0422nobodyさん2007/03/17(土) 08:44:30ID:FBwp50T+
>>421
mkeditor つかってますが、他にいいの有ったら宜しく。
0423nobodyさん2007/03/17(土) 09:48:25ID:???
vimを使え
winならgvimがいいな
0424nobodyさん2007/03/17(土) 09:50:25ID:???
Emacsじゃないの?
04254172007/03/17(土) 16:18:30ID:tNPzkWAm
420さん
ぐぐっても出てこなかったです

421さん
terapadを使っていますが
よく;を打つのを忘れたりします
そのせいで三十分ぐらい睨めっこ
0426nobodyさん2007/03/17(土) 16:20:18ID:???
配列に重複要素があるか調べるにはどう書けばよいのでしょう・・・

重複を取り除いてから、元のと要素数を比較するという
チンポな方法しか思いつきません。
0427nobodyさん2007/03/17(土) 16:47:02ID:???
my @array=qw(a b b c d d e f);
my %hash;
map { $hash{$_}++ } @array;
print keys %hash;
0428nobodyさん2007/03/17(土) 16:55:18ID:BFzI3Dy+
\nと入力すると、改行じゃなくてスペースがブラウザに表示されます。
なにが原因だと思われますか?
OSはwindowsです。
0429nobodyさん2007/03/17(土) 16:58:19ID:???
原因はお前だ
<br>にしとけ
0430nobodyさん2007/03/17(土) 16:58:24ID:???
どんなコードなのか
■ このスレッドは過去ログ倉庫に格納されています