Perlコーディング初心者質問スレ Part 48
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/04/26(水) 18:00:50ID:RLbnve1J【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0153nobodyさん
2006/05/06(土) 08:42:44ID:???my $mode = get_mode();
my $action = [undef, \&do_1, \&do_2, \&do_3]->[$mode] or error();
$action->();
>>152
オブジェクト指向以外で、いい書き方ある?
0154nobodyさん
2006/05/06(土) 09:22:34ID:???どんな書き方をオブジェクト指向としたいのか明確にしてよ。
0155nobodyさん
2006/05/06(土) 09:29:06ID:???0156nobodyさん
2006/05/06(土) 09:47:31ID:???KENT 臭い書き方ということ?
0157nobodyさん
2006/05/06(土) 09:52:54ID:???if($mode eq 'write'){ &write; }
0158nobodyさん
2006/05/06(土) 09:59:47ID:???0159nobodyさん
2006/05/06(土) 10:38:27ID:???my $action = 'do_' . $cgi->param('action');
eval {
no strict 'refs';
$action->();
};
0160nobodyさん
2006/05/06(土) 10:46:49ID:???パッケージ作って、blessした変数を使う方法全般。
Perlっぽいとしたら、こんなのとか。
my $mode = get_mode();
my $do = "do_". $mode;
my $obj = Local_table->new();
$obj->$do();
exit;
package Local_table;
sub new { return bless {}, shift }
sub do_1 {}
...
sub AUTOLOAD {
use vars qw($AUTOLOAD);
my $self = shift;
my $name = $AUTOLOAD;
$name =~ s/.*:://;
error("not implemented $name");
}
sub DESTROY {}
# 書いてたら、>>159に似てる…。
0161nobodyさん
2006/05/06(土) 12:36:26ID:???渡された変数名の関数を呼べばKENT風に書かなくてもいいのか。 なるほど。
でも、存在しない関数を呼び出されそうな場合のトラップはどうすればいいだろ?
その関数が存在するか調べてたらKENT風に書くのと対して変わらんし・・
0162nobodyさん
2006/05/06(土) 13:46:28ID:???0163nobodyさん
2006/05/06(土) 14:37:39ID:???evalの中で関数呼び出して、evalを抜けた直後の$@がNULLだったらエラー無しか
なるほど
これはいいかもしんない
0165nobodyさん
2006/05/06(土) 15:13:21ID:???0166nobodyさん
2006/05/06(土) 15:40:56ID:???リファレンスを使うのはポインタでつまずくC言語みたいだし、
evalはうっかりダブルクォートで変数を使ったりするとアレな事があるし。
0167nobodyさん
2006/05/06(土) 15:44:49ID:???なんか不具合でも?
携帯だから調べらんねorz
0168nobodyさん
2006/05/06(土) 16:07:17ID:???このスレ的に糞レス。
上級者気取りのPerlerの腕自慢スレじゃないんだぞ☆
>>162-163
kwsk
0170nobodyさん
2006/05/06(土) 16:12:28ID:???0171nobodyさん
2006/05/06(土) 16:58:36ID:???0172nobodyさん
2006/05/06(土) 17:01:22ID:???0173nobodyさん
2006/05/06(土) 17:07:20ID:???0174nobodyさん
2006/05/06(土) 17:15:25ID:???0175nobodyさん
2006/05/06(土) 17:18:17ID:???0176nobodyさん
2006/05/06(土) 17:27:05ID:???別言語に移植しやすいように書くよう心がけてます
0177nobodyさん
2006/05/06(土) 17:29:31ID:???0178nobodyさん
2006/05/06(土) 17:37:48ID:???elsif ($mode eq 'test2') { &test2; }
elsif ($mode eq 'test3') { &test3;}
&main;
test.cgiにそのままアクセスされたらサブルーチンmainを表示
test.cgi?mode=test1でアクセスされたらサブルーチンtest1を表示したいのですが
実際やってみても全てmainが表示されてしまいます、どうしたらいいんでしょうか。。。
0179nobodyさん
2006/05/06(土) 17:40:22ID:y5pDzvYJ0180nobodyさん
2006/05/06(土) 17:40:52ID:qaiuXg8a&jcode::sjis($value);
とかやって、外から入ってきたデータの文字コードをshiftjisにしてますが、
これを今のEncodeモジュールを使って表現するとどうなるんでしょうか?
0182178
2006/05/06(土) 18:14:42ID:y5pDzvYJif ($mode eq 'test1') { &test1; }
elsif ($mode eq 'test2') { &test2; }
elsif ($mode eq 'test3') { &test3;}
else { &main; }
にしたんですが、、やっぱりmainの内容が表示されてしまいます…
$modeの定義方法が悪いのでしょうか…
test.cgi?test1と書いたらtest1の内容がちゃんと表示されました
むー…
0183nobodyさん
2006/05/06(土) 18:14:56ID:???>test.cgi?mode=test1
これで test1 が $modeに入るわけないけど、そこらへんの理解は大丈夫だよね?
0186178
2006/05/06(土) 18:23:50ID:y5pDzvYJはあ…確かにそうですよねえ
でもKENT氏のCGIとか見てもよくわからない…
そこらへんの理解が大丈夫そうじゃないですorz
0187nobodyさん
2006/05/06(土) 18:23:54ID:???0188178
2006/05/06(土) 18:31:07ID:y5pDzvYJhttp://read.kir.jp/file/read45847.zip
アップしました
表示分岐テスト用に作ってあるだけなので内容は短いです
0189nobodyさん
2006/05/06(土) 18:33:09ID:???いきなり
> #$mode = $ENV{'QUERY_STRING'};
に吹いたw 何でコメントアウトしてあるんだよw
0190nobodyさん
2006/05/06(土) 18:39:43ID:???0191178
2006/05/06(土) 18:41:01ID:y5pDzvYJそれを入れるとtest.cgi?test1になってしまうからですかね…
どうやったら$modeをきちんと認識させられるでしょうか...
0192nobodyさん
2006/05/06(土) 18:44:54ID:???ここでも音読してなさい
あんまいいサイトとは言えないけど
0193nobodyさん
2006/05/06(土) 18:46:06ID:???そしたら = でsplitして後は好きなように料理すればいいじゃん
0194nobodyさん
2006/05/06(土) 18:53:46ID:???my %mode_map = map { $_ => 1 } qw(test1 test2 test3);
my $mode = param('mode') || '';
$mode_map{$mode} ? $mode->() : main();
これでいい気がする。
0195178
2006/05/06(土) 18:59:44ID:???ありがとうございます、参考にしますm(__)m
>>193
ありがとうございます
>>194
ためしにやってみたらできました!
みなさん本当にありがとうございました
これで目的のものを作っていけます
0197nobodyさん
2006/05/06(土) 22:10:22ID:5YeEOpS5$countdat = "count.dat";#カウンターログファイル
$ipdat = "ip.dat";#IPログのファイル
open (IP, "+<$ipdat");
flock(IP, LOCK_SH);
$iplog = <IP>;
$ip = $ENV{ 'REMOTE_ADDR' };
if( $ip eq $iplog ){
seek(IP, 0, 0);
print (IP $ip);
close (IP);
}
else{
open (DATA, "+<$countdat");
flock(DATA, LOCK_SH);
$count = <DATA>;
$count++;
seek (DATA, 0, 0);
print(DATA $count);
close(DATA);
print (IP $ip);
close (IP);
}
exit;
0198nobodyさん
2006/05/06(土) 22:11:24ID:5YeEOpS5作りたくて上記のようにうってみたのですが、エラーが出て
しまい、うまく動作しません。何が間違っているか自分では分からないので
教えてもらえたらと思います。
0202nobodyさん
2006/05/06(土) 23:01:55ID:???0204nobodyさん
2006/05/06(土) 23:20:24ID:5YeEOpS5裏で処理させるだけのものってことでお願いします・・・。
>>200
Internal Server Errorなのか分からないです。
分かることだけ書いてみます。
・パーミッションは実行権限与えてます。【755】
・呼び出してはいるみたいですが、実行できていないため
ファイルも作成されていません・・・・。
0206nobodyさん
2006/05/06(土) 23:32:02ID:???エラーが出るのではなかったの?
CGI Wrap Errorみたいなのに過剰に優しく包まれてしまってるの?
ついでに。
http://pc8.2ch.net/test/read.cgi/php/1104624784/2
0208nobodyさん
2006/05/07(日) 00:25:58ID:???実行できてないのが分かってるなら文法エラー
エラーログにエラーとなる原因の行が書かれてるからその1行を書く
エラーがごっそり出てる場合は、たとえばCGIにアクセスした時間が00:00:50とするなら、
エラーログで00:00:50の時間帯のエラーの最初の1文を貼り付ければいい
念のため2〜3行でもいいし
とにかくエラーログを貼らないとどうにもならないです
0209nobodyさん
2006/05/07(日) 00:36:16ID:NJ/WTSjH2: http://siriasu.s10.xrea.com/cgi/wsrch/wwwsrch.htmのサンプルを設置してみました
3: こんな感じになりました
・フォームに半角カナがあると文字化けを起こして検索できない
・検索がきちんと行われてもヒントとして表示される文が文字化けを起こす
Shift-JISのファイルを検索したいのですがどなたかコーディング&アドバイスお願いします
0210nobodyさん
2006/05/07(日) 00:47:39ID:???改造のお話なので、どっちかのスレに移動してください。
・ヒントをもらいながら自力でがんばる場合はこっち
★三 【 スクリプト改造工房 PART 9 】 ★三
http://pc8.2ch.net/test/read.cgi/php/1143834740/1+3
・何かとよろしくお願いしてしまう場合はこっち
【 スクリプト改造依頼スレ 】(丸投げ) part5
http://pc8.2ch.net/test/read.cgi/php/1141174205/1+3
0211nobodyさん
2006/05/07(日) 00:48:45ID:NJ/WTSjH分かりました
0212nobodyさん
2006/05/07(日) 01:02:55ID:???悪癖をこじらせたまま成長して欲しくないのでざっと目視添削してみます。
1. 特に理由がなければ常に -w スイッチ(あるいは可能なら use warnings)を使いましょう。
# できれば use strict も使いましょう。
2. flock() で文字列定数を使うときには...>>199
3. CGI.pm の利用を検討しましょう。大丈夫、案外怖くないです。
4. or die などを用いて open (と flock, seek)の返り値を確認しましょう。
# サンプル用に省略してたなら失礼。
5. "+<" モードでは存在しないファイルを開けません。前もってファイルを用意しておくか sysopen() を使いましょう。
6. print(FH $output) ではなく print FH ($output) と書きましょう。間接オブジェクトスロットの記法に注意しましょう。
7. サーバにアップロードする前に、最低限 -wc スイッチを用いたチェックをクリアーしましょう。
がんばれ。
0213212
2006/05/07(日) 01:13:44ID:???0214nobodyさん
2006/05/07(日) 01:50:30ID:???参考にさせてもらうよ
0215nobodyさん
2006/05/07(日) 02:12:23ID:uQfuojW8一応本(VBA)とネットの情報で、ローカルで実行して動くものはできました。
ただこれを、同じPCにApache入れてCGIとして動かすと動作が止まってしまいうまくいきません。
Apacheのエラーログには何も残らず、Wordが強制的に中断されたような状態になってしまいます。
行き詰まってしまって全く手がかりがつかめません。
どなたか、ご教授願えませんでしょうか。
# 一応Content-type書いてないとかそういうミスはないと思います。
0216nobodyさん
2006/05/07(日) 02:36:06ID:uQfuojW8すれ違いの質問っぽいので向こうで聞いてきます。。。
0217nobodyさん
2006/05/07(日) 11:10:27ID:YyQiWuCM掲示板を作りたくてperlについて学び始めた者です。
で、そのための学習書に沿って学ぼうとしてるんですけどperlのサンプルファイルがうまく起動しなくて困ってます。
ファイルを立ち上げても、一瞬ウィンドウが開いてすぐに消えてしまうからです。
原因のわかる方、対処法を教えてください。よろしくお願いします。
0218nobodyさん
2006/05/07(日) 11:20:12ID:???その説明ではエスパーでないと原因が分からないと思います。
0220nobodyさん
2006/05/07(日) 11:26:57ID:???なので219さんが言う通りにやってみるとよい
0221217
2006/05/07(日) 11:35:33ID:YyQiWuCM219さん、ありがとうございますm(_ _)m
でも直接立ち上げるにはどうしたらいいかわかります?
やっぱり少し不便なんでアドバイスもらえるとありがたいです。
0222nobodyさん
2006/05/07(日) 11:40:21ID:???2.常にコマンドプロンプトを起動しておく
3.Apache を入れる
0223nobodyさん
2006/05/07(日) 11:41:57ID:???コマンドプロンプトを起動しておいたままってのが一番簡単かな
0224nobodyさん
2006/05/07(日) 11:45:26ID:???練習にはコマンドプロンプト起動よりずっと良いし、CGIじゃなければそのまま使い続けられる。
UTF8のスクリプトに対応していないのが残念だが、練習レベルでは関係ないし。
0225nobodyさん
2006/05/07(日) 11:50:35ID:???197に書かせてもらった本人です。
これを参考にもう一度見直してみます。
エラーの内容が分かったらまた書かせてもらうかもです。
ありがとうございます。
0226nobodyさん
2006/05/07(日) 12:00:24ID:???AnHTTPd・設定
http://penguin.nakayosi.jp/windows/anhttpd.html
AnHTTPdの設定のドキュメントルート欄にsample.plの入っているパスを書く。(例えば、c:\Perl\eg)
ブラウザ(IEとか)のアドレス入力欄に”http://127.0.0.1/sample.pl”と入力してエンター。
0227nobodyさん
2006/05/08(月) 12:15:35ID:???@echo off
perl %*
pause
とかなんかそういう内容のバッチを書いて拡張子 ".pl" に関連付けるがいい。自己責任で。w
ちなみに cmd.exe 限定。command.com な人はちょっと違ってくるので注意な。
0228nobodyさん
2006/05/08(月) 15:30:46ID:SAcZGaHhテンプレートをHTML::Templateを使用して出力しているのですが、
クッキーをヘッダに書きだすにはどうすれば。。。?
use strict;
use CGI;
use HTML::Template;
my $q = new CGI;
my $cookie = $q->cookie(-name=>'TEST', -value=>"cokkietest", -expires=>'+1h');
print $q->header( -type => 'text/html' -charset => 'EUC-JP', -cookie => $cookie);
my $tmpl = HTML::Template->new(filename => 'test.html');
$tmpl->param(TESTNAME => 'クッキー書けない');
print "content-type: text/html\n\n";
print $tmpl->output();
0229nobodyさん
NGNG0230nobodyさん
NGNG0231nobodyさん
2006/05/08(月) 15:56:32ID:???いらなくね?
0233nobodyさん
2006/05/08(月) 20:54:56ID:???原因が分かりました。
標準出力に何も表示させないとエラーが出るみたいです。
なので、
print "Content-Type: text/html\n\n";
print "$count\n";
を付け加えて、CSSでvisibility: hidden;で隠せばエラーが出ず
ファイルをうまく作成してカウントしてくれるみたいです。
最後に、質問に答えてくれてありがとうございます。
0234nobodyさん
2006/05/09(火) 02:28:53ID:sSrkJPdW2: &jcode::convert(\$word, "euc");
3: ひらがなや漢字のみのケースでは変換されましたが
半角カナのみのケースや半角カナだけのケースでは変換されませんでした
0236nobodyさん
2006/05/09(火) 03:56:51ID:sSrkJPdWマジっす。
&jcode::convert(\$word, "euc");
してから再度Shift-JISに変換したら今度は文字化けします。
0237210
2006/05/09(火) 04:44:28ID:???↓別の人?
http://pc8.2ch.net/test/read.cgi/php/1143834740/43 に行ったここの>>209
http://pc8.2ch.net/test/read.cgi/hp/1143690384/253 で俺を召喚してる人
0238nobodyさん
2006/05/09(火) 09:06:41ID:???・厳密にはShift_JISに半角カナは含まれない。
・Shift_JISで使う半角カナのコードはEUC-JPの漢字コードと被ってる。
よってノーマルのjcode.plの自動判別に半角カナは使えない。
入力する文字コードを指定するか、jcode.plを自分でカスタマイズする。
0239nobodyさん
2006/05/09(火) 09:15:01ID:???0241nobodyさん
2006/05/09(火) 12:05:05ID:???0242nobodyさん
2006/05/09(火) 12:20:31ID:???0243nobodyさん
2006/05/09(火) 12:25:16ID:???0244nobodyさん
2006/05/09(火) 18:03:51ID:???#!/usr/bin/perl
#use CGI::Carp qw/fatalsToBrowser/;
use LWP::Simple;
use XML::Simple;
$xml = XMLin(get('http://weather.livedoor.com/forecast/rss/24/42.xml'));
print 'Content-Type: text/html; charset=utf-8', "\n\n";
print $xml->{'channel'}->{'item'}->[1]->{'title'};
1.ローカルで実行した時に
"Wide character in print at〜"と出るのを消したい
2.XREAに置いた時、エラーになって動作しない
2行目のCGI::Carpのコメントアウトを外すと正常に動作します
なぜでしょうか?
お願いします
0245nobodyさん
2006/05/09(火) 18:16:35ID:KHJc4thIhttp://www.yukinko-net.jp/computer/download/downloadlist.htm
0246nobodyさん
2006/05/09(火) 19:28:10ID:???1.はSTDOUTのレイヤを適切に指定してやればいいと思われる。
utf-8で出したいようなので、例えば
binmode STDOUT, ':utf8';
をprintする前に実行。
2はオレにはよくわからん。
0247nobodyさん
2006/05/09(火) 19:34:14ID:???0248244
2006/05/09(火) 19:55:29ID:???ついさっきまでローカルで実行してた時は 1. の表示は出なかったんですよね
急に出たんです。なんででしょう。
>>247
CGI::Carpのコメントアウトを外せばちゃんと正常に表示されるので
モジュールは入ってると思います
0249nobodyさん
2006/05/09(火) 23:39:05ID:???XREA使ってるし、 use CGI::Carp qw(fatalsToBrowser); を
使ったりコメントアウトしたりもしてるけど、それが原因でコケたことはないです。
コードがBOMつきのUTF-8で書かれてるとCGI Wrap Errorが出るかも。
hoge.cgi(例)を hoge.cgid にリネームしてアクセスしたら詳細が出ますよ。
0250244
NGNGありがとうございます
could not find ParserDetails.ini in /usr/local/lib/perl5/site_perl/5.8.3/XML/SAX
って出ました。別のパーサー使えば治りそうなのか…な?
スクリプトファイルの文字コードはASCII文字列だけなので、特にはありません。
バイナリエディタで確認してもBOMは付いてなかったです。
Wide〜のエラーが出るのは何なんでしょうね?
0251244
2006/05/09(火) 23:56:34ID:???XMLパースの時点でutf8フラグが付いてますね
これ無くすオプションみたいなのないんでしょうか
0252nobodyさん
2006/05/10(水) 00:09:53ID:???ttp://www.pure.ne.jp/~learner/program/Perl_unicode.html#widechar
この辺で。
XMLパーサー方面は詳しくないのでよくわからないのですが、
自分が使ってるs73のXML::RSSは機嫌よく動いてくれてます。
■ このスレッドは過去ログ倉庫に格納されています