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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/06/26(月) 00:46:38ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0002nobodyさん2006/06/26(月) 00:47:26ID:???
関連スレ
CGI: Common Gateway Interface part 13
http://pc8.2ch.net/test/read.cgi/php/1126436361/

【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 9 】 ★三
http://pc8.2ch.net/test/read.cgi/php/1143834740/

【 スクリプト改造依頼スレ 】(丸投げ) part5
http://pc8.2ch.net/test/read.cgi/php/1141174205/
0003nobodyさん2006/06/26(月) 00:48:09ID:???
[過去ログ] 1 of 5

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
0004nobodyさん2006/06/26(月) 00:49:09ID:???
[過去ログ] 2 of 5

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と誤記)
0005nobodyさん2006/06/26(月) 00:49:50ID:???
[過去ログ] 3 of 5

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/
0006nobodyさん2006/06/26(月) 00:50:46ID:???
[過去ログ] 4 of 5

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/
0007nobodyさん2006/06/26(月) 00:52:13ID:???
[過去ログ] 5 of 5

part41 http://pc8.2ch.net/test/read.cgi/php/1110383236/
part42 http://pc8.2ch.net/test/read.cgi/php/1116970588/
part43 http://pc8.2ch.net/test/read.cgi/php/1123777607/
part44 http://pc8.2ch.net/test/read.cgi/php/1129477637/
part45 http://pc8.2ch.net/test/read.cgi/php/1134049707/
part46 http://pc8.2ch.net/test/read.cgi/php/1137518266/
part47 http://pc8.2ch.net/test/read.cgi/php/1141195171/
part48 http://pc8.2ch.net/test/read.cgi/php/1146042050/
part49 http://pc8.2ch.net/test/read.cgi/php/1149017548/ (前スレ)

part44-621氏による過去ログ倉庫
ttp://user.ftth100.com/mirrorhenkan/perl/
0008nobodyさん2006/06/26(月) 00:53:27ID:???
ム板Perlスレより 1 of 2

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

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

[オンラインマニュアル] (追加)
最新のドキュメント: http://search.cpan.org/~nwclark/perl-5.8.8/
perl5.8.xのドキュメント(一部): http://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: http://www.cpan.jp/search.cgi
perldoc.jp: http://www.perldoc.jp/
Perldoc.com: http://www.perldoc.com/
0009nobodyさん2006/06/26(月) 00:54:30ID:???
ム板Perlスレより 2 of 2

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

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

[Perl5.8Unicodeメモ]
http://www.pure.ne.jp/~learner/program/Perl_unicode.html
http://www.namazu.org/~tsuchiya/perl/perl-5.8.html
http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
0010nobodyさん2006/06/26(月) 01:02:34ID:???
>>1
乙つつつ
0011nobodyさん2006/06/26(月) 10:30:20ID:???
>>11

おちかれー
0012nobodyさん2006/06/26(月) 20:55:18ID:???
1000取っちゃった。
オブジェクト指向より、いい指向ってないのかな。

大き目のプログラム組んで何ヶ月か、又は何年か後に見てみたら
全体の流れとそれぞれの処理を理解するのに数日かかってしまうのがいや。
これはオブジェクト指向とは無関係だけど。

プログラムを専門にやってないから思い出すのとあわせて、いつも
「なんでこんなイケてないんだこれ」
と自己嫌悪に陥る。

オブジェクト指向ってモジュールとか確かにべんりだけどさ。
完ぺき主義というか極端な自分としては全てをオブジェクト指向的にやろうとして、
うんざりする。

もっといいやりかたないのかね。

うんスレ違いだ。すみませんでした。
0013nobodyさん2006/06/26(月) 21:30:04ID:???
>>12
それはプログラムの組み方の問題なんじゃないのかなあ。

プログラム組むときって、ノートに処理の流れとかメモするでしょ?
テキストエディタとかで
編集
 |- 検索
    |- 次を検索
    |- 前を検索
とかってあるけど、これもオブジェクト指向といえばオブジェクト指向だし。
編集::検索->次() みたいな。

これで例えば 「次を置換」 とか改造して入れるために、また一からプログラム全体を把握し直さなきゃわかんない、とかそーないと思うんだけど。
なんか変なとこにこだわりすぎてんじゃない?
0014nobodyさん2006/06/26(月) 21:48:52ID:???
>>12
> 完ぺき主義というか極端な自分としては全てをオブジェクト指向的にやろうとして、
> うんざりする。
> もっといいやりかたないのかね。

