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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/08/12(金) 01:26:47ID:mHnZWvqz
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0004nobodyさん2005/08/12(金) 01:29:10ID:4W8j9IZT
4様
0005nobodyさん2005/08/12(金) 01:29:40ID:4W8j9IZT
5
0006nobodyさん2005/08/12(金) 01:30:39ID:???
関連スレ
CGIだけど、なんか質問ある? Part 12
http://pc8.2ch.net/test/read.cgi/php/1097334246/

【Perl,CGI】参考書籍 第三版
http://pc8.2ch.net/test/read.cgi/php/1030209573/

【Perl】ファイルロック(排他処理)について語ろう
http://pc8.2ch.net/test/read.cgi/php/1024795138/

★負荷軽減対策委員会(Perl、PHP)★
http://pc8.2ch.net/test/read.cgi/php/1034645635/

Perlモジュールについて
http://pc8.2ch.net/test/read.cgi/php/997829243/

CGIに依存しないPerlの話題一般/Part2
http://pc8.2ch.net/test/read.cgi/php/1030548610/

★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc8.2ch.net/test/read.cgi/php/1077525387/

【 スクリプト改造依頼スレ 】(丸投げ) part3
http://pc8.2ch.net/test/read.cgi/php/1105046286/
0007nobodyさん2005/08/12(金) 01:31:45ID:???
[過去ログ] 1 of 4

Part1 http://tako.2ch.net/test/read.cgi?bbs=perl&key=957208980 参照不能
 DAT: http://tako.2ch.net/perl/dat/957208980.dat
Part2 http://tako.2ch.net/test/read.cgi?bbs=perl&key=971817087 参照不能
 DAT: http://tako.2ch.net/perl/dat/971817087.dat
Part3 http://tako.2ch.net/test/read.cgi?bbs=perl&key=979894521 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part4 http://tako.2ch.net/test/read.cgi?bbs=perl&key=984430156 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part5 http://pc.2ch.net/php/kako/988/988728069.html
Part6 http://pc.2ch.net/php/kako/996/996075607.html
Part7 http://pc.2ch.net/php/kako/1000/10002/1000267444.html
Part8 http://pc.2ch.net/php/kako/1003/10039/1003900311.html
Part9 http://pc.2ch.net/php/kako/1009/10095/1009549309.html
Part10 http://pc.2ch.net/php/kako/1014/10145/1014556702.html
0008nobodyさん2005/08/12(金) 01:32:15ID:???
[過去ログ] 2 of 4

Part11 http://pc.2ch.net/php/kako/1017/10172/1017201229.html
Part12 http://pc.2ch.net/php/kako/1019/10199/1019917048.html
Part13 http://pc.2ch.net/php/kako/1022/10227/1022731565.html
Part14 http://pc.2ch.net/php/kako/1026/10269/1026977659.html
Part15 http://pc.2ch.net/php/kako/1028/10288/1028816385.html
Part16 http://pc.2ch.net/php/kako/1032/10320/1032070299.html
part17 http://pc.2ch.net/php/kako/1034/10345/1034583844.html
part18 http://pc.2ch.net/php/kako/1037/10377/1037797479.html
part19 http://pc.2ch.net/php/kako/1042/10422/1042260745.html
part20 http://pc2.2ch.net/php/kako/1044/10447/1044717887.html (タイトルに19と誤記)
0009nobodyさん2005/08/12(金) 01:32:45ID:???
[過去ログ] 3 of 4

part21 http://pc2.2ch.net/php/kako/1047/10479/1047980851.html
part22 http://pc2.2ch.net/php/kako/1050/10503/1050369328.html
part23 http://pc2.2ch.net/php/kako/1053/10530/1053051519.html
part24 http://pc2.2ch.net/php/kako/1054/10549/1054992610.html
part25 http://pc2.2ch.net/php/kako/1056/10567/1056730690.html
part26 http://pc5.2ch.net/php/kako/1059/10590/1059043704.html
part27 http://pc5.2ch.net/php/kako/1060/10608/1060808783.html
part28 http://pc5.2ch.net/php/kako/1063/10635/1063562491.html
part29 http://pc5.2ch.net/php/kako/1066/10662/1066286828.html
part30 http://pc5.2ch.net/test/read.cgi/php/1069846177/
0010nobodyさん2005/08/12(金) 01:33:35ID:???
part31 http://pc5.2ch.net/test/read.cgi/php/1072896288/
part32 http://pc5.2ch.net/test/read.cgi/php/1075545279/ (タイトルに31と誤記)
part33 http://pc5.2ch.net/test/read.cgi/php/1078076768/
part34 http://pc5.2ch.net/test/read.cgi/php/1081148490/
part35 http://pc5.2ch.net/test/read.cgi/php/1085557731/
part36 http://pc5.2ch.net/test/read.cgi/php/1089779036/
part37 http://pc5.2ch.net/test/read.cgi/php/1093106507/
part38 http://pc5.2ch.net/test/read.cgi/php/1097158988/
part39 http://pc5.2ch.net/test/read.cgi/php/1101522903/
part40 http://pc5.2ch.net/test/read.cgi/php/1106816922/

