Perlコーディング初心者質問スレ Part 46
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/01/18(水) 02:17:46ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0666nobodyさん
2006/02/14(火) 17:31:14ID:???サンプルコードなどで適当に変数名をつけるときに使う
英語ではfooやbarが使われるのでfoo,barについてはrfcにもなっている
ほげ学のサイトがあるので探してみ
0667nobodyさん
2006/02/14(火) 18:13:45ID:???つ【アクセスログ】
0670nobodyさん
2006/02/14(火) 21:32:00ID:???コントロールコードを拒否したければ
\x0-\x1f の範囲でオケなのかな?
0671nobodyさん
2006/02/14(火) 22:37:15ID:mb5R1R6vPerlで作ったおみくじCGIをサイトに置いたんですが
わたしのサイトに来てくださる人の携帯(DoCoMo)では動作しないって言われました
それでわたしも携帯で動作を確認するとやっぱり動きませんでした
PCでは問題なく動作するのですが携帯向けには何かしなければならないのでしょうか?
>>8-で紹介されているサイト様も見てみたんですが書いてありません
詰まってしまいました
どなたか原因が分かりますでしょうか?
0672nobodyさん
2006/02/14(火) 22:52:06ID:???http://pc8.2ch.net/test/read.cgi/tech/1138519327/395
レスもらってるんだから、調べてからにして下さい。
動作しない、だけでは解決のしようがありません。
0673nobodyさん
2006/02/14(火) 23:13:17ID:mb5R1R6vすいません、そこにもないです
それからレスはhttp://pc8.2ch.net/test/read.cgi/tech/1138519327/395
で誘導されたので気づきませんでした
0674nobodyさん
2006/02/14(火) 23:20:59ID:???誘導してもらってるのに、全然読んでないことだけは分かった。
シュミレータで確認汁。
それと、動かないだけじゃわかりません。
0675nobodyさん
2006/02/15(水) 00:01:00ID:???○ シミュレート
ここもゆとりんぐ全開かwww
0676nobodyさん
2006/02/15(水) 00:02:40ID:TfAwMHcm名前を入力してもらいボタンを押すと運勢が出るという
おみくじCGIでPOSTメソッドです
携帯だとボタンが押せない状態なんです
0677nobodyさん
2006/02/15(水) 00:06:18ID:???企業でも普通に使ってるみたいw
0678nobodyさん
2006/02/15(水) 00:13:03ID:???ゆとりんぐは勉強してろ
0680nobodyさん
2006/02/15(水) 00:19:54ID:???0681nobodyさん
2006/02/15(水) 01:05:24ID:???0682664
2006/02/15(水) 01:44:50ID:AsKZTDBda.cgiのボタンを押す->入力されたデータにエラーが無いかチェック
0.エラー -> a.cgi でエラー表示
1.エラーがない ->a.cgiでBingo表示
0の状態でF5押しまくってると1の画面が表示されてしまいます。
a.cgiで結果を表示させるのが、そもそもの間違いなのでしょうか?
0683664
2006/02/15(水) 01:57:37ID:???入力されたデータにエラーが無いかチェック
に内在バグがきっとあるに違いない。という方向でちょっとダイブしてきまつ。
0684nobodyさん
2006/02/15(水) 03:37:26ID:???0686nobodyさん
2006/02/15(水) 10:29:13ID:???それって、二バイト文字の1btyle目のコードですよね。
組み込んでみます。
ちなみにこういうのって一覧表のあるサイトってありますか?
今は、IMEパッドで見てるんですが、なんか微妙に異なるようですので。
0687nobodyさん
2006/02/15(水) 11:13:19ID:???漏れはいつもここを薦めている。変換則も(Cが少々読めれば)わかるし
ttp://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/kanjicod.html
UTF-8についてはRFCを読んで調べたけど解説しているサイト無いかな…
0688nobodyさん
2006/02/15(水) 15:21:01ID:PmYHM0Bw分かる方がおりましたら教えてください。
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 "ここは出力されない";
0689nobodyさん
2006/02/15(水) 15:29:27ID:???0690nobodyさん
2006/02/15(水) 16:11:29ID:RdFiluwLソースを見なきゃ分からんようなCONTENT_LENGTHのことだと
も気づかないアフォは発言すべきじゃないな。
>>686
~ /[\x81-\xff][\x40-\xff]/ ←これで全角全て拾える
0692nobodyさん
2006/02/15(水) 16:52:35ID:???だから、HTML見直せとiモードの解説サイト貼ってあるのにw
0693nobodyさん
2006/02/15(水) 17:03:26ID:???-1を吐いた場合ですら表示できる。
0694nobodyさん
2006/02/15(水) 17:15:35ID:???httpd が補完してくれるのでプログラム側で吐く必要は無い。
むしろ陽に吐いた方が、自動広告挿入などでサイズが変わる
場合に不具合の元となる。
0696nobodyさん
2006/02/15(水) 18:27:23ID:???> 少なくとも Apache で CGI 経由なら、Content-Length ヘッダはhttpd が補完してくれるので
ホント?
0697nobodyさん
2006/02/15(水) 20:25:22ID:???はまってしまっております。
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;
0698nobodyさん
2006/02/15(水) 22:48:50ID:OyUmOolC× subloadFormdata
○ sub loadFormdata
0699nobodyさん
2006/02/15(水) 23:28:35ID:???書き方はあってるみたいだけど、なんだろうね。
SocketがもしかしたらSSL通信に対応していないのかもしれない。
しかし確証はない
0700nobodyさん
2006/02/15(水) 23:32:33ID:PmYHM0Bwとやるとフォームのデータが表示されるのですが、
$value = "hogehoge";
print $FORM{'$value'};
とやると何も表示されません。
hogehogeを変数にして、$FORM{'hohehoge'}と同じ内容のものが表示されるようにするにはどのようにしたらよいでしょうか
0701nobodyさん
NGNG○ print $FORM{$value};
0702nobodyさん
2006/02/15(水) 23:46:37ID:???print $FORM{"$value"};
だね。
0703697
2006/02/16(木) 00:29:46ID:???ご返答有難うございます。
サーバを変えてみたのですが、やはり同じBad Requestが
返ってきてしまうというのが現状です。
もう少し頑張ってみます。
状況が変わり次第ご報告とさせていただきます。
0704700
2006/02/16(木) 00:43:41ID:P0dyMCanすいません。ハマってました^^;
ありがとうございました!
0705nobodyさん
2006/02/16(木) 02:26:31ID:???SocketでSSL通信やるなら自前で暗号化をやらなきゃならないが、そのコードはどこにあるのかね?
俺ならSocketでやるなんて大それたこと考えずに迷わずLWP。
>>699
わからないなら、それであってるとか、いい加減な回答しないで引っ込んでろよ。
0706nobodyさん
2006/02/16(木) 12:37:14ID:ZVhjliSj&ReadParse;
として、%inを多様しているスクリプトがあります。
これをCGI.pmへ変更したいのですが
$in{'name'}
↓
$q->param('name')
という変更をしないで$in{'name'}のまま使うには
どのような記述をすれば良いのでしょうか。
$incfnも利用しているので、こちらの対処方法もお願いします。
0707nobodyさん
2006/02/16(木) 14:06:48ID:???cgi-libでいいじゃん。
君には十分だよ。
0709nobodyさん
2006/02/16(木) 14:29:23ID:???言語切り替えが出来るように作ってあるページで、
フランス語なんかに言語を切り替えると文字化けして、その文字化けがタグを侵食したり
して表示が崩れたりします。フランス語やドイツ語を扱う時に注意する点ってどういうとこ
だか、誰かアドバイスもらえませんか?
ページは全部Perlで組んでます。
0710nobodyさん
2006/02/16(木) 14:40:42ID:???0711nobodyさん
2006/02/16(木) 19:00:13ID:???<form action=aaa.cgi>
<input type=submit value=更新>
</form>
としているのですが、これだとボタンをクリックすると画面がaaa.cgiに移動してしまいます。
画面が一切変化しないでaaa.cgiを動かすにはどうすればよいでしょうか?
0716nobodyさん
2006/02/17(金) 00:28:06ID:???perldoc CGIの「FETCHING THE PARAMETER LIST AS A HASH」という項目を読め。
0717676
2006/02/17(金) 00:50:26ID:LOkWB/9eこんなソースです↓
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では大丈夫ですが携帯では表示はしても反応なしです
どなたかフォローお願いします
0718nobodyさん
2006/02/17(金) 00:52:34ID:???print <<EOS;
"Content-Type: text/html; charset=Shift_JIS"
これおかしくね?
何でダブルクォートが・・
つか略すな。そこも大事だ。
0722nobodyさん
2006/02/17(金) 01:49:09ID:???お前はそれだけの情報で足りると思ってんのか?
エスパーさん向けだな。
つか>>719で萎えた。
名前の欄はちゃんと確認しようねボクちゃん。
0723nobodyさん
2006/02/17(金) 01:59:20ID:???0725nobodyさん
2006/02/17(金) 03:33:08ID:???0726nobodyさん
2006/02/17(金) 03:36:38ID:???悔しいのは分かるがContent-lengthも知らない香具師はとりあえず黙ってろ
最近アレだな、厨房っぽいのが常駐してんだな
0728nobodyさん
2006/02/17(金) 03:55:29ID:???0730nobodyさん
2006/02/17(金) 04:05:10ID:???0731nobodyさん
2006/02/17(金) 04:22:14ID:???0732706
2006/02/17(金) 04:51:48ID:RcUmmaVqありがとうございます。
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となってしまいます。
今まで調べて試行錯誤してみましたが、どうにもなりませんでした。
どなたかアドバイスを頂けないでしょうか。
0733nobodyさん
2006/02/17(金) 04:56:57ID:???0734706
2006/02/17(金) 04:58:30ID:RcUmmaVq<form action="./***.cgi" method="POST" ENCTYPE="multipart/form-data">
としております。
0735nobodyさん
2006/02/17(金) 06:13:19ID:???0736nobodyさん
2006/02/17(金) 09:20:24ID:???次からは独り言はチラシの裏にでも書いてね。
0740nobodyさん
2006/02/17(金) 17:48:02ID:???よく気が付いたなw
ちゃんと閉じられてなかっただけっていうオチかな?
でも最後にちゃんと閉じられなくてもスクリプトが終われば閉じられると思ったし、ん〜なんだろ
0741nobodyさん
2006/02/17(金) 17:51:12ID:???0742nobodyさん
2006/02/17(金) 17:55:00ID:???でもまあ $filename っていう変数名からして十中八九 read() の使い方間違えてるんだろうね。
0743nobodyさん
2006/02/17(金) 17:57:35ID:???read("d:\test.txt", $readduff, 1024);
みたいな使い方を想像してるのかな?
0744nobodyさん
2006/02/17(金) 21:15:59ID:???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 "";
}
}
0745nobodyさん
2006/02/17(金) 21:36:53ID:???0746nobodyさん
2006/02/17(金) 22:33:50ID:???$tmp = index( $text , 'title' );としました。
しかし、「title」だけではなく「TITLE」という文字の可能性もあり
そちらも同時に検索したいのですが、良い方法はありますか?
0747nobodyさん
2006/02/17(金) 22:38:03ID:???SSLeayはインストールさえしておけばLWPが自動的に
使用してくれると仕様書に書いてありましたが、認識に
相違がございますでしょうか。
0748nobodyさん
2006/02/17(金) 22:43:44ID:???正規表現こそがPerlの華。
$text =~ /title/i
だけどこれじゃ位置を知ることはできないから、使える用途はやや限られる。
多くの場合位置を知らなくても処理できるんだけどね。
本当にそれが現れる位置を知りたいなら、先に小文字に合わせてしまうという手がある
$tmp = index( lc $text , 'title' );
0750nobodyさん
2006/02/18(土) 00:16:59ID:???http://search.cpan.org/~nwclark/perl-5.8.8/pod/perlfunc.pod#pos_SCALAR__
$text = 'foo title bar tiTle, baz titlE foo Title, bar TITLE baz title';
print uc substr($text, pos($text) - 9, 4) while $text =~ /title/gi;
0751nobodyさん
2006/02/18(土) 00:19:21ID:???@-でわかるよ。
% perl -e '$text="aaaTitle"; $text =~ /title/i; print $-[0];'
3
0753nobodyさん
2006/02/18(土) 02:12:59ID: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
0754nobodyさん
2006/02/18(土) 02:18:16ID:???自分でやる気が無い人はスレ違い
http://pc8.2ch.net/test/read.cgi/php/1127916965/
0755nobodyさん
2006/02/18(土) 02:20:21ID:???おみくじCGIの方ですか
<form method="POST">
actionを指定しないと確かドコモじゃ実行できないんじゃなかったか。
つか普通に記述ミスだろ
0756nobodyさん
2006/02/18(土) 02:56:52ID:Hc0+hkLt記述忘れでした
ありがとうございました
0757nobodyさん
2006/02/18(土) 05:25:34ID:???0758nobodyさん
2006/02/18(土) 07:46:55ID:???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";
}
}
}
0761758
2006/02/18(土) 08:29:29ID:???すいません。goo辞書で確認してみたら自分が間違いでした。教示ですね。ありがとうございます。
で、質問のほうはどのようにしたらうまくいくのでしょうか。お願いします。
0762nobodyさん
2006/02/18(土) 08:38:48ID:???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;
0763nobodyさん
2006/02/18(土) 08:39:26ID:???for $i (0 .. $#list1){
$check[$i]= grep($list1[$i] eq $_, @list2);
}
0764nobodyさん
2006/02/18(土) 08:42:47ID:???> $check[$list1の内容]
早まるなっそんな馬鹿でかい数を配列の添え字に使ったら
すごい量のメモリが確保されるぞ
0765nobodyさん
2006/02/18(土) 11:31:58ID:???世の中こういうヘボだらけになって、メモリをガンガン使って欲しい。
■ このスレッドは過去ログ倉庫に格納されています