Ruby 使っとけ。
0015nobodyさん2006/06/26(月) 22:04:56ID:???
質問。
sub noward {
local($flag);
foreach ( split(/\s+/, $no_wd1) ) {
if (index("$in{'name'} $in{'sub'} $in{'comment'}",$_) >= 0) {
$flag = 1; last;
}
}
if ($flag) { $err .= "不適切な文字が含まれています。"; }
if ($err) { &error($err); }
}
禁止ワードのサブルーチンなんだけどコレを改行で区切る事が出来ないのだがどうすればいいのか教えてほしい。
お願いします。
0016nobodyさん2006/06/26(月) 22:19:27ID:???
その前に、何を改行で区切りたいのでしょうか?そこが分かりません。
文からするとサブルーチンを改行で区切りたいように読めるけど…。
0017nobodyさん2006/06/26(月) 23:07:40ID:???
kentっぽい書き方だな
0018nobodyさん2006/06/26(月) 23:26:42ID:???
いまどきmyですむようなところにlocalだしな。

悪い癖をおぼえる前にもう少しましな手本を探したほうがいいような
気がする。

0019nobodyさん2006/06/26(月) 23:38:21ID:???
kentはそろそろ後方互換性じゃなくて
古くてアレなスクリプトを配布する事による弊害を気にした方がいいね。
いまどきperl4だけの鯖なんてないし。
0020nobodyさん2006/06/27(火) 00:04:59ID:???
当方C/C++/VBは使えますがPerlは難しいですか?
以前使っていたレンタル鯖がCのCGIを許可していたので
Cでゴリゴリ書いていましたが、別の業者に移管されてしまい
そこの業者はCのCGIが不可、Telnet不可とCGIが全て使えなくなってしまいました。
昔、ちょろっとPerlの本を見たことがあるのですが、コードがC以上に記号ばかりでゴチャっとしていて
追いにくいなぁと直ぐに本を閉じてしまった記憶があります。
C12年/C++3年/VB5年程です。。
 
0021nobodyさん2006/06/27(火) 00:10:32ID:???
そんだけコード書いてればPerl覚えるのは余裕。
独特の癖があるので人のコードを読むのは苦労するかもしれんが、
書く分には好きなように書ける。

TIMTOWDIバンザイ
0022nobodyさん2006/06/27(火) 01:00:12ID:???
それだけの経験があるなら1週間perlだけ弄ってればすぐに動くものが作れるt思います。たぶん。

sub内でローカル宣言した変数がリファレンス(Cでいうポインタ)で参照できちゃう気持ち悪い部分もあってw、
あまりに自由すぎるのがperlの欠点といったとこでしょか
0023nobodyさん2006/06/27(火) 01:15:43ID:???
とりあえず文字列操作は正規表現メインで。
Cのポインタの概念は無いんで、文字列ポインタ動かしたりはできません。
だからといって文字列は配列でもないので、配列操作にもしないことです。

Cだけの人がとりあえず書いてみたPerlのプログラム読んだ事あるけど
思いっきりCぽくて、全然Perlじゃなかったなあ。

ていうか、Perlのソース読む方が理解が早いかも。
0024nobodyさん2006/06/27(火) 01:38:26ID:???
まず変数の扱いとスコープの違いにつまづいて
次に構文の違い(elsifとかswitchとか)につまづいて
コンテキストの理解につまづいて
関数の仮引数が無いのにつまづいて
リファレンスをポインタだと思い込んでつまづいて

・・・がんばってください。
0025nobodyさん2006/06/27(火) 02:08:24ID:ms3DPBt4
掲示板のプログラムを作っているのですが、
まず、書き込みページを出力して、
データを受け取って文法チェックをして 結果を出力して、
次のデータ受け取りでファイルに書き出しをするプログラムなのですけど、
どうしても原因が見つけれないエラーが出ていて困っています。
ただ、これ自体が大きすぎるので少し違うルートで質問します。

500 Internal Server Error
というのはどのような条件下で出てくるのでしょうか?
細かい説明などをくれるとうれしいです。

それともうひとつ
プログラムやルーチンの文法ミスもないし、ファイルの参照ミスもないのに
ファイル書き込み等をしているどこかでエラーが出てくる場合
どういうミスの可能性があるでしょうか?

