Perlコーディング初心者質問スレ Part 45
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001988
2005/12/08(木) 22:48:27ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0809nobodyさん
2006/01/16(月) 02:33:58ID:???0810nobodyさん
2006/01/16(月) 02:40:28ID:???0811nobodyさん
2006/01/16(月) 02:40:45ID:???0812nobodyさん
2006/01/16(月) 02:41:24ID:???0813nobodyさん
2006/01/16(月) 02:41:38ID:???0814773
2006/01/16(月) 02:44:44ID:???>>774
http://pc8.2ch.net/test/read.cgi/tech/1134327348/590
全部コピペで日本語一文字付け足していませんが何か
0815nobodyさん
2006/01/16(月) 02:50:52ID:???なにもそんな不自由な日本語を色んなところで自ら晒さなくても・・・
0816773
2006/01/16(月) 02:57:22ID:???0817nobodyさん
2006/01/16(月) 02:59:17ID:???0818nobodyさん
2006/01/16(月) 03:02:36ID:???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:???荒らすのはやめれ!
0830nobodyさん
2006/01/16(月) 07:55:23ID:???受信サイズの制限ってよりも、割り当て可能なメモリに制限って感じだな。サーバー側でかける制限は。
んで、そんな制限をかけてないサーバーに1GBほどをPOSTすると、この行で大変なことになる。
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
効率優先で俺様ロジックするのもいいけど、
小手先でやるくらいならモジュール使って安全を買うのもありかと。
ときどき変なスレの伸び方するなぁ。
0831nobodyさん
2006/01/16(月) 08:21:36ID:???先に$ENV{'CONTENT_LENGTH'}で受信サイズを調べろってことですな
0832nobodyさん
2006/01/16(月) 12:41:16ID:???0833nobodyさん
2006/01/16(月) 12:57:23ID:eJEL1pbqserver.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:???0836nobodyさん
2006/01/16(月) 15:15:58ID:???0837833
2006/01/16(月) 16:12:07ID:eJEL1pbqrequire "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:???0840nobodyさん
2006/01/16(月) 16:58:39ID:???0841& ◆O45QsmDUy.
2006/01/16(月) 17:04:26ID:???0842& ◆Z2KySTSpOo
2006/01/16(月) 17:05:04ID:???0843nobody& ◆k0eA9hHNm2
2006/01/16(月) 17:07:18ID:???0844& ◆O45QsmDUy.
2006/01/16(月) 17:09:23ID:???0845nobodyさん
2006/01/16(月) 17:54:10ID:???問題なさそうだけど。
それと、サーバーの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:???<input type="hidden" name=".cgifields" value="test" />
といった hiddenタイプの.cgifieldが作成されます。
perldoc CGI を読むと、-nosticky プラグマで抑制可能と言うことは書いてあるのですが、
何のために使用されているものなのかわかりません。
この .cgifield は何のためにあるのでしょう?
0848nobodyさん
2006/01/17(火) 01:00:44ID:???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 のマネしただけだけど。
正直、初心者なんで、ツッコミ頼む。
0849848
2006/01/17(火) 01:17:44ID:???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:???もし、perl5.8.0 以上なら、
use encoding 'shift-jis';
でOK
0851nobodyさん
2006/01/17(火) 01:43:26ID:???どうやって斜め読みしたら「モジュールを使って書く」って読めるんだ?
結局は日本語を読めない奴が増えただけかよ
0852nobodyさん
2006/01/17(火) 01:56:42ID:???たかがデコードごときにモジュールなんてつかってんじゃねーよ。
モジュールなんていらねーってコトの証明のために書いてんだよ。バーカ
0853nobodyさん
2006/01/17(火) 01:58:28ID:???頭大丈夫?
0854nobodyさん
2006/01/17(火) 02:01:26ID:???/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;
0857nobodyさん
2006/01/17(火) 02:07:12ID:???>結局は日本語を読めない奴が増えただけかよ
激しく同意。
851 には >797,>808 が読めないんだからな
0858nobodyさん
2006/01/17(火) 02:11:07ID:???ということにしたいのですね。
0859nobodyさん
2006/01/17(火) 02:14:53ID:???それ3つとも俺w
俺じゃ出来ないから出来る人の改良ソースを待ってるわけでですよ。
0860nobodyさん
2006/01/17(火) 02:19:58ID:???だとすると、851 はモジュール使わない改良ソースを待っているのか?
0861nobodyさん
2006/01/17(火) 02:26:34ID:???0862nobodyさん
2006/01/17(火) 02:29:47ID:???0863nobodyさん
2006/01/17(火) 02:39:01ID:???空いた時間で他の生産的な事をしろ、ってのがPerlだと思う。
0864nobodyさん
2006/01/17(火) 02:43:40ID:???プログラミングはすべてそうだと思うけど…
0865nobodyさん
2006/01/17(火) 02:48:02ID:???どなたか最適なデコード方法教えてください>w<
0866nobodyさん
2006/01/17(火) 02:52:10ID:???いや、この板には
・モジュールは重くて邪魔だ。
・これまでモジュールを使ってこなかったが、困らなかった。
・実は、オブジェクトがなんなのかわからないんだけど、分からないことがばれると恥ずかしい
等、様々な理由で、モジュール使いたがらない人たちが多いのですよ。
0867nobodyさん
2006/01/17(火) 02:57:37ID:???ソレダ!
0868nobodyさん
2006/01/17(火) 03:05:48ID:???というかイマイチ有用性がわからんのもある
0869nobodyさん
2006/01/17(火) 03:06:00ID:???0870nobodyさん
2006/01/17(火) 03:08:19ID:???0871nobodyさん
2006/01/17(火) 03:30:52ID:???伝家の宝刀は「このスレは回答者も初心者なんですね」。
この文句には注意な。
0872nobodyさん
2006/01/17(火) 03:56:07ID:???> 等、様々な理由で、モジュール使いたがらない人たちが多いのですよ。
mod_perl とか fastcgi とか lighttpd とか使えないような、
貧乏仕様の ISP 貸し出し環境の人が多いということですか。
それとも、cgi を呼ぶと必ずモジュールのロードからするものが Perl だ
とか思ってるんかな。
0873nobodyさん
2006/01/17(火) 03:56:35ID:???自分が必要としていない物の有用性を幾ら説かれても理解には至らんよ。
コードに対する要求レベルは人それぞれで、KENT で充分だと感じる人も
いれば、CPAN にあるモジュールはどれも汚くて書き直したくなる、という
人もいる。この二者が納得するコードなんて書きようがないし、より高い
レベルを要求する事が常に正しいとは限らない。
だから妥協点として、公式マニュアル (perldoc) に書かれている事を指針
にしときましょう、というのが現実的な解。perldoc が難解だと感じるなら
Perl コミュニティ的に「平均」より下。perldoc すら甘いと考えているなら
厳しすぎ。
0874nobodyさん
2006/01/17(火) 03:59:27ID:???そもそもレベルの高低の客観的な評価基準きぼん。
> だから妥協点として、公式マニュアル (perldoc) に書かれている事を指針
> にしときましょう、というのが現実的な解。
それは、どこらへんの「現実」?
> perldoc が難解だと感じるならPerl コミュニティ的に「平均」より下。
それは、どこらへんの「Perl コミュニティ」?
「平均」の算出方法も明確にしておいてね。
0875nobodyさん
2006/01/17(火) 04:06:01ID:???0876nobodyさん
2006/01/17(火) 04:07:20ID:???0878nobodyさん
2006/01/17(火) 04:09:44ID:???0879nobodyさん
2006/01/17(火) 04:10:26ID:???0880nobodyさん
2006/01/17(火) 04:21:05ID:???0881nobodyさん
2006/01/17(火) 04:25:26ID:???0882nobodyさん
2006/01/17(火) 04:27:54ID:???0883nobodyさん
2006/01/17(火) 04:29:40ID:???伝家の宝刀は「このスレは回答者も初心者なんですね」。
この文句には注意な。
0884nobodyさん
2006/01/17(火) 04:57:07ID:tDsfmN2qPerl内でPHPを使用するにはどうすれば良いでしょうか?
0885nobodyさん
2006/01/17(火) 04:57:28ID:???話の流れが理解できているなら、ソースを待っていても、>854 以上のものは出ないことは明白。
待ってても無駄だよ。
0886nobodyさん
2006/01/17(火) 05:00:18ID:???「表示されるHTMLにPHPを使用したいので」
のところが意味不明。
いったい何をprint等で記述したか書いてごらん。
0887nobodyさん
2006/01/17(火) 05:20:40ID:???「>772をまずはこうやって・・・次にこうやって・・・」であれば>772のどこが悪いってのわかりますよね?
ちなみに>772は私がstrictで書く前の代物だったりします (書き直したものはstrictでとりあえず動いてるもののエラーチェックは細かくやってない)
ツッコミどころ云々とか言うだけ言って改良案すらも出ないのかなと
(出たのはread()に関するとこだけ)
ここが上級者スレならスルーはわかるけど・・・
>886
>884は print "echo $char\n"; とか出力して、PHP の echo の動作しない
というのが言いたいと思う
>884
無理かと
perlでPHPのファイル出力してそれをクリックさせるか、CGIとして出力したPHPファイルをperlから呼び出すかぐらいじゃないでしょか?
というか、そもそもそんなことやる必要があるんですか? 無駄だと思うのですが・・・
0888nobodyさん
2006/01/17(火) 05:53:42ID:???でPHPに埋め込むのではいかんのか
0889nobodyさん
2006/01/17(火) 05:59:37ID:???ちょwwwさりげなく俺の発言まで自分の発言にするなよw
>>808はお前が書いたんじゃないだろ。
他のは知らないが。
0890nobodyさん
2006/01/17(火) 06:16:16ID:???先に、hoge.php があるのなら、
print qx[php "hoge.php"]
phpスクリプトを生成するなら
my $php_code='echo "$char\n";';
print qx[php -r "$php_code"];
で何とかなるかもwww
0891nobodyさん
2006/01/17(火) 06:28:38ID:???人に文句付ける前に、お前が改良案出してやれよ。
>>884
やりたいことが>>887の通りだとしたら、
出来ないことはないけど、お勧めしない。
PHPはCLI版またはCGI版があることが条件で、
CLI版の場合はあらかじめヘッダを出力してあげること。
# print "Content-type: text/html\n\n";
open(PHP, "| /usr/local/bin/php") or die;
select(PHP);
print while(<DATA>);
close(PHP);
exit;
__END__
<?
echo "hello, world!";
?>
0894nobodyさん
2006/01/17(火) 09:06:52ID:???sub decode {
my ( $buffer, %in );
if($ENV{'REQUEST_METHOD'} eq 'POST'){
if( $ENV{'CONTENT_LENGTH'} > 1024 ) { die 'CONTENT_LENGTH error' }
binmode(STDIN);
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}elsif($ENV{'REQUEST_METHOD'} eq 'GET'){
$buffer = $ENV{'QUERY_STRING'};
}else{ die 'REQUEST_METHOD error' }
my @pairs = split(/&/, $buffer);
foreach my $pair (@pairs) {
my ($name,$value) = split(/=/,$pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$in{$name} = $value;
}
return %in;
}
0895nobodyさん
2006/01/17(火) 09:16:43ID:nYyzHE1Cメールフォームを利用したページを作っているんですが、
記入漏れがあった時、エラーを表示するようにPERLでプログラムしていて
前のページへ戻ると全て入力したものが消えています。
携帯電話でアクセスした場合、メールフォームに入力したデータが
キャッシュに残っていないのは仕方のないことなのでしょうか?
これはCGIのほうで、どうにかするべき問題ですか?
それともHTMLの記述の中でデータ入力したもののキャッシュを
残すように出来るのでしょうか?
0896nobodyさん
2006/01/17(火) 09:24:09ID:???その記入用画面をまた表示する。その際、
・ページ冒頭で記入漏れがある旨を伝え、それを埋めるように催促する
・正しいデータが送られた部分にはそのデータを初期値として表示
・正しくないデータの部分にはそれと分かるように印をつけて空欄で表示
として、記入漏れのあるところだけ埋めてもらうようにするのがいい。
0897nobodyさん
2006/01/17(火) 09:55:43ID:nYyzHE1Cなるほど、引き渡した変数をそのまま利用して、記入漏れの箇所に対してのみ
再度入力を求める形にすればいいということですね。
ただ気になるのが、きっと print ""; を使うことになると思いますが、
例えば名前が 山田 太郎 と入力されたものとして、
年齢が未入力だった場合、どういう記述の方法をとりますか?
名前の箇所の 山田太郎 は正しかったものとして
ただHTMLで文字として表示させて
未入力だった箇所の年齢は 再度入力ボックスを出すという形ですか?
また変数を、こういう形で受け継がせる方法に最適な案などご存知でしたら
ぜひご教授ください
0899nobodyさん
2006/01/17(火) 12:21:24ID:???0900nobodyさん
2006/01/17(火) 12:29:07ID:???unless(
-e $file and
-f $file and
-r $file and
-w $file
) {
print 'NG';
}
のようにファイルがあるか⇒ファイルか⇒読み書き込み可能か
と全部チェックすべきでしょうか?
それとも、-r, -w のみのチェックでも大丈夫でしょうか?
0901nobodyさん
2006/01/17(火) 12:45:01ID:???-f が真になるなら -e は常に真。
無駄なシステムコールを省く為、二つ目以降は _ を使う。
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item__i__X__i__FILEHANDLE
よって unless (-f $file && -r _ && -w _) { ... }
0902900
2006/01/17(火) 12:57:57ID:???下線だけからなる特別なファイルハンドルがあるとは知りませんでした。。。
非常に勉強になりました。
ありがとうございす。
0903nobodyさん
2006/01/17(火) 13:00:56ID:???またもや、項目を入力可能にしておくとは言えども、
前ページで入力したデータが エラーの出たとこ以外には
デフォで入ってる状態で表示させるんですよね?
HTMLでそんなタグありましたっけ?
0904nobodyさん
2006/01/17(火) 13:07:33ID:???0905nobodyさん
2006/01/17(火) 13:11:38ID:nYyzHE1C0906nobodyさん
2006/01/17(火) 13:14:18ID:???<input value=hensuu>
のvalueとこに変数を渡して、そのまま
print ""; 使ってHTML出力してしまえば、前ページで入力したデータが
デフォで入ってる状態になるところまでは分かったのですが、
checkboxやselect typeだと出来なくないですか?
0907nobodyさん
2006/01/17(火) 13:27:43ID:???0908nobodyさん
2006/01/17(火) 13:33:08ID:???<select NAME="県別" SIZE="1">
<option VALUE="北海道">北海道</option>
<option VALUE="青森県">青森県</option>
<option VALUE="岩手県">岩手県</option>
<option VALUE="宮城県">宮城県</option>
<option VALUE="秋田県">秋田県</option>
<option VALUE="山形県">山形県</option>
<select>
前ページで
「北海道」を選んでいたが、 メアドの項目でエラー出たとき
県別のvalueに与えられていた”北海道”のデータを そのまま引き継ぐには
selectedを使って、どうのような方法がありますか?
レス数が900を超えています。1000を超えると表示できなくなるよ。