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

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

■ このスレッドは過去ログ倉庫に格納されています
00019882005/12/08(木) 22:48:27ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0765nobodyさん2006/01/15(日) 17:37:39ID:???
ラクダ本て
えらい遠回りな
0766nobodyさん2006/01/15(日) 18:21:55ID:???
>>763

use CGI::最小限;
0767nobodyさん2006/01/15(日) 18:30:31ID:???
>>763
迷うならCGI.pm使う。
パフォーマンスを追及したかったら思ったらCGI::minimalをインスコして使う。

根拠はperlfaq9
http://www.kt.rim.or.jp/%7Ekbk/perl-5.8/perlfaq9.html#how_do_i_decode_a_cgi_form
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq9.html#How_do_I_decode_a_CGI_form_
0768nobodyさん2006/01/15(日) 19:24:47ID:???
微笑ましいレスだな。
0769nobodyさん2006/01/15(日) 19:54:25ID:???
GETしか使わないからURL::Queryに突っ込んでる。
0770nobodyさん2006/01/15(日) 20:39:21ID:???
自分の意見を押し通さないと満足しない厨房たち(笑)
0771nobodyさん2006/01/15(日) 20:41:22ID:???
いろんな方法が表に出てくるのはいいことだ
0772nobodyさん2006/01/15(日) 20:45:26ID:???
sub decode {
  binmode(STDIN);
  if($ENV{'REQUEST_METHOD'} eq "POST"){
    read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
  }else{
    $buffer = $ENV{'QUERY_STRING'};
  }

  @pairs = split(/&/, $buffer);
  foreach $pair (@pairs) {
    ($name,$value) = split(/=/,$pair);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

    $in{$name} = $value;
  }
}
スクリプト書くたびにコレを書いてる
マルチプル、マルチパートなんて使わないのでこれで十分事足りてる
0773nobodyさん2006/01/15(日) 20:57:56ID:???
>>772

590 549 sage 2006/01/13(金) 12:44:01
>>568
説明すると長くなるから
ttp://perldoc.jp/docs/perl/5.6.1/perlfaq9.podの
How do I decode a CGI form?の項を1000回読め。
とほほのコードがどうしてまずいのかがよ〜く解るだろう。

ついでにCGI.pmはpure perlだから読んでみるとよかろう。
もし君が解読しきれなくても本当に正しくフォームデコード
するというのはどんなに大変なことなのかぐらいは解るだろう。

CGI/util.pmのunescapeメソッドを読むだけでも君は
ここで「とほほのコードはWebProg板では普通のコード」
と言い切ってしまったことをとても恥ずかしく思うようになるはずだ。

cgi.pmのマニュアルがよく解らないというのはオブジェクト指向や
参照渡しがよく解ってないからじゃないのかな。
cgi.pmにはcgi-lib.plもどきの関数インターフェースもあるので
Webを漁って探してみてくれ。日本語訳もあるよ。

まあ頑張れ。
0774nobodyさん2006/01/15(日) 21:20:06ID:???
>>773
まずレス先をきちんと明示できるように「掲示板の書き方」勉強してみるべき
日本語も不自由でかわいそう・・・
0775nobodyさん2006/01/15(日) 21:22:56ID:???
readのエラーチェックとかアホみたいだな
エラーチェックしなかったら、どうなるんだってのw
0776nobodyさん2006/01/15(日) 21:30:59ID:???
俺仕様で不備が指摘されても開き直る人
0777nobodyさん2006/01/15(日) 21:34:52ID:???
反論されて耳が真っ赤でイライラして、必死に言い返す言葉を模索中の>773
0778nobodyさん2006/01/15(日) 21:35:18ID:???
いいかげんパラメータ区切り;に改善しろよ。
0779nobodyさん2006/01/15(日) 21:37:12ID:???
そして平然を装って書き込む>778=773
0780nobodyさん2006/01/15(日) 21:38:02ID:???
そんなくだらない言い争いしてないで
ttp://pc8.2ch.net/test/read.cgi/php/1127916965/
このスレの依頼でもやってクリ