part41 http://pc8.2ch.net/test/read.cgi/php/1110383236/
part42 http://pc8.2ch.net/test/read.cgi/php/1116970588/(前スレ)
0011nobodyさん2005/08/12(金) 01:35:19ID:???
ム板Perlスレより

[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www5a.biglobe.ne.jp/~n_rieko/perl/

[本]
リャマ: http://www.oreilly.co.jp/BOOK/lperl3/
駱駝: http://www.oreilly.co.jp/BOOK/pperl3v1/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/BOOK/pcook/

[オンラインマニュアル]
Perldoc.com: http://perldoc.com
perldoc.jp: http://perldoc.jp
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/%7ekbk/perl5.005/

[モジュール]
CPAN.com: http://search.cpan.org/
河馬屋二千年堂: http://member.nifty.ne.jp/hippo2000/

[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/


関連スレ

正規表現道場@2ch Part4
http://pc8.2ch.net/test/read.cgi/php/1105930285/
0012nobodyさん2005/08/12(金) 03:15:49ID:???
>>2-5
の慌てぶりにワラタ
0013nobodyさん2005/08/12(金) 03:36:54ID:???
>>11
ム板 Perl スレより。

[プログラミング自体の経験が無い奴はまずココを読め] (移転)
Perlプログラミング講座: http://www.site-cooler.com/kwl/perl/

[オンラインマニュアル] (追加)
最新のドキュメント: http://search.cpan.org/~nwclark/perl-5.8.7/
perl5.8.xのドキュメント(一部): http://www.kt.rim.or.jp/~kbk/perl-5.8/
日本語ドキュメント検索: http://search.cpan.jp/

[Perl5.8Unicodeメモ]
ttp://www.pure.ne.jp/~learner/program/Perl_unicode.html
ttp://www.namazu.org/~tsuchiya/perl/perl-5.8.html
ttp://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
0014nobodyさんNGNG
「危険だ!」と頭ごなしにしないで、あえて聞いてもらいたい。指摘してもらいたい。

PerlでCGIスクリプト群を作ってるんだけど、新しいバージョンを作る度にユーザー
にインストールしてもらうのが煩雑。そこで、ネットワークアップデート機能はできない
ものか? と思ってるんだけど。

----------------------------
・SuEXEC環境を前提で
・アップデート用CGIを動かすと、現在インストールされているCGIスクリプト群のversion
 を、公式配布サイトの最新版と比較。
・古ければダウンロードしてアップデート。

・アップデートCGI自体のアップデート・・・はとりあえずおいておいて。
・ネットワークごしに持ってきた最新版が、そのWebサーバ環境で動くか?そこらへん
 の設定はうまく別ファイルに隔離したりして対処するとして。
----------------------------

危険ですか? だとしたら理由を教えて欲しい。

もうすでにそういう仕組みある? あったら教えて欲しい・・・。

よろしくお願いします。
0015nobodyさん2005/08/12(金) 04:06:17ID:4W8j9IZT
>>12
そうだよ
急いで糞スレたてるの大変だったよー
0016nobodyさん2005/08/12(金) 04:52:46ID:???
>>14
その"公式配布サイト"が、最初はまともなスクリプトだったけど、
後で (アップするとき) 悪質なスクリプトを埋め込んだとしたら、君、潰れるよ?
0017nobodyさんNGNG
>>17 そうですね。そうだと思います。ただそれは「信用」のレイヤーの話になるかと。

0018nobodyさんNGNG
間違えたー! >>16 だった!
0019nobodyさん2005/08/12(金) 05:43:34ID:???
>>14
漏れフリーでスクリプト配布しているけど
何かしらの改変をして運用してる場合が多いのでかえって迷惑鴨。
商用だとアップデートで動かなかった場合に責任問題で訴えられる鴨。
0020nobodyさん2005/08/12(金) 06:01:01ID:???
せめて バージョンアップしました のメッセージが流れる程度にしてもらいたい。
0021nobodyさんNGNG
自動的にアップデートしてしまう っていう所までは考えていないんですけどね。
ユーザーが望めばクリック一発で最新版にアップデート!っていう感じなんですけどねえ。
0022nobodyさん2005/08/12(金) 12:38:41ID:???
重度自己陶酔型論破厨房警報
0023nobodyさん2005/08/12(金) 13:30:02ID:???
LPWかなんか必要になるけどレンタルサーバーでは悪用を恐れてそれ自体インストール不可だったりする。
配布元でRSS付けて配布BBS内にそのリンクを貼る、じゃだめかい?
で、そのためにXML::RSSを使うと。
0024nobodyさん2005/08/12(金) 14:25:48ID:???
質問させてください。

Perlを用いてメールを送信するCGIを作成したいのですが、
使っているサーバがSMTP-Authと呼ばれる認証を使っているらしく、
ググって見つけたサンプルソースを利用しても接続できません。
何か特別な方法をしないと無理なんでしょうか。
よろしければご教授願います。

ソースは下にあります。
$send_dataにはメールヘッダ情報を記載しています。
0025nobodyさん2005/08/12(金) 14:26:42ID:???
/*-----ソース-----*/
#!/usr/bin/perl
use Socket;
$server="***.**.**.**";
$to="***@***.**.**";
$from="***@***.**.**";
$subject="test mail";
$data="test";

$port = getservbyname('smtp','tcp');
$struct = pack_sockaddr_in($port,inet_aton($server));
socket(SH, PF_INET, SOCK_STREAM, 0) || die("ソケットの生成失敗 $!") ;
connect(SH, $struct ) || die("接続失敗 $!") ;
select(SH); $| = 1; select(STDOUT);
$respons = <SH> ;
unless($respons =~ /^220/) { close(SH); die("接続失敗 $!") ; }

$command = "HELO $server\n";
print SH $command ;
$respons = <SH> ;
&decode(\$respons) ;
unless($respons =~ /^250/){ close(SH); die("HELOコマンド失敗 $!") ; }

$command = "MAIL FROM:$from\n";
print SH $command ;
$respons = <SH> ;
&decode(\$respons) ;
unless($respons =~ /^250/){ print SH "RSET\n"; close(SH); die("MAILコマンド失敗 $!") ; }
0026nobodyさん2005/08/12(金) 14:27:18ID:???
/*-----続き-----*/
$command = "RCPT TO:$to\n";
print SH $command ;
$respons = <SH> ;
&decode(\$respons) ;
unless($respons =~ /^25[0|1]/){ print SH "RSET\n"; close(SH); die("RCPTコマンド失敗 $!") ; }

$command = "DATA\n";
print SH $command ;
$respons = <SH> ;
&decode(\$respons) ;
unless($respons =~ /^354/){ print SH "RSET\n"; close(SH); die("DATAコマンド失敗 $!") ; }

$command = "$send_data\n";
print SH $command ;
print SH ".\n";
$respons = <SH> ;
&decode(\$respons) ;
unless($respons =~ /^250/){ print SH "RSET\n"; close(SH); die("本文、ヘッダ部送信失敗 $!") ; }

$command = "QUIT\n";
print SH $command ;
close(SH); select(STDOUT);
print "MAILは正常に送信されました。\n";
0027nobodyさん2005/08/12(金) 18:15:23ID:???
>>24
頭悪すぎ、SMTP-Authが必要といってるサーバにSMTPでメール投げても駄目に決まってるだろ。
0028nobodyさん2005/08/12(金) 18:50:28ID:???
>>14
危険という話はおいておくとその機能は便利だね。
ファイルもってくる事自体はLWPもuse Socketも必要とせず出来る。bindする事を制限されていないのであれば。
スクリプト実行中に実行元のスクリプトファイルを書き換えても問題無いです。
上書きなら所有者、パーミッションは引き継がれる。
そもそもsuexecならファイル作成、chmodは問題なく行えます。
一番問題なのは折れない心
0029nobodyさん2005/08/12(金) 18:56:39ID:???
>>24
http://www.puni.net/~mimori/rfc/rfc2554.txt
http://search.cpan.org/~apleiner/Net-SMTP_auth-0.07/
http://search.cpan.org/~gbarr/libnet-1.19/
0030nobodyさん2005/08/12(金) 20:30:29ID:???
>>28
鯖管やるなら一度は書いてるようなたわいも無いツールだと思うけど‥
0031nobodyさん2005/08/12(金) 21:04:08ID:???
チラシの裏にでも書いてろ
0032nobodyさん2005/08/12(金) 21:25:21ID:qS3bR1/B
配布元がクラックされる可能性を考えると、バージョンアップ告知くらいに止めておくのが無難だな。
0033nobodyさん2005/08/12(金) 22:01:46ID:???
水島広子みたいな例もあるしな。
0034nobodyさん2005/08/13(土) 02:44:52ID:???
あれはクラックじゃないでしょ
0035nobodyさん2005/08/13(土) 03:06:52ID:???
んなこた分かってるだろ
0036nobodyさん2005/08/13(土) 07:51:10ID:???
2ちゃんで自演してる厨のソフトなんか信用できねー
0037nobodyさん2005/08/13(土) 18:42:30ID:Sjgh6/vt
Cookieって名前=値の部分は複数保存できないんですか?
0038nobodyさん2005/08/13(土) 19:39:09ID:???
>>37
ここはperlスレだと、何度言ったらわかるんだ?
0039nobodyさん2005/08/13(土) 21:22:32ID:???
テキストファイルに書かれた文章をある変数で受け取って、
その文章にある変数を展開することって可能ですか?

んーと、つまりはこういうこと。

$a = 10; $b = 20;
open(FILE , "data.dat") or die("Error : $!");
foreach (<FILE>){ $result .= $_; }
print $result; exit;

[data.dat]
a = $a
b = $b

a + b = $a + $b
[EOF]

[出力結果]
a = 10
b = 20

a + b = 30
0040nobodyさん2005/08/13(土) 21:39:57ID:???
>>39
eval
0041nobodyさん2005/08/13(土) 21:50:52ID:???
>>39


$a = 10; $b = 20;
open(FILE , "data.dat") or die("Error : $!");
while (<FILE>){
s/\$.+$/eval($&)/e;


$result .= $_; }


print $result; exit;
0042nobodyさん2005/08/13(土) 22:09:28ID:AxZeVTkQ
かなり初歩的なこと(文法関連のこと)かもしれませんが質問させてください。
環境:OS=FedoraCore3(自宅サーバ) perl=v5.8.5

以下の基本コードを実行しました。
#!/usr/bin/perl

print "content-type: text/html\n";
print "\n";
print "<Html>\n";
print "Test Message";
print "</Html>\n";
正常にTest Messageと表示されました。
次に#!/usr/bin/perl

print "content-type: text/html\n";
#print "\n";
print "<Html>\n";
print "Test Message";
print "</Html>\n";
としたところ「Internal Server Error」となってしまいました。
参考資料には
最初に#のある行はコメント行である。
また、コメント行にしたところはただの改行である。
とありました。
上記より文法として間違ってはいないと思いますが、
なにか誤っているところがあるのでしょうか?
0043nobodyさん2005/08/13(土) 22:23:16ID:???
>>42
content-typeなどのHTTPヘッダーの区切りは改行2つ。
0044nobodyさん2005/08/13(土) 22:23:36ID:IY1oZ0HZ
>>42
>>38
0045nobodyさん2005/08/13(土) 22:23:51ID:???
>>42
その参考資料は捨てなさい。嘘が書いてあります。

最初の行は、コメント行ではありません。
コメントアウトした所は、ヘッダに必要な改行です。
0046nobodyさん2005/08/13(土) 22:25:49ID:???
>>42
回答は出たようなので補足だけ。
検索キーワードは「レスポンスヘッダ」とか。
あとhttpdのエラーログも見よう。
0047422005/08/13(土) 22:30:43ID:???
>>43>>45
そうなんですか!
確かにそう考えるとコメントアウトしてエラーとなる原因がよく分かりました。

>>44
すみません。perlを用いたwebプログラミングの文法に関するものということで
ここで質問してしまいました。
スレ違いということであればどこが妥当でしょうか?
「CGIだけど、なんか質問ある? Part 12」は微妙に違うような気がしますし...
0048nobodyさん2005/08/13(土) 22:58:25ID:???
>>41
う、うまく動かない・・・orz
data.datの最後にある「$b」だけ展開されました・・・orz
0049nobodyさん2005/08/13(土) 23:05:20ID:???
と思ったら、\$.+$になってませんでした・・・orz
お騒がせしましたー・・・
0050nobodyさん2005/08/13(土) 23:06:41ID:???
>>48
だろうね。
最初に書いた自分のやつ、>>39 で素直に
$result を eval したら?
0051nobodyさん2005/08/13(土) 23:13:47ID:???
あ、ついでに質問なんですが、
もしdata.datの内容が以下のような場合でも、
きちんと展開されるには、どんな正規表現にすればいいでしょうか。

[data.dat]
a + b = $a + $b です。
0052nobodyさん2005/08/13(土) 23:19:05ID:???
>>51
そのままで良いのでは…。

つか、>>50 で書いてたこと、勘違いしてました。逝ってきます…。
0053392005/08/13(土) 23:26:04ID:???
>>52
\$.+$のままだと、「$a + $b です。」にマッチして、そのままevalかけるらしく、
正確な「30 です。」という結果にならないのです(´・ω・)
変数名のみ(演算子があればそれも)ってのは、やっぱり無理なんでしょうかね・・・

一応、例に出しているのはあくまでも例で、
実際は$data{name}といった内容がかかれているのです・・・。
0054nobodyさん2005/08/13(土) 23:26:59ID:???
>>47
正確に言えばそこだけど、
違いが分からないんだから初心者向けのこっちのスレが融通利かせてもいいと個人的には思う。

>>51
どの範囲を式として見るか不明瞭。
とりあえず変数と変数に挟まれた+を認識させるなら
s/(\$\w+([ +]+\$\w)*)/eval($1)/ge;
ただし $a + + $b なんてあっても無視。
式として見る範囲に記号付ける方が無難かもね。
「a + b = <$a + $b> です」
s/<([^>]*)>/eval($1)/ge;
0055392005/08/13(土) 23:34:06ID:???
>>54
なるほど、変数を記号で囲むという手法もありましたか。
ありがとうございます。
0056nobodyさん2005/08/14(日) 00:18:03ID:???
んじゃ、別解
$a=10; $b=20;
open(D, "<data.dat");

$data = join("\n", '$result=<<EOS', <D>, "EOS\n");
eval $data;
print $result;
0057nobodyさん2005/08/14(日) 00:57:57ID:gpI3KnsY
掲示板CGIで、掲示板タイトルをこういう書き方をしています。
$BBS_TITLE="Fighter's BBS 戦士たちの会議室";
これを投稿フォームの上部に表示させているのですが、(投稿フォームのところに$BBS_TITLEと)
投稿すると$BBS_TITLEの部分だけ文字化けします。
"を'に変えてみたり、漢字をエスケープさせてみたりしましたが
直りません。
どこをどうしたら表示できるようになるでしょうか。
スクリプトはS_JISです。
0058nobodyさん2005/08/14(日) 01:13:13ID:???
>>57
>>1
0059nobodyさん2005/08/14(日) 01:55:41ID:???
>>57
HTMLソースから文字化けしている部分をさらすよろし。
よくあるShift-JISうんぬんの話じゃなさそうだから。
0060nobodyさん2005/08/14(日) 02:30:51ID:RsCEyCku
use encoding 'Shift-jis'
話はそれから。
0061nobodyさん2005/08/14(日) 03:16:43ID:???
どうでもいい話だが、

IANA 的には "Shift_JIS"
http://www.iana.org/assignments/character-sets

Encode 的には "shiftjis"
http://search.cpan.org/~dankogai/Encode-2.11/JP/JP.pm

Encode だとエイリアスしてくれているので通るとは言え、
ハイフン区切りで書く癖があるなら直した方がいいよ。
0062掲示板タイトルの文字化けの件2005/08/15(月) 02:34:48ID:B8RuptAe
人大杉で14日PM11時ごろから「大杉」で見られないので代理投稿お願いしました。
名前やレスを下さった方のお名前がわかりませんがお許しください。

>(化けたソースを)UP
・・・しろとのことでしたのでUPします。
Fighter's BBS 戦士達の会議室 となるべきところが↓
Fighter's BBS $B@o;NC#$N2q5D<<(B
このようになっております。
文字列内の'を消しても変化ありません。
投稿したときだけこのように表示され、掲示板へアクセスしただけの時は
正常に表示されます。
0063nobodyさん2005/08/15(月) 02:48:09ID:???
文字化けってーか JIS になってんじゃね。
0064nobodyさん2005/08/15(月) 08:24:12ID:I9dGlG0t
>>61
あんがと。
shiftjis /\bshift.*jis$/i Shift JIS (aka MS Kanji)
適当に打っても通るから適当に打って投稿しますた。
0065nobodyさん2005/08/15(月) 08:36:29ID:???
>>62
文字コードの指定がないか、ばらばらなんでしょ。
自作掲示板ならソースのコードを統一する。
レンタルなら借りた先に文句を言う。
無料DLして設置したのなら作者のページで質問する。
0066nobodyさん2005/08/15(月) 09:04:11ID:???
>>2
ソースファイルの保存コードがおかしいのかも。
外部ファイルrequireして読み込んでね?

use encoding '****';してその文字コードにソースを統一しる
0067nobodyさん2005/08/15(月) 17:51:57ID:???
うむ、作者に問うのが一番だな。
0068nobodyさん2005/08/15(月) 18:54:55ID:VKc1C+7u
教えて下さい。
cookieのセットを以下のように行い、\cookiesフォルダにもファイルが出来ている
のに、$ENV{'HTTP_COOKIE'}にデータが返ってきません。どうしてでしょうか?
ちなみにIEのプライバシー設定は”自動cookie処理を上書きする”にして
います。

print "set-cookie: ", "DI=$FORM{'id'}; ";
print "expires=", "Sat, 31-Dec-2006 23:59:59 GMT; ";
print "domain=", "abcd.jp; ";
print "secure", "\n";

スレ違いだったらすいません。
0069nobodyさん2005/08/15(月) 19:37:06ID:???
secureとdomainを外してみるよろし。
この2つ。ちゃんと理解してる?

0070nobodyさん2005/08/15(月) 22:44:30ID:VKc1C+7u
>>69
68です。
ありがとうございます。
みようみまねでやっていたので、理解してませんでした。
おっしゃる通りにやったらうまく行きました。
0071nobodyさん2005/08/16(火) 02:21:29ID:CqLOGoiC
perl初心者のプログラミング経験者です。
require は if 文の中にもかけますか?

PCと携帯に対応したBBSのソースをダウンロードしたのだけど
1ファイルで if 文でなんとかしようとしてる感じの代物でした。

それよりPC、携帯ごとに同名の関数を別ファイルで定義して
メインのCGIは最初に端末を判断してrequireでファイルを読み込んだ方が
OOP的で保守性もいいと思ったのですが、可能なんでしょうか。

アイディアがどうかも含めてご意見お願いします。
0072nobodyさん2005/08/16(火) 02:30:11ID:???
お前は試すと言うことを知らんのか。
0073nobodyさん2005/08/16(火) 03:14:09ID:???
ほんとに経験者なのか全体的に疑問が沸いてくる話し振りアル。
0074nobodyさん2005/08/16(火) 10:26:34ID:???
自分ではどうにもならなかったので質問します。
cat index.html | nkf -Se -Lu | sed 's/<\/.*>//g; s/<.*>//g; s/^$//; s/ \;/ /g;'
↑このスクリプトを詳しく教えてほしいです。
0075nobodyさん2005/08/16(火) 13:09:30ID:???
質問です
以下のスクリプトで %temphash を使わずに
無名ハッシュにスライスで代入してそのリファレンスを配列に追加するにはどうしたらいいでしょうか?

my @examplenames = qw/Server Board Key/;

my %temphash;
@temphash{ @examplenames } = ("pc8.2ch.net", "php", "1123777607");
push @favorites, \%temphash;
0076752005/08/16(火) 13:33:31ID:???
ちょっと冗長な感じがしますが、自己解決しました。すみません。
@{$favorites[++$#favorites]}{ @examplenames } = ("pc8.2ch.net", "php", "1123777607");
0077nobodyさん2005/08/16(火) 14:04:58ID:9v1kpORv
>>74
それはシェルスクリプトだから、マニュアル引くならman。
それほど難しい所は無いから、cat,nkf,sedをググってみては。

>>75
こういうのを知りたかったのかなと思ったのだけど、
スライス使ってないから悩んだ。

push @favorites, {Server=>"pc8.2ch.net", Board =>"php", Key=>"1123777607"};
0078nobodyさん2005/08/16(火) 14:08:50ID:???
sage忘れスマソ。
0079nobodyさん2005/08/19(金) 14:41:46ID:E8nv73TY
質問です。
HTML::Templateの使い方です。

プログラム側で、@tmpには
[email protected]
[email protected]
[email protected]
[email protected]
と4つ入っています。

これを
<p>Addr:<select name="userid">
<option value="[email protected]">[email protected]</option>
<option value="[email protected]">[email protected]</option>
<option value="[email protected]">[email protected]</option>
<option value="[email protected]">[email protected]</option>
</select></p>

いう風にしたくて、テンプレート側で以下のようにループを掛けています。

<p>Addr:
:<select name="userid"><TMPL_IF NAME=USERID>
<option value="<TMPL_VAR NAME=ADDR>"><TMPL_VAR NAME=ADDR></option></TMPL_IF>
</select></p>


プログラム側で
$template->param(USERID => @tmp);

で、当然のことながらうまくいかないのですが、HTML::Templateの日本語訳を読んでも
このような使い方の例がありません。
どのようにすればいいのか、教えていただければと思います・・・。
0080nobodyさん2005/08/19(金) 14:47:40ID:???
わからなかったら使わなければいいと思うんだが。
普通にforeachでまわせば?
0081792005/08/19(金) 15:00:33ID:???
>>80

「HTML::Templateを使え」とは言われていないのですが、

H T M L 部 分 は 必 ず 外 部 フ ァ イ ル に し ろ

というお達しがあるので、CGI側で丸ごと<option>〜</option>を吐き出すことができません。
これができれば簡単なのですが・・・。


・デザインはデザイナーがやる
・デザイナーにはCGIの部分は「一切」触らせない
・だからCGIからHTMLを丸ごと吐き出すような作りにはできない

で、HTML::Templateに行き着いたわけでして。

0082nobodyさん2005/08/19(金) 15:10:03ID:???
>>79
ループをかけているといっているがどこにもループないし、例がないといっているが
HTML::TemplateのTMPL_LOOPのところの例はそのものズバリだと思うのだが。
なんか違う世界が見えてる人?
0083792005/08/19(金) 15:13:01ID:???
自己解決しました。
ありがとうございました。
0084792005/08/19(金) 15:17:04ID:???
>>82

ごめん。

<p>Addr:
:<select name="userid"><TMPL_LOOP NAME=USERID>
<option value="<TMPL_VAR NAME=ADDR>"><TMPL_VAR NAME=ADDR></option></TMPL_LOOP>
</select></p>

でした。
あんまりできないもんだから、IF使って値がある間にぶち込むことを考えてて
そのまま貼り付けちまった。

LOOPの例は読んでんだけど、ハッシュの例しかなく。
0085792005/08/19(金) 15:56:39ID:???
>>83は私じゃないけど、自己解決できました。

<TMPL_VAR NAME=ADDR>

だけ書いておいて、CGIの側で

my $tmp2
foreach my $tmp(@addr){
$tmp2 .= "<option value=\"$tmp\">$tmp</option>\n";
}
my $tmp3 = "<p><select>$tmp2</select></p>\n";
$template->param(ADDR => $tmp3);

でできました。ありがとうございました・・・。
0086nobodyさん2005/08/19(金) 17:15:00ID:???
>>85
それはHTMLがプログラム側に染み出してるので、テンプレ使う意義を
考えるとイマイチだな。

私ならプログラム側は

$template->param(ADDR => [map {{A => $_}} @addr]);

としといてテンプレの方で

<TMPL_LOOP NAME=ADDR>
<option value="<TMPL_VAR NAME=A>"><TMPL_VAR NAME=A></option>
</TMPL_LOOP>

とします。
0087nobodyさん2005/08/20(土) 23:50:12ID:???
未定義値undefについて質問です。
$ret = open (FILE, "hoge.txt");
ファイルオープンに失敗した場合、undefが返ってくるらしいのですが、
オープンに失敗したかどうかの判定をする際に
if ($ret == undef) {
と記述するべきなのか
if ($ret eq undef) {
とするべきなのか悩んでいます。
どちらも正常に判定はされているらしいのですが。

open (FILE, "hoge.txt") || &error("File open failed.");
などと書くのもありなのは知っていますが、
オープンに失敗して&errorを呼ぶ前にいくつかの処理を実行させたいので、
if文での判定を行いたいのです。
0088872005/08/20(土) 23:52:58ID:???
すみません、よく考えたら
if(!open (FILE, "hoge.txt")) {
  処理1;
  処理2;
  &error("failed.");
}
と記述すれば問題なさそうですね・・・
0089nobodyさん2005/08/21(日) 00:00:39ID:???
>>88
open FILE, "hoge.txt"
   or do{ 処理1; 処理2; error("failed.") };
とかどう?
0090nobodyさん2005/08/21(日) 00:29:16ID:???
>>87
解決してるみたいなので、ちょっとした補足です。
undefは未定義値ではなく、未定義値を返す関数undef()です(無引数の場合)。
未定義値との比較は、==, eq ではなく defined() を使うと良いでしょう。
0091792005/08/22(月) 10:52:01ID:???
>>86
mapを使うのか・・・
全然思いつきませんでした。ありがとう。
0092nobodyさん2005/08/22(月) 18:49:38ID:IX9Ccu2Q
質問です。

foreach $a (@hourlist){ ($mons1,$mons2,$mons3,$mons4,$mons5,$mons6,$mons7,$mons8,$mons9,$mons10,$mons11,$mons12,$mons13,$mons14,$mons15,$mons16) = split(/<>/,$a);
}

# 時間代入
if ( $in{'mons'} == '城内2時間キングアッピー' ) {
$mons1 = $in{'timeh'}
} elsif ( $in{'mons'} == '城内10時間キングアッピー' ) {
$mons2 = $in{'timeh'}
} elsif ( $in{'mons'} == '城内ドラゴン' ) {
$mons3 = $in{'timeh'}
} elsif ( $in{'mons'} == '城内朱雀' ) {
$mons4 = $in{'timeh'}
} elsif ( $in{'mons'} == '2時間カイザー' ) {
$mons5 = $in{'timeh'}
} elsif ( $in{'mons'} == '7時間カイザー' ) {
$mons6 = $in{'timeh'}
} elsif ( $in{'mons'} == '10時間カイザー' ) {
$mons7 = $in{'timeh'}
} elsif ( $in{'mons'} == '7時間カース' ) {
$mons8 = $in{'timeh'}
} elsif ( $in{'mons'} == '7時間ブレス' ) {
$mons9 = $in{'timeh'}
} elsif ( $in{'mons'} == '7時間ルーン' ) {
$mons10 = $in{'timeh'}
} elsif ( $in{'mons'} == '10時間カース' ) {
$mons11 = $in{'timeh'}
} elsif ( $in{'mons'} == '10時間ブレス' ) {
$mons12 = $in{'timeh'}
} elsif ( $in{'mons'} == '10時間ルーン' ) {
0093922005/08/22(月) 18:52:53ID:IX9Ccu2Q
$mons13 = $in{'timeh'}
} elsif ( $in{'mons'} == '城外キングアッピー' ) {
$mons14 = $in{'timeh'}
} elsif ( $in{'mons'} == '9時間リグレット' ) {
$mons15 = $in{'timeh'}
} else {
$mons16 = $in{'timeh'}
}

$_ = "$mons1<>$mons2<>$mons3<>$mons4<>$mons5<>$mons6<>$mons7<>$mons8<>$mons9<>$mons10<>$mons11<>$mons12<>$mons13<>$mons14<>$mons15<>$mons16<>\n";
push (@newhour,$_);

こうやったのですが、1〜4番目に入れたいデータが1番目に、6・8〜10番目に入れたいデータが6番目に、7・11〜14番目に入れたいデータが7番目に入ってしまいます。
どこが原因か教えていただけないでしょうか?
0094nobodyさん2005/08/22(月) 19:43:40ID:???
>>92
文字列の比較は eq を使う。
0095nobodyさん2005/08/22(月) 19:54:26ID:???
>>94
出来ました。ありがとうございました<(_ _)>
0096nobodyさん2005/08/22(月) 22:43:42ID:???
>92ではないのですが、>92を簡潔に書くならどんな感じでしょう?

my @tempmons = qw/dummy 城内2時間キングアッピー 城内10時間キングアッピー ... /;
my %mons_to_index = map { $tempmons[$_] => $_ } 0..$#tempmons;

foreach(@hourlist){
    chomp;
    my @mons = split /<>/;
    $mons[ ($mons_to_index{ $in{'mons'} } || @mons)-1 ] = $in{'timeh'};
    $_ = join '<>', @mons,"\n";
}

ループを1個減らそうとハッシュを使ってみたのですが、
indexが0の時の対処が強引になってしまいました
0097nobodyさん2005/08/22(月) 23:01:26ID:???
>>96
全然追ってないけど、とりあえず $in{'mons'} と $in{'timeh'} は
ループの外へ出して別変数に入れようよ。
0098nobodyさん2005/08/22(月) 23:19:39ID:???
変数の記述方法について質問です。
$sizeという数値が入る変数があり、これをヒアドキュメントで出力したいのですが、
print <<"EOF";
log file size $sizeKB
EOF
などと書くと、$sizeとKBではなく$sizeKBという変数として認識されてしまうのですが、
ヒアドキュメンド内で変数の直後に半角英数字を続けて書く方法はないでしょうか。
0099nobodyさん2005/08/22(月) 23:23:42ID:???
>>98
log file size ${size}KB
0100nobodyさん2005/08/22(月) 23:24:09ID:???
>>99
即レス感謝です!
0101nobodyさん2005/08/23(火) 00:16:13ID:???
>>96
いいんじゃない?
私は頭の部分をこう書くかな。

my @tempmons = qw{dummy 城内2時間キングアッピー 城内10時間キングアッピー ...};
my %mons_to_index;
@mons_to_index{@tempmons} = 0..$#tempmons;
0102nobodyさん2005/08/23(火) 00:49:00ID:???
>>101
んじゃ、その %mons_to_indexがもう出来てるとして俺は空間効率でも上げてみるか。
頭の中で考えただけだから、間違ってたらごめん。

my $tm = $in{'timeh'};
my $mons_id = $mons_to_index{$in{'mons'}};
foreach my $hour (@hourlist) {
my $i = 0;
while ($hour =~ m/<>/go) {
next if $i++ != $mons_id;
$hour =~ s/[^<>]+<>\G/$tm<>/o;
last;
}
}

ところで、なんで @hourlist が配列なのか不明。
もとのコード >>92 でも foreach で回してるけど、$mons* が上書きされちゃうし。
0103nobodyさん2005/08/23(火) 01:26:51ID:???
ゲームプログラマならリファレンス学べ

sub data_load {
open DATA, "<data.txt" or die "Can't open : $@";
my @lines = <DATA>;
close DATA;
return [ undef, map{ split '<>' } @lines ];
}

sub data_save {
my @data = join '<>' => map{ $$_ } @_;
local $" = "\n";
open DATA, ">>data.txt" or die "Can't open : $@";
print DATA "@data";
close DATA;
}
とすれば

@::ref_hours = data_load();
$::ref_hours->[ $in{mons} ] = $in{timeh};
data_save( @::ref_hours );

応用方法もいくらでもあるだろう。
■ このスレッドは過去ログ倉庫に格納されています