ずいぶんと分かりにくくなってしまっていますが、お願いします
0026nobodyさん2006/06/27(火) 02:36:42ID:???
よくこういう質問でるけど、なんで自分でわかんないんだろう?
文法ミスならローカルで実行したときわかるし、
違うなら処理の途中でためしに exit して、どこまでならエラーでないか、って突き詰めていけばわかるよな?

それでもどこもエラーないなら、
print "Content-type: text/html\n\n"; の前に何か print してる、くらいしか思いつかない。

>>25
要するに、知らんがな、ってこと。
ブラウザだけでやってんの? ちゃんとエラー文のせようよ。
0027nobodyさん2006/06/27(火) 02:52:04ID:???
>>25
> ただ、これ自体が大きすぎるので少し違うルートで質問します。

お勧めしません。逆効果です。


> 500 Internal Server Error
> というのはどのような条件下で出てくるのでしょうか?

それが、CGI が何なのかを理解せずに書いたプログラムなら、ほとんどどのような条件下ででも。


> ファイル書き込み等をしているどこかでエラーが出てくる場合
> どういうミスの可能性があるでしょうか?

あらゆるミスの可能性、及び誰のミスでもない可能性があります。
どういうミスかはわかりません。ただ、「誰のミスか」であれば、この場合は控え目に言って 99.8% 程度の確立であなたのミスです。

# 助けてあげたくてもこの質問じゃ何もできないよぅ・・・orz
0028nobodyさん2006/06/27(火) 03:53:29ID:H9M/RMpI
#! c:/perl/bin/perl

# CGIヘッダーの出力
print "Content-type: text/html\n\n";

# HTMLの出力
print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n";
print "<html>\n";
print "<head><title>Hello HTML</title></head>\n";
print "<body><p>こんにちは。これはHTML文書の例です。</p></body>\n";
print "</html>";

というCGIのプログラムがあったんですが
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n";はどういう役割をしているんでしょうか??
0029nobodyさん2006/06/27(火) 04:05:08ID:???
HTMLのDOCTYPE宣言。ValidなHTML文書作る時の常識。Perlとは直接関係ない。
板違いなのでWeb制作技術板へ行ってらっしゃい。
0030nobodyさん2006/06/27(火) 04:09:20ID:???
> sub内でローカル宣言した変数がリファレンス(Cでいうポインタ)で参照できちゃう気持ち悪い部分もあってw、

何それ?
0031nobodyさん2006/06/27(火) 04:13:07ID:???
>>30
こういう事かな。レキシカルな $s が外から見える。

sub hoge {
my $s = "ababababa";
return \$s;
}

my $s_ref = hoge();
print $$s_ref;
0032nobodyさん2006/06/27(火) 04:54:57ID:???
それなかったらオブジェクトやクロージャもできないなあw
0033nobodyさん2006/06/27(火) 06:30:44ID:???
>>25
基本的にCGIのエラーは500しか出ません。
パーミッションのミスでも文法ミスでも全て500が出ます。

>プログラムやルーチンの文法ミスもないし、ファイルの参照ミスもないのに
>ファイル書き込み等をしているどこかでエラーが出てくる場合
>どういうミスの可能性があるでしょうか?
例えば代入式の途中でexit()で終了した場合なんかは
perlがエラー→何も出力されない→500となったりします。
(が、たぶんそのエラーじゃ無い気がしますが・・・

要するに一度にいっぺんに書きすぎて、デバッグできなくなった状況ですよね。
=c
=cut
という技があるのでそれで半分づつエラーの範囲を絞ってみてはどうでしょうか?
(それ以前に全部コメントアウトしprint "\n\n"だけ書いて動くのかとかも要確認。
それが動けばそこから少しずつ増やしていけば何でエラーが起きてるのか特定できるはず・・・
0034nobodyさん2006/06/27(火) 08:42:29ID:???
>>25
perl -c の結果をうpしてよ。
0035nobodyさん2006/06/27(火) 08:46:11ID:???
>32
static宣言見たいのがあればなぁ・・・と思うわけですよ
0036nobodyさん2006/06/27(火) 09:41:13ID:???
>>35
そこで Tie::Static ですよ。
0037nobodyさん2006/06/27(火) 14:12:21ID:XmLciTUK
1: 自分はこういう事がしたい。
・ファイルがなければ新規にファイルを作成し$dataAを書き込んでから$dataBを書き込む。
・ファイルがあれば(すでに$dataAは書き込み済みなので)$dataBを書き込む。

2: それでこんな風にやってみたが・・・
unless ( -e $file ) {
open ( OUT , "> $file" ) or die;
flock ( OUT , 2 );
seek ( OUT , 0 , 0 );
print OUT $dateA;
truncate ( OUT, tell ( OUT ) );
close ( OUT );
}

open ( OUT , "+< $file" ) or die;
flock ( OUT , 2 );
いろいろ処理
seek ( OUT , 0 , 0 );
print OUT $dateB;
truncate ( OUT , tell ( OUT ) );
close ( OUT );

3: こんなエラーが出て上手く行かなかった。
エラーは出てないんですが、これって同時アクセスがあった場合に
ファイル壊れる可能性ないですか?
他に良い方法があればアドバイスよろしくお願いします。
0038nobodyさん2006/06/27(火) 14:45:28ID:???
>>37
他にもある気がするが、-eしてから>でopenまでの間に割り込まれると壊れるな。
File::Tempで一時ファイルを作ってリネームするとよさげ。
0039372006/06/27(火) 15:20:15ID:???
>>38
やっぱり壊れる可能性ありますよね。

>File::Tempで一時ファイルを作ってリネームするとよさげ。
ありがとうございます。
一度それでやってみます。

他にもアドバイスがあればよろしくお願いします。
0040nobodyさん2006/06/27(火) 15:28:09ID:???
ひとつロック用のファイルを用意しといて

・ロック用ファイルをロック
・ファイル存在チェック
・無ければ生成
・オープン
・処理
・書き込み
・ロック用ファイル閉じ

モジュール使わずコレでどうでしょう
0041372006/06/27(火) 15:47:13ID:???
>>40
アドバイスありがとうございます。

一連の流れを全てロックしてしまえ、ということですね。
ただ、ロックファイル自体が信用できるかどうか怪しい代物なので
ちょっと二の足を踏んでしまいます。
0042nobodyさん2006/06/27(火) 15:55:10ID:cuOoVNQc
HTML内のフォームからファイルと時間を選択させて、
その時間になったら自動で指定ファイルをFTPで別サーバー
へ移動するという処理は可能でしょうか?
Perlでcrontabに書き出すことができればと思いましたが
レンタルサーバーでそれは許可されておりません。

cronを使用せずにperlにより指定時間になっているかどうかを
チェックして時間になっていたらFTPでファイルを移動
するような処理は可能なのでしょうか?

どなたかご存知の方居られましたら宜しくお願い致します。
0043nobodyさん2006/06/27(火) 15:57:12ID:???
http://pc8.2ch.net/test/read.cgi/php/1024795138/
こっち行ったほうがいいかな。
0044nobodyさんNGNG
もうcron関連の質問秋田
0045372006/06/27(火) 16:32:46ID:???
>>40
勘違いしてました。
flockでロックファイルをロックすれば良いだけでしたね。
ロックファイルが残り続けるのがちょっと気持ち悪いですが簡単に処理できるのは良いですね。

>>43
誘導先見ましたが、どちらかと言うとロックの追究が主のようで、例えば
open ( OUT , "+< $file" ) or die;
flock ( OUT , 2 );
いろいろ処理
seek ( OUT , 0 , 0 );
print OUT $dateB;
truncate ( OUT , tell ( OUT ) );
close ( OUT );
このコードのロック自体の有効性についての議論が中心のように見受けました。
わざわざ紹介していただいたのに不躾な言い分ですが、
私は上のようなロックでまず大丈夫という前提に立っているので
誘導先のスレよりもこちらで質問した方が適切だと思いますので
すみませんが、こちらに居させて下さい。
0046nobodyさん2006/06/27(火) 16:38:21ID:???
>もうcron関連の質問秋田
そうおっしゃらずにどうかお願いします。
過去ログ見てみても無かったので…
0047nobodyさん2006/06/27(火) 17:35:31ID:???
過去ログに何度も出てると思うよ。
cron使いたくない(or 知らない)けど定時的に何かしたいってのは。
0048nobodyさん2006/06/27(火) 17:36:54ID:???
>>37
はじめの書き出しの方のseekとtruncateは別に無くても良いと思う
0049nobodyさん2006/06/27(火) 18:26:33ID:???
ファイルをダウンロードした後、サーバ上から自動で消すことって不可能?
Locationでダウンロードするファイルに飛ばした後に
unlinkしてもダウンロードが始まる前にファイルが消えちゃう。
0050nobodyさん2006/06/27(火) 18:29:53ID:???
ダウンロードがきちんとできたかどうか分からないけど
失敗してても消すのならできそう。
■ このスレッドは過去ログ倉庫に格納されています