俺の依頼もスルーされてるけど、とりあえず他の人の依頼でもいいからさ
0781nobodyさん2006/01/15(日) 21:42:33ID:???
>>779
お前は自分の不備を指摘する人間はみんな同一人物だと思ってるのか?
……お疲れさまです。
0782nobodyさん2006/01/15(日) 21:51:27ID:???
>778=773=781
落ち着けよwwwwwwwww
0783nobodyさん2006/01/15(日) 21:55:05ID:???
具体的にreadのエラーチェックしなかったらどうなるの?
悔しかったら反論してみろよw
0784nobodyさん2006/01/15(日) 21:58:42ID:???
wwwww
07857732006/01/15(日) 21:59:42ID:???
俺様にはそんな技量無いので説明できません
07867732006/01/15(日) 22:07:51ID:???
>783
「エラーチェックしなかったらどうなるのか無知な僕に教えてください」だろ。
いくら初心者質問スレだからって人に教えを請う態度ぐらい身につけて下さい。
0787nobodyさん2006/01/15(日) 22:10:49ID:???
無知?お前じゃんw
0788nobodyさん2006/01/15(日) 22:12:37ID:???
今ここで煽りあってるのは、偉そうにいえるほど効果的なのを組める人ばかりなの?
0789nobodyさん2006/01/15(日) 22:14:36ID:???
うん、そうだよ
0790nobodyさん2006/01/15(日) 22:21:26ID:???
脳内プロフェッショナルな子供が罵りあうスレと聞いて飛んできました
0791nobodyさん2006/01/15(日) 22:22:30ID:???
お手本プリーズ
0792nobodyさん2006/01/15(日) 22:39:08ID:???
居ないみたいだし>>772がこのスレの限界ということだな。丸く収まったじゃないか。
0793nobodyさん2006/01/15(日) 22:41:17ID:???
めっちゃグローバル変数
0794nobodyさん2006/01/15(日) 22:48:33ID:???
ちょっと組むぐらいならグローバル変数でも十分なんじゃ?
0795nobodyさん2006/01/15(日) 22:59:10ID:???
基本は>>772でいいんじゃないの?
突っ込みどころが数箇所あるけど
0796nobodyさん2006/01/15(日) 23:01:47ID:???
初心者の俺から見ると普通に>>772でいいように見える。
ダメだと言ってる人、折角だから完璧なモノに改造してくれないか?
参考にするから。
0797nobodyさん2006/01/15(日) 23:09:01ID:???
そだね
偉そうに言ってる人が>>772を改造して結果を出せば「ごもっともな意見です」といえるんだけど
0798nobodyさん2006/01/15(日) 23:22:09ID:???
書き直す技量がないから静かになったw
0799nobodyさん2006/01/16(月) 00:02:12ID:???
攻撃されてた人カワイソスwww
0800nobodyさん2006/01/16(月) 00:52:24ID:???
>>772の作ったスクリプトに、でかいサイズの動画でも送りつけると楽しいことになりそうだ。
掲示板なら、投稿するリンクを2chに貼るのもいいか。
0801nobodyさん2006/01/16(月) 01:00:09ID:???
それと、脆弱性とは私は呼んでないけど、
同じ名前を持つパラメータを送ると、
後から送られたデータに上書きされるよね。
0802nobodyさん2006/01/16(月) 01:03:07ID:???
>801
>マルチプル、マルチパートなんて使わない
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0803nobodyさん2006/01/16(月) 01:04:48ID:???
誰か例のモジュールとのDiffとって貼っといて
0804nobodyさん2006/01/16(月) 01:10:39ID:???
指摘してるほうも馬鹿ばっか。
子供が意気がるのも道理だな。
0805nobodyさん2006/01/16(月) 01:12:46ID:???
>800
そのまえにサーバーでエラーにならない?
全部のサーバーがどんだけのサイズを許可してるかわからんけど受信サイズの制限ぐらいはあると思う
0806nobodyさん2006/01/16(月) 01:17:03ID:???
面白そうなのに。
もっと熱い奴ギボン。
0807nobodyさん2006/01/16(月) 01:25:42ID:???
>>805
まあ、そうなんだけど、実際にサーバが許してるサイズが分からないしね。
アップローダを見ていると、32M程度なら許していそうな所もあるし、
それでDOS攻撃仕掛けるとかね。
0808nobodyさん2006/01/16(月) 01:29:57ID:???
揚げ足鳥じゃなくて、こうすればOKって例出したほうが早いのでは。
0809nobodyさん2006/01/16(月) 02:33:58ID:???
それが出せるヤシが残念ながらこのスレには誰一人として存在しない
0810nobodyさん2006/01/16(月) 02:40:28ID:???
荒れるのが明らかだから提示しないだけかと
0811nobodyさん2006/01/16(月) 02:40:45ID:???
>798から改良ソース出てないし結局は底辺が底辺に教えを乞うスレ
0812nobodyさん2006/01/16(月) 02:41:24ID:???
と底辺が解説するスレ
0813nobodyさん2006/01/16(月) 02:41:38ID:???
例を出して即荒れるとしか考えが出ないお前のネット人生って(ノ∀`)
08147732006/01/16(月) 02:44:44ID:???
なんだこの荒れ具合は
>>774
http://pc8.2ch.net/test/read.cgi/tech/1134327348/590
全部コピペで日本語一文字付け足していませんが何か
0815nobodyさん2006/01/16(月) 02:50:52ID:???
他のスレでも書いてたのか
なにもそんな不自由な日本語を色んなところで自ら晒さなくても・・・
08167732006/01/16(月) 02:57:22ID:???
どう解釈すれば俺がそのレスを書いたことになるのかと
0817nobodyさん2006/01/16(月) 02:59:17ID:???
それすらも考えられないぐらい日本語不自由なのかorz
0818nobodyさん2006/01/16(月) 03:02:36ID:???
パンチ5分の2再来の予感
0819nobodyさん2006/01/16(月) 03:08:12ID:???
埋め
0820nobodyさん2006/01/16(月) 03:09:32ID:???
埋め
0821nobodyさん2006/01/16(月) 03:10:17ID:???
梅
0822nobodyさん2006/01/16(月) 03:11:20ID:???
生目
0823nobodyさん2006/01/16(月) 03:12:08ID:???
右芽
0824nobodyさん2006/01/16(月) 03:13:03ID:???
宇目
0825nobodyさん2006/01/16(月) 03:14:17ID:???
鵜雌
0826nobodyさん2006/01/16(月) 03:15:59ID:???










        (´・ω・`)











0827nobodyさん2006/01/16(月) 03:17:08ID:???
浮召
0828nobodyさん2006/01/16(月) 03:18:52ID:???
呻
0829nobodyさん2006/01/16(月) 03:19:34ID:???
>816
荒らすのはやめれ!
0830nobodyさん2006/01/16(月) 07:55:23ID:???
>>807
受信サイズの制限ってよりも、割り当て可能なメモリに制限って感じだな。サーバー側でかける制限は。
んで、そんな制限をかけてないサーバーに1GBほどをPOSTすると、この行で大変なことになる。
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

効率優先で俺様ロジックするのもいいけど、
小手先でやるくらいならモジュール使って安全を買うのもありかと。

ときどき変なスレの伸び方するなぁ。
0831nobodyさん2006/01/16(月) 08:21:36ID:???
問題があるでだけで終わらすと、またそれに対して質問がくるよw
先に$ENV{'CONTENT_LENGTH'}で受信サイズを調べろってことですな
0832nobodyさん2006/01/16(月) 12:41:16ID:???
1GBも来たらhttpdが先にあぼーんする悪寒
0833nobodyさん2006/01/16(月) 12:57:23ID:eJEL1pbq
php+pearで
server.php
<?
require_once 'XML/RPC/Server.php';
$map = array('test' => array('function' => 'test') );
$svr = new XML_RPC_Server($map);
function test($param) {
return new XML_RPC_Response(new XML_RPC_Value('OK'), "string");
}
?>

client.php
<?
require_once("XML/RPC.php");
$value = new XML_RPC_Value(
array("test" => new XML_RPC_Value("test", 'string')),'struct');
$msg = new XML_RPC_Message('test', array($value) );
$client = new XML_RPC_Client("/", "example.com", 80);
$response = $client->send($msg);
echo $contents = XML_RPC_decode( $response->value()) ;

では、問題なく動作するのですが、クライアントをperlで
#!/usr/bin/perl -w
use XMLRPC::Lite;
my $rpc = XMLRPC::Lite->new;
my $url = 'http://example.com/';
my $contents;
$rpc->proxy($url);
my $res = $rpc->call( "test",{ test => "test" });
print $contents = $res->result;
とすると、Unknown methodになります。
どこが間違っているのでしょうか?
0834nobodyさん2006/01/16(月) 13:00:39ID:???
言ってる通りだと思うけど
Perl のコードを落ち着いて読む
0835nobodyさん2006/01/16(月) 13:39:55ID:???
文字数制限もデコードも一PHPで全部解決!!!!!!!!1111
0836nobodyさん2006/01/16(月) 15:15:58ID:???
なんつーか mod_uploader でも使ってろ。
08378332006/01/16(月) 16:12:07ID:eJEL1pbq
rubyで、
 require "xmlrpc/client"
 server = XMLRPC::Client.new( "example.com", "/")
 begin
  p server.call("test", 10)
 rescue XMLRPC::FaultException => err
  p err.faultString
 end
でも、"Unknown method"ですね。phpがおかしいのかな。
0838nobodyさん2006/01/16(月) 16:54:29ID:???
マルチ死ね
0839nobodyさん 2006/01/16(月) 16:58:09ID:???
sage
0840nobodyさん2006/01/16(月) 16:58:39ID:???
sage
0841& ◆O45QsmDUy. 2006/01/16(月) 17:04:26ID:???
sage
0842& ◆Z2KySTSpOo 2006/01/16(月) 17:05:04ID:???
sage
0843nobody& ◆k0eA9hHNm2 2006/01/16(月) 17:07:18ID:???
sage
0844& ◆O45QsmDUy. 2006/01/16(月) 17:09:23ID:???
sage
0845nobodyさん2006/01/16(月) 17:54:10ID:???
>>833
問題なさそうだけど。

それと、サーバーのResponseの部分はこうじゃない?
return new XML_RPC_Response(new XML_RPC_Value('OK', 'string'));
0846nobodyさん2006/01/17(火) 00:08:41ID:???
文字変換について質問なのですが、
全角カタカナ・英数字・記号を、半角にしたいと思っているのですが、
どうしても 「(」と「!」が同じように処理されてしまって困っています。

s/!/!/gi;
s/(/(/gi;

とやると、全角の ( まで、半角の ! となってしまいます。
解決策はございますでしょうか?
よろしくお願いします。
0847nobodyさん2006/01/17(火) 00:21:01ID:???
CGI.pmを使用して form を作成すると
<input type="hidden" name=".cgifields" value="test" />
といった hiddenタイプの.cgifieldが作成されます。

perldoc CGI を読むと、-nosticky プラグマで抑制可能と言うことは書いてあるのですが、
何のために使用されているものなのかわかりません。

この .cgifield は何のためにあるのでしょう?
0848nobodyさん2006/01/17(火) 01:00:44ID:???
>772 をモジュール使って書くとこんなかんじ?
use strict;
use CGI;
use CGI::Util;
$CGI::POST_MAX=1024;
my $q=CGI->new;
my %in=CGI->Vars;
CGI::Util::unescape($_) for (values %in);

プログラム板のhttp://pc8.2ch.net/test/read.cgi/tech/1134327348/580 のマネしただけだけど。
正直、初心者なんで、ツッコミ頼む。
08498482006/01/17(火) 01:17:44ID:???
スマソ。>848は試しに動かしたらエラー出たので修正版。

use strict;
use CGI qw/:cgi/;
$CGI::POST_MAX=1024;
my $q=CGI->new;
my %in=$q->Vars;
CGI::Util::unescape for (values %in);
0850nobodyさん2006/01/17(火) 01:37:37ID:???
>846
もし、perl5.8.0 以上なら、
use encoding 'shift-jis';
でOK
0851nobodyさん2006/01/17(火) 01:43:26ID:???
>848
どうやって斜め読みしたら「モジュールを使って書く」って読めるんだ?
結局は日本語を読めない奴が増えただけかよ
0852nobodyさん2006/01/17(火) 01:56:42ID:???
>848
たかがデコードごときにモジュールなんてつかってんじゃねーよ。
モジュールなんていらねーってコトの証明のために書いてんだよ。バーカ
0853nobodyさん2006/01/17(火) 01:58:28ID:???
モジュール使わずに、わざわざ同じようなルーチンを手書きする必要って何だろう?
頭大丈夫?
0854nobodyさん2006/01/17(火) 02:01:26ID:???
>>846
/i オプションを付けない。

>>847
perldoc CGI に書いてある。
http://search.cpan.org/~lds/CGI.pm-3.15/CGI.pm#nosticky
古いヴァージョンのドキュメントには明記されていないかも知れないが。

>>848-849
CGI::Util::unescape() は渡された文字列を percent-decode して返す
関数なので CGI::Util::unescape for (values %in); では戻り値を捨てて
いるだけ (%in の値は変化しない) し、CGI パッケージに輸出されている
から use CGI::Util; しなくても CGI->unescape() と呼べるし、そもそも
param() や Vars() ではちゃんと percent-decode 済の値を返してくる
から後から unescape() する必要は無い。

use strict;
use CGI ();
$CGI::POST_MAX = 1024; # 1KB
my %in = CGI->new->Vars;
0855nobodyさん2006/01/17(火) 02:02:59ID:???
個人的には>>772みたいにスコープ無視なサブルーチンはごめん被りたいところだね。
0856nobodyさん2006/01/17(火) 02:04:37ID:???
>>854
> ヴァージョン

なんて書くやつはばかです。

> パッケージ

どうせなら、パッケイジって書けばいいのに。
0857nobodyさん2006/01/17(火) 02:07:12ID:???
>851
>結局は日本語を読めない奴が増えただけかよ
激しく同意。
851 には >797,>808 が読めないんだからな
0858nobodyさん2006/01/17(火) 02:11:07ID:???
> 851 には >797,>808 が読めないんだからな

ということにしたいのですね。
0859nobodyさん2006/01/17(火) 02:14:53ID:???
>858
それ3つとも俺w
俺じゃ出来ないから出来る人の改良ソースを待ってるわけでですよ。
0860nobodyさん2006/01/17(火) 02:19:58ID:???
851=797=808 ?
だとすると、851 はモジュール使わない改良ソースを待っているのか?
0861nobodyさん2006/01/17(火) 02:26:34ID:???
だから書けないから待ってるとw
0862nobodyさん2006/01/17(火) 02:29:47ID:???
モジュールを使う派 vs モジュールを使わない派 の議論だと思ってたが違うのか?
0863nobodyさん2006/01/17(火) 02:39:01ID:???
議論するくらいならそこはモジュール使うことにしておいて
空いた時間で他の生産的な事をしろ、ってのがPerlだと思う。
0864nobodyさん2006/01/17(火) 02:43:40ID:???
>863
プログラミングはすべてそうだと思うけど…
■ このスレッドは過去ログ倉庫に格納されています