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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2009/09/03(木) 23:51:12ID:???
Perlのコーディングで困ってる人のスレです。

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

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

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1234752149/
0002nobodyさん2009/09/03(木) 23:52:22ID:???
[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: ttp://www.site-cooler.com/kwl/perl/

[本]
リャマ: ttp://www.oreilly.co.jp/books/4873111269/
駱駝: ttp://www.oreilly.co.jp/books/4873110963/
Effective Perl: ttp://ascii.asciimw.jp/books/books/detail/4-7561-3057-7.shtml
クックブック: ttp://www.oreilly.co.jp/books/4873112028/
Perl ベストプラクティス: ttp://www.oreilly.co.jp/books/4873113008/
Perl Hacks: ttp://www.oreilly.co.jp/books/9784873113142/

[オンラインマニュアル]
最新のドキュメント: ttp://perldoc.perl.org/
perl5.8.xのドキュメント(一部): ttp://www.kt.rim.or.jp/~kbk/perl-5.8/
perldoc きまぐれ訳: ttp://fleur.hio.jp/perldoc/
perldoc.jp: ttp://www.perldoc.jp/

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

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

[Perl5.8Unicodeメモ]
ttp://www.namazu.org/~tsuchiya/perl/perl-5.8.html
ttp://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
0003nobodyさん2009/09/04(金) 05:49:19ID:???
いちおつー。
0004nobodyさん2009/09/04(金) 13:17:39ID:???
4様
0005nobodyさん2009/09/04(金) 15:10:46ID:???
私が立てた過疎スレもどうぞよろしく

【Perl,CGI】参考書籍 第四版
http://pc11.2ch.net/test/read.cgi/php/1250989562/
0006nobodyさん2009/09/10(木) 01:26:11ID:tlO5UesG
最初の質問させていただきます。
演劇サークルで次に演じる脚本があるのですが、その脚本が、セリフが役名:セリフか役名:セリフで区切ってあり、
ト書きとわかりづらいということでhtmlのtableを使って表にしようとしたのですが、文法チェックにかけると
syntax error at C:\cgi\henkan\sreplace.cgi line 10, near ") {"
syntax error at C:\cgi\henkan\sreplace.cgi line 30, near "}"
C:\cgi\henkan\sreplace.cgi had compilation errors.
と出て、whileの実行式部分のカッコにエラーが出るし、それを削除してもsplitで値を代入する先の()が不要だ、と出ます。
次に貼るソースコードのどこに問題があるか教えていただければ幸いです。
わかりにくいと思いますので
要するに、
$fileというファイルの文を、$splitをデミリタにして$nameと$naiyouに分けて代入し、
$naiyouの値が空なら(ト書きのとき)$nameを$naiyouに代入、その内容を二つのファイルに分けて保存し、
最後にそれをまとめて二つの<TD>に$nameと$naiyouがきれいに分かれているhtmlファイルを作りたいのです。
下のコードのどこが問題なのか教えてください。
0007nobodyさん2009/09/10(木) 01:28:19ID:tlO5UesG
#!/usr/local/bin/perl

use CGI;
$q = new CGI;

$file = $q->param('file');
$split = $q->param('split');

open(FILE, "<$file")
while($ln = <FILE>) {
$ln =~ s/\n/<br>/g;
$ln =~ s/$split/$split<b>/g;

($name, $naiyou) = split(/$split/, $ln);

if($naiyou == "")
{$name = $naiyou ;
}
unless($name == ""){
$naiyou = "$naiyou</b>";
}

続きは次に書きます。
0008nobodyさん2009/09/10(木) 01:29:56ID:tlO5UesG
open(OUT,"> name.log");
print OUT "$name";
close(OUT);
open(PUT,"> naiyou.log");
print PUT "$naiyou";
close(PUT);
}

close(FILE);

open(IN,"< name.log");
@name = <IN>;
close(IN);

open(RE,"< naiyou.log");
@naiyou = <RE>;
close(RE);


print "Content-type: text/html; charset=Shift_JIS\n\n";
print "<html>\n<head><title>移動</title></head>";
print "<body><a href='kyakuhon.html'>脚本へ移動<\/a></body>\n</html>";

open(SYU,"> kyakuhon.html");
print SYU "<html>\n<head>\n";
print SYU "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=x-sjis\">\n";
print SYU "<title>Scenario</title>\n";
print SYU "</head>\n";
もう一度次です。長くなって申し訳ないです
0009nobodyさん2009/09/10(木) 01:32:15ID:tlO5UesG
print SYU "<body>\n" ;
print SYU "<table border>";
print SYU "<tr>";
print SYU "<td width=25%><b>役・備考</b></td>";
print SYU "<td width=75%><b>セリフ・ト書き</b></td>";
print SYU "</tr>";
print SYU "<tr>";
print SYU "<td width=25%><b>@name</b></td>";
print SYU "<td width=75%>@naiyou</td>";
print SYU "</tr>";
print SYU "</table>";
print SYU "</html>";
close(SYU);
長文申し訳ありませんでした
0010nobodyさん2009/09/10(木) 02:41:05ID:???
最初の open のセミコロン

今回はエラーとして出んかもしらんが、今後のためにも面倒でも use strict してくれ

それから文字列を比較するときは == じゃなくて eq な
特に空文字かどうかの比較は

$hoge eq '';
$hoge ne '';
みたいに書く癖をつけたほうがいい
0011nobodyさん2009/09/10(木) 03:07:22ID:???
open(FILE, "<$file")に ; が無い
0012nobodyさん2009/09/10(木) 07:34:56ID:xEU2hsmO
>>10-11さん
ありがとうございます。今はちょっとPCを開く時間がないので無理ですが、学校で修正したいと思います。
こんな初歩のミスだとは…
もっと頑張らなきゃいけませんね
本当にありがとうございました。
0013122009/09/11(金) 00:27:02ID:j5Qgkl9c
修正したんですが、まだ駄目でした。コードは変わってないです。
whileあたりに何か問題があるみたいなんですが、わからないです。
0014nobodyさん2009/09/11(金) 00:39:31ID:???
駄目でしたじゃなくて、○○なので駄目でしたとした方がいい。
今後全てにおいて。
0015122009/09/11(金) 00:48:46ID:j5Qgkl9c
すいません。
お二方が教えてくださったとおり変えてみたところ500エラーは出なくなったんですが、
出力したHTMLに中身が残らず、name.logもnaiyou.logも空のままでした。
while($ln = <FILE>){
#$ln =~ s/\n/<br>/g;
#$ln =~ s/$split/$split<b>/g;
#$ln =~ s/(//g;

#($name, $naiyou) = split(/$split/, $ln);

#if($naiyou eq '')
#{$name = $naiyou ;
#}
#unless($name eq ''){
#$naiyou = "$naiyou</b>";
#}


open(OUT,"> name.log");
print OUT "$ln";
close(OUT);
open(PUT,"> naiyou.log");
print PUT "$ln";
close(PUT);

close(FILE);
}
にまでしても上手くいかなかったのでwhile部分の問題だと思ったのですが、何がおかしいのでしょうか?
0016122009/09/11(金) 00:50:24ID:j5Qgkl9c
↑上手くいかなかったではなくどちらの.logも空のままだった
です。
0017nobodyさん2009/09/11(金) 10:04:31ID:???
while 内部で close(FILE); してるよ。
0018nobodyさん2009/09/11(金) 10:55:18ID:???
>>15
whileループが必ず1回で終わりますね。close(FILE)しているから。
open(OUT,"> name.log");
と
open(PUT,"> naiyou.log");
はopenに失敗しても、そのまま無視されて処理が進むので、エラートラップするのが鉄則です。
すなわち、
open(OUT,"> name.log") or die $!;
open(PUT,"> naiyou.log") or die $!;
など。$!は最後のエラーメッセージが格納される特殊変数です。
よくあるのはパス違い、書き込みパーミッションが立っていないなど。

そもそも、
open(FILE, "<$file");
が失敗している可能性もあり。それだとwhileループは実行されていないことになる。
0019122009/09/12(土) 02:32:58ID:83ZTZfsA
openは成功してました。一行だけ読み込んだら問題なく表示されたので。
そういえば、splitってデミリタがその対象になる文字列内になかったらどうなるんですか?
0020122009/09/12(土) 02:36:32ID:83ZTZfsA
あ、わかりました。
すいません。
パスも、書き込みもあってて、openできてて、コードチェックも問題なく通るのに出来ないんです。
while($ln = <FILE>)
という記述が問題になる可能性はありますか?
0021122009/09/12(土) 03:10:26ID:83ZTZfsA
度々すいません。
やっと解決しました。
全部処理は上手くいっていたのですが、openの後ろが>だったために、書くたびに内容を上書きしてしまい、
最後の行の\nだけが書き込まれるという形になっていたみたいです。
助言してくださった皆さん、本当にありがとうございました。
いつか自分ももっと精進して皆様のように初心者に優しく教えられるようになりたいと思います。
0022nobodyさん2009/09/12(土) 03:26:39ID:???
>>21
とりあえず100年ROMしてろ
0023nobodyさん2009/09/12(土) 09:20:58ID:???
> とりあえず100年ROMしてろ

ROM 期間中に死を迎えることになりそうなので、軽減してもらえませんか
0024nobodyさん2009/09/14(月) 10:33:35ID:???
>>23
誰も来なくて暇だから明日まででいいよ
0025nobodyさん2009/09/14(月) 11:59:40ID:t5y5v7j/
くだ質の方にしようかと思いましたが、こちらで投稿致します。

perl -pe "s/foo/bar/g" *.txt

これをスクリプトで書くにはどうしたらよいのでしょうか?
以下のように書くと、0バイトファイルが出来上がります・・・

opendir DH,$dir or die;
my @files = readdir DH;
closedir DH;

foreach my $file(@files){
next if $file =~ /^\.{1,2}$/;
open(FH,"+>$file");
while(my $ln = <FH>){
$ln =~ s/foo/bar/;
}
close FH;
}

よろしくお願いします。
0026nobodyさん2009/09/14(月) 12:28:27ID:???
>>25
http://perldoc.jp/docs/perl/5.10.0/perlrun.pod#item__b__p__b___p

while (<>) { s/foo/bar/g } continue { print or die "-p destination: $!\n" }

本当にやりたい事には -i オプションが抜けてる気がするけどね
0027nobodyさん2009/09/14(月) 13:03:07ID:???
>>25
opendir my $dir_fh, "." or die $!;
my @files = grep { (not /^\./) and -f } readdir $dir_fh;
closedir $dir_fh;

for my $file (@files) {
open my $fh, "+<", $file or die $!;
my @contents = map { s/foo/bar/; $_ } <$fh>;
seek $fh, 0, 0;
print {$fh} @contents;
}
やってみたいことと違うかもしれないけど
0028nobodyさん2009/09/14(月) 13:58:11ID:???
>>27 barの部分に入る文字列がfooの部分に入る文字列より短いと変なことになったので訂正
opendir my $dir_fh, "." or die $!;
my @files = grep { (not /^\./) and -f } readdir $dir_fh;
closedir $dir_fh;

for my $file (@files) {
open my $in, $file or die $!;
my @contents = <$in>;
close $in;
open my $out, ">", $file or die $!;
print {$out} map { s/foo/bar/; $_ } @contents;
close $out;
}
0029nobodyさん2009/09/14(月) 14:27:32ID:t5y5v7j/
>>26-28
ありがとうございます。
バックアップいらないから、と思いきや、上書自体-iが必要だったのですね・・・・確認不足でした。
>>26を参考に、上書ができない状態で90分ほど彷徨っていますが、これから>>27-28を試してみます。
お礼ついでに経過報告まで・・・
0030nobodyさん2009/09/14(月) 14:45:14ID:t5y5v7j/
>>28
出来ました!
しっかり噛み砕いて、自分の物に致します。
ありがとうございました。
0031nobodyさん2009/09/14(月) 18:22:59ID:???
一応書いとく。
ワンライナーが本来どう解釈されるかを見るには、B::Deparseを使う。

% perl -MO=Deparse -i.bak -pe "s/foo/bar/g" *.txt
BEGIN { $^I = ".bak"; }
LINE: while (defined($_ = <ARGV>)) {
 s/foo/bar/g;
}
continue {
 print $_;
}
-e syntax OK

そのまま必要部分をコピペしたらスクリプトの出来上り。

0032nobodyさん2009/09/14(月) 20:02:28ID:???
html template で分離されたテンプレートのほうに、
php埋め込んで稼働出来るようにならないでつか?

html templateで完成された奴をphpでコーティングしたいんだけど・・
0033nobodyさん2009/09/15(火) 01:00:11ID:???
>>32
phpからsystem関数っぽい何かでHTML::Templateで生成された文字列を返すPerlスクリプト動かせばいけんじゃないの?
phpよく知らんけど

つーかそこまでやるなら最後までPerlで組めよって思う
0034nobodyさん2009/09/15(火) 12:51:30ID:???
phpがモジュール型なら
application/x-httpd-php返せばphpがパースしてくれないかな?

text/x-server-parsed-html返すとSSI動くからいけそうな気がする。
0035nobodyさん2009/09/15(火) 18:36:40ID:???
>>34
httpdの設定によるが、普通.phpファイルをパースするようになってるんじゃないか?

print $headers;
open(FH, '| /usr/bin/php');
print FH $php_code;

とかでいーじゃん。結果が欲しいならopen3で。

PHP::Interpreter

つー手もあるぞ。
0036nobodyさん2009/09/15(火) 18:55:27ID:???
.phpが処理されるのは
AddType application/x-httpd-php .php
ってして拡張子.phpのコンテントタイプはapplication/x-httpd-phpだよ
って設定してるからで
実際モジュールはコンテントタイプみてパースするか無視するか決めてる
0037nobodyさん2009/09/15(火) 19:21:35ID:???
>>36
だからそれはサーバーアプリケーション依存だろ?
断言すんな断言を。世の中全部Apacheとか思ってそうだな。
最近はスケールとかの問題で事情が変わりつつあるぞ。
0038nobodyさん2009/09/15(火) 22:21:14ID:???
はいはいよかったね
0039nobodyさん2009/09/15(火) 22:46:47ID:???
すみません、おそくなりました。
皆様助言ありがとうございます。

application/x-httpd-php を付加してやっても駄目でした。
ソースをみるとそのままコードが出てました。

PHP::Interpreter 試してみます。
0040nobodyさん2009/09/15(火) 23:34:35ID:???
10日でおぼえる Perl/CGI という本でperl/cgiを勉強しているのですがアクセスカウンターのサンプルCGIが動かず困っています。

CGIのソースは
1 #! c:/perl/bin/perl
2
3 # カウントファイルの読み込み
4 open(IN, "<./count.dat");
5 $count = <IN>;
6 close(IN);
7
8 ++$count;
9
10 # カウントファイルの書き込み
11 open(OUT, ">./count.dat");
12 print OUT $count;
13 close(OUT);
14
15 # サーバー出力
16 print <<END;
17 Content-type: text/html
18
19 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
20 <html>
21 <head><title>あくせすかうんたー</title></head>
22 <body>
23 <p>あなたは……$count番目の訪問者です。</p>
24 </body>
25 </html>
26 END
です。count.datはちゃんとCGIと同じディレクトリにおいてあります。
ファイルの読み込みはできるようなのですが、書き込みができないようです。
「あなたは……1番目の訪問者です。」と表示されてしまいます。 どうすればいいでしょうか?
0041nobodyさん2009/09/16(水) 00:43:06ID:???
手元で試す限りではカウントアップされる。
Ctrl+F5(俗に言うスーパーリロード)でも駄目なら
書き込み部分を
open(OUT, ">./_count.dat");
に変更して _count.dat がどこに作られるか確認したらどうかな。
0042nobodyさん2009/09/16(水) 00:59:33ID:???
>ファイルの読み込みはできるようなのですが
読んでなくても「1番目の訪問者です」になるけどね。
0043402009/09/16(水) 01:00:39ID:???
>>41
レスありがとうございます

open(OUT, ">./_count.dat");

に変更してみて、実行した後、検索をかけてファイルを探したりしましたが見つけることができませんでした。
もしファイルが無かったら新しく生成されるべきなんですよね?

あと参考書がwindows版apacheを使っているのですが、そのせいでしょうか?
ちなみに読み取り専用のチェックははずしてあります。
0044nobodyさん2009/09/16(水) 04:24:42ID:???
>>36
>>39
しかも嘘じゃねーか。まるで役に立たないってのはこのことだな。
0045nobodyさん2009/09/16(水) 04:28:29ID:???
>>43
CGI置いてるってーことは所有者はあなただよね?
CGIスクリプトは別の所有者で実行されるから、パーミッションの
可能性が高いね。生成されるはずのディレクトリに移動して

chmod . 777

してみ。マニュアルみてこのコマンドが何するものか理解してな。
普通はセキュリティとか考えて別のディレクトリ掘る性質のものだから。
0046nobodyさん2009/09/16(水) 04:29:36ID:???
あーcount.datが置いてあるなら、

chmod count.dat 666

だな。こっちの方が安全だし。
0047402009/09/16(水) 04:37:30ID:???
すみません
書き忘れました。自分もwindows版apacheを使っています。
0048nobodyさん2009/09/16(水) 04:58:27ID:???
>>47
だったら単に"count.dat"か".\count.dat"じゃないの?知らんけど。Perlが面倒みてくれるのかな。
それにWindowsのパーミッションがどうなってるのか知らんけどその辺くさい。
0049nobodyさん2009/09/16(水) 05:16:30ID:???
>>36
Apacheやlighttpdで試したが動くサーバーなんてなかったぞ。
知ったか君乙。つか迷惑だからレスすんな。
0050nobodyさん2009/09/16(水) 10:10:22ID:???
>>47
普通に動く。
エラーログには何か出てないの?
0051402009/09/16(水) 10:42:38ID:???
>>50

コマンドプロンプトだと動きました。

各種ブラウザ(Opera, Firefox, Google Chrome, IE)で試したんですがだめでした。
何ででしょうか?
0052nobodyさん2009/09/16(水) 11:56:01ID:???
ロックしてないし(この構造でロックしてもロックにならないけど)、
複数のプロセスが一度にアクセスして、ファイルが壊れてるとかなら考えられるけど。

まー、情報が少なすぎて、分からん。
0053nobodyさん2009/09/16(水) 12:03:46ID:???
キャッシュ表示してるだけじゃないの?
ランダムに変わる長さの文字列を表示させるようにしてみるか
IE なら CTRL+リロード、Firefox なら Shift+リロードしてみて
0054402009/09/16(水) 12:36:56ID:???
>>53
ランダムのヤツはもうやってあって、ちゃんとランダムに毎回変わりました。

windowsでactiveperl+apacheなんですが
activeperlとapacheはCDから本と同じバージョンだし、
httpd.confもCDからまんまコピーだし

もう何がなんだか
0055nobodyさん2009/09/16(水) 12:54:14ID:???
open(IN, "<./count.dat") or die "cannot open";
こうやって、ちゃんとファイルを開けてるかみるとか
0056nobodyさん2009/09/16(水) 13:02:45ID:???
ブラウザでのキャッシュ無視リロードはやったの?
複数提案があったら出来る限り全部試せよ
0057402009/09/16(水) 13:02:53ID:???
>>55

読み込みとして開くのはできてるようなんですけど

書き込みのときうまくいっていないようです

なぜかというとcount.datの中身を
11
にしとくと

ファイルを開いて値を読み込む
↓
インクリメント
↓
「あなたは……11番目の訪問者です。」

と表示されるからです。
ホント、なんででしょう。
0058402009/09/16(水) 13:06:24ID:???
まちがえました

「あなたは……12番目の訪問者です。」
ですね

>>56
やりました
0059nobodyさん2009/09/16(水) 13:08:15ID:???
エラーログ晒してみてよ
もうなんの情報もなしにこれでは辛い
0060402009/09/16(水) 13:12:53ID:???
>>59


apacheのerror.logのでいいんでしょうか?それともほかのperlとかのログでしょうか?
ごめんなさい 知識が少ないもので、わからないんです。
0061nobodyさん2009/09/16(水) 13:16:05ID:???
apacheのerror.log で OK
0062nobodyさん2009/09/16(水) 13:19:59ID:???

[Wed Sep 16 12:01:14 2009] [error] [client 127.0.0.1] File does not exist: C:/ApacheGroup/Apache2/htdocs/favicon.ico, referer: http://127.0.0.1/tendays/3-3.cgi
[Wed Sep 16 12:01:15 2009] [error] [client 127.0.0.1] File does not exist: C:/ApacheGroup/Apache2/htdocs/favicon.ico, referer: http://127.0.0.1/tendays/3-3.cgi
[Wed Sep 16 12:01:15 2009] [error] [client 127.0.0.1] File does not exist: C:/ApacheGroup/Apache2/htdocs/favicon.ico, referer: http://127.0.0.1/tendays/3-3.cgi
[Wed Sep 16 12:01:15 2009] [error] [client 127.0.0.1] File does not exist: C:/ApacheGroup/Apache2/htdocs/favicon.ico, referer: http://127.0.0.1/tendays/3-3.cgi
[Wed Sep 16 12:01:15 2009] [error] [client 127.0.0.1] File does not exist: C:/ApacheGroup/Apache2/htdocs/favicon.ico, referer: http://127.0.0.1/tendays/3-3.cgi

アイコンのエラーだけずっとです。count.datは引っかかりませんでした。
アンチウイルスソフトは止めてあるし、再起動は何度もしました。
0063nobodyさん2009/09/16(水) 13:24:08ID:???
use CGI::Carp qw(fatalsToBrowser);
use warnings;
use strict;

を2行目に追記してみて
0064402009/09/16(水) 13:26:06ID:???
Software error:
Global symbol "$count" requires explicit package name at C:/ApacheGroup/Apache2/htdocs/tendays/3-3.cgi line 9.
Global symbol "$count" requires explicit package name at C:/ApacheGroup/Apache2/htdocs/tendays/3-3.cgi line 12.
Global symbol "$count" requires explicit package name at C:/ApacheGroup/Apache2/htdocs/tendays/3-3.cgi line 16.
Global symbol "$count" requires explicit package name at C:/ApacheGroup/Apache2/htdocs/tendays/3-3.cgi line 20.
Execution of C:/ApacheGroup/Apache2/htdocs/tendays/3-3.cgi aborted due to compilation errors.

For help, please send mail to the webmaster (webmaster@localhost), giving this error message and the time and date of the error.
0065nobodyさん2009/09/16(水) 13:34:24ID:???
my $countにしたらエラー無く実行されました。
0066402009/09/16(水) 13:39:00ID:???
ですが、ブラウザで実行してもカウンタが回りません
0067nobodyさん2009/09/16(水) 13:42:03ID:???
_count.datが生成されなかった時点でもう根本的におかしいんだが。
CDからコピーしたということは、何らかのファイルがまだ読み取り属性になっている可能性があるな。
Apacheをインストールした*フォルダ*のプロパティを開いて、読み取り属性に灰色の「レ」がついて無いか確認。
スクリプトを置いているフォルダのプロパティを開いて、同様に確認。

あとは>>55を参考に、出力側も
open(OUT, ">./count.dat") or die "cannot open";
にして試してくれ。

エラーログに痕跡がなかったら↓をenv.cgiとかの名前で実行して、結果を貼ってもらうくらいしか無いかな。
#! c:/perl/bin/perl
print "Content-type: text/plain\n\n";
foreach (sort keys (%ENV)) {
print "$_: $ENV{$_}\n";
}
0068402009/09/16(水) 14:07:10ID:???
open(OUT, ">./count.dat") or die "cannot open";
は

Software error:
cannot open at C:/ApacheGroup/Apache2/htdocs/tendays/3-3.cgi line 16.

For help, please send mail to the webmaster (webmaster@localhost), giving this error message and the time and date of the error.

となりました。

env.cgiの出力結果は

COMSPEC: C:\WINDOWS\system32\cmd.exe
DOCUMENT_ROOT: C:/ApacheGroup/Apache2/htdocs
GATEWAY_INTERFACE: CGI/1.1
HTTP_ACCEPT: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
HTTP_ACCEPT_CHARSET: iso-8859-1, utf-8, utf-16, *;q=0.1
HTTP_ACCEPT_ENCODING: deflate, gzip, x-gzip, identity, *;q=0
HTTP_ACCEPT_LANGUAGE: ja-JP,ja;q=0.9,en;q=0.8
HTTP_CONNECTION: Keep-Alive, TE
HTTP_HOST: 127.0.0.1
HTTP_REFERER: http://127.0.0.1/tendays/
HTTP_TE: deflate, gzip, chunked, identity, trailers
HTTP_USER_AGENT: Opera/9.80 (Windows NT 5.1; U; ja) Presto/2.2.15 Version/10.00
PATH: C:\Perl\bin\;C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\;C:\Program Files\Borland\BDS\4.0\Bin;C:\WINDO
WS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\ATI Technologies\ATI.ACE\Core-Static;C:\tex\
bin;C:\gs\gs8.70\bin;C:\gs\gs8.70\lib;C:\Program Files\Microsoft SQL Server\100\Tools\Binn\;C:\Program Files\Microsoft SQL Serv
er\100\DTS\Binn\;C:\Program Files\QuickTime\QTSystem\

次に続く
0069nobodyさん2009/09/16(水) 14:07:53ID:???
PATHEXT: .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
QUERY_STRING:
REMOTE_ADDR: 127.0.0.1
REMOTE_PORT: 3349
REQUEST_METHOD: GET
REQUEST_URI: /tendays/env.cgi
SCRIPT_FILENAME: C:/ApacheGroup/Apache2/htdocs/tendays/env.cgi
SCRIPT_NAME: /tendays/env.cgi
SERVER_ADDR: 127.0.0.1
SERVER_ADMIN: webmaster@localhost
SERVER_NAME: 127.0.0.1
SERVER_PORT: 80
SERVER_PROTOCOL: HTTP/1.1
SERVER_SIGNATURE: <address>Apache/2.0.54 (Win32) Server at 127.0.0.1 Port 80</address>

SERVER_SOFTWARE: Apache/2.0.54 (Win32)
SYSTEMROOT: C:\WINDOWS
WINDIR: C:\WINDOWS

でした。
0070nobodyさん2009/09/16(水) 15:10:05ID:???
>cannot open at C:/ApacheGroup/Apache2/htdocs/tendays/3-3.cgi line 16.
やっぱり出力ファイルがopen出来てないな。
しかしそれが何故かというと、他のアプリにファイルハンドルを独占されているか、
書き込み禁止属性になっているとしか考えられないんだが。うーん・・・。

環境変数には問題は見当たらないね。
0071nobodyさん2009/09/16(水) 15:26:41ID:???
>>51でコマンドプロンプトからだとカウントアップされるということだから
ファイルが書込み禁止になっているわけじゃないんだよな。
あとはApacheの設定くらいか。
0072nobodyさん2009/09/16(水) 15:29:08ID:???
>>40
open(OUT, ">./count.dat") or die $!;
としてみて、失敗した原因を捕捉するのは鉄則。
openは失敗しても致命的エラーにならない(そのまま処理が進んでしまう)。
CD-ROMのファイルをコピーして使っているなら、read-only属性が付いているとしか考えられん。
読めもしないならパスの問題もあったかも知れんが。
0073nobodyさん2009/09/16(水) 21:51:49ID:???
コマンドプロンプトで
attrib -s -h -r count.dat
ってやって、データファイルの属性変更してみて
0074402009/09/16(水) 22:47:43ID:???
みなさん

apache2.0系の最新版を入れたら直りました。

いろいろとご迷惑をおかけし、またたくさんの返答ありがとうございました。
0075nobodyさん2009/09/16(水) 22:57:57ID:???
まぁApache側の何かがRead Onlyな所為なのだろうなとは思っていたよ
真相は闇の中だが
0076nobodyさん2009/09/18(金) 13:08:12ID:???
LWP で GET するときって、取得中のファイルってオンメモリなんですか?
もし一時ファイルに保存されているなら、その場所の調べ方と変更の仕方って提供されてるんでしょうか?

10分ぐらいググってみたけど見つかりませんでした
0077nobodyさん2009/09/18(金) 13:08:46ID:???
>>76
ソース読んだら?
0078nobodyさん2009/09/18(金) 18:38:19ID:???
>>76
一気読みもできるし、少しずつコールバック呼びながら読むこともできる。
0079nobodyさん2009/09/18(金) 18:41:26ID:???
>>77
> ソース読んだら?

その前にマニュアルを読め
0080nobodyさん2009/09/19(土) 13:40:04ID:???
Rubyだと配列の任意の位置から最後までを、[n..-1]で取り出せますが、Perlではどうするのでしょうか?

arr = [0, 1, 2, 3, 4]
p arr[2..-1] #=> [2, 3, 4]
0081nobodyさん2009/09/19(土) 14:16:15ID:weAFKNKD
perl CPAN モジュールのSutatistics::Suggestがインストールできなくて困っています。

ttp://search.cpan.org/~ihara/Statistics-Suggest-0.01/lib/Statistics/Suggest.pm
上記のサイトからlinux版ダウンロードして解凍し、以下の文を実行しようとしたのですが、

perl Makefile.PL [LIBS='-L/where/to/find/libsuggest.a -lsuggest']

解凍した中身に「Makefile.PL」がありません。また後ろに続く[LIBS='-L/where/to/find/libsuggest.a -lsuggest']もよく意味が分かりません。
よろしくお願いします。

<環境>
OS:Fedora9
0082nobodyさん2009/09/19(土) 14:40:29ID:???
>>80
http://0xcc.net/blog/archives/000043.html
0083nobodyさん2009/09/19(土) 14:47:11ID:???
>>81
> 解凍した中身に「Makefile.PL」がありません。

「Linux版」の意味が不明だが、いずれにせよ、Makefile.PLはある。

また後ろに続く[LIBS='-L/where/to/find/libsuggest.a -lsuggest']もよく意味が分かりません。

"/where/to/find/"をlibsuggest.aをインストールしたディレクトリに置き換える。
0084nobodyさん2009/09/19(土) 15:03:34ID:???
>>82
ありがとうございます。
すごく参考になるサイトです。

でも自分の質問に対する答えは見つからないような。。。
0085nobodyさん2009/09/19(土) 16:52:19ID:???
>>80
my @arr = (0, 1, 2, 3, 4);
print @arr[2..$#arr];

または

my $arr = [0, 1, 2, 3, 4];
print @{$arr}[2..$#{$arr}];
0086nobodyさん2009/09/19(土) 17:01:18ID:???
>>80
print @a[5 .. $#a];
0087nobodyさん2009/09/19(土) 17:07:19ID:???
>>85-86
�d
できました。
0088812009/09/19(土) 17:32:49ID:02Qx22rD
>>83
レスありがとうございます。win版等があったので・・・

「Makefile.PL」はありませんが、「Makefile」なら解凍した中にあります・・・
ttp://search.cpan.org/~ihara/Statistics-Suggest-0.01/
ここに、「Makefile.PL」があったので、これを利用しようと思います

[LIBS='-L/where/to/find/libsuggest.a -lsuggest']はこのまま実行しないで
自分の環境に合わせて変更する必要があるんですね。ありがとうございます

最後に「libsuggest.a」は、通常何処にあるのでしょうか?よろしくお願いします。
0089nobodyさん2009/09/19(土) 20:01:27ID:???
>>88
Linuxなんだろ?
find /usr -name libsuggest.a
で探せるだろ。最近は一瞬で全ファイルシステム探せるから便利だよな。
昔はこんなことしたら怒られる上に何十分もかかった。

っていうか
http://glaros.dtc.umn.edu/gkhome/suggest/download
から
suggest-1.0-linux.tar.gz
をダウンロードしたら、その中にlibsuggest.aがあるじゃん。これインスコすれば
いいんじゃねーの?README読んだらテスト方法書いてあるからテストしろよ。
テストは大事だからな。インスコ先は/usr/local/lib/辺りでいーだろ、で、

perl Makefile.PL [LIBS='-L/usr/local/lib/libsuggest.a -lsuggest']

こーだろ。
0090nobodyさん2009/09/20(日) 09:40:10ID:WC9uameU
他WEBの質問版でも書き込みさせて頂いておりますが、こちらでも質問させて頂きます
現在、初心者ながら、PerlでCSVファイルを使って簡易的なDBを作っています
その際、下記の方法でCSVファイルの部分修正していますが、うまくいきません><
申し訳ありませんが、お知恵をお借りできますでしょうか?
困っております(泣)

◆下記プログラム内容
 CSVを読み込み、一致する部分があればそこを修正し、新たなCSVとして書き出す

◆マスターDB(カンマ区切りのCSVファイルにて作成)
 ・DBは横230×縦max2000程度(現行は横200×縦100程度)
 ・先頭、横20までは日本語で、最大でも全角50文字程度(改行、カンマは事前に除外(置き換え)しています)
 ・その後は「1 or 空白」。(フラグが立っているか、いないかだけ)

◆発生する不具合?
 (1)修正箇所の後ろの2〜3行が、修正行の後ろにそのまま追加される(欠落する場合もあり)
 (2)DBの一番最後の最後の行に不明なデータが追加される
  例1:,,,,,1,,,,,,,,1,,,,,,,,1,,,,,,,,1,,,,,,,,1
  例2:,,,,
  例3:0行目がコピーされる
  例4:改行のみ
 (3)上記、(1),(2)は基本的に同時発生
 (4)上記、(1),(2)が毎回ではなく時々発生(と言うか、かなり頻繁に… 10回に8回程…)

〜長文のため、私のソースは↓に書きます〜
0091nobodyさん2009/09/20(日) 09:44:13ID:???
>>90
まずやること。

その1、マルチをやめる
その2、もっと簡潔に記載する
その3、もっと勉強する
0092902009/09/20(日) 09:45:53ID:WC9uameU
#読み込み、及び修正
open (write_db,"+<db.csv");
flock write_db,2;
$i=0;
while(<write_db>){
@master = split(/,/, $_);
if( $master[0] == $data[0] ) {
$master[1] = $FORM{'textfield62'};
〜略〜
$master[15] = $FORM{'textfield5'};
#修正前の”1”のフラグ情報をクリア
for( $m = 21 ; $m <= $#master ; $m++ ){
$master[$m]=""; }
#修正情報の入っている@dataに基づいて@masterを変更(新しいフラグを立てる)
for( $k = 8 ; $k < $end_num ; $k++ ){
$master[$data[$k]] = 1; }
}
$write_data[$i] = join(',',@master);
$i++;
}
seek write_db,0,0;
close (write_db);

#書き出し操作
open (OUT,"+<db.csv");
flock OUT,2;
foreach my $ii ( @write_data ){
print OUT $write_data[$ii]; }
seek OUT,0,0;
close (OUT);
0093nobodyさん2009/09/20(日) 10:11:43ID:???
>>92
それ、DBD::CSVでできるから。CSVファイルに対して

SELECT * FROM table WHERE id > 1 ORDER BY id

とかできちゃうから。なんでそんなもの作ってるのか謎すぎる。
0094nobodyさん2009/09/20(日) 10:36:14ID:???
デバッグという概念も失われつつある
0095902009/09/20(日) 10:49:27ID:WC9uameU
>>93
理由があり、DBD::CSVは使えませんでした。
今後はそれも視野に入れ行っていきたいと思いますが、
まずはDBD::CSVを使わない場合での解決を目指しております。

>>94
実行時に修正前データ、修正後データ、書き込みデータの表示を行い
データ内容の確認を行っておりますが、その時点では問題はありません。
(CSVファイルとして書き出され、それをエディタ等で見た場合にデータがおかしくなっております)
上記に加え、確認する方法もご指摘頂けると幸いです。
0096nobodyさん2009/09/20(日) 11:16:04ID:???
>>95
>まずはDBD::CSVを使わない場合での解決を目指しております。
間違った判断だな。
理由って大した理由じゃないだろ。言ってみろ。自分でやってみたいとかそんなんだろ。
絶対これ直すよりDBI::CSVの方が早い。

このままじゃ無理。全面書き直し。
コードに定数が入れるな。機能をモジュールに分けろ。Test::Moreでテストを書きまくれ。
0097nobodyさん2009/09/20(日) 12:09:18ID:???
> 理由って大した理由じゃないだろ。言ってみろ。自分でやってみたいとかそんなんだろ。
> 絶対これ直すよりDBI::CSVの方が早い。
自分でやることの大切さは早いとか遅いとか関係ない、分かってないな。
0098nobodyさん2009/09/20(日) 13:11:31ID:???
本日は、弊店ガラガラ
----------------------------------------------------------------------
0099nobodyさん2009/09/20(日) 13:15:31ID:???
>>97
一度検討したくらいだから早さが大事なんだろ。
まあ確かに最近の風潮として、大したコードでもないのに
useが10〜20行くらい並んでるの見ると萎えるな。
0100nobodyさん2009/09/20(日) 13:19:29ID:???
テキストファイルはテキスト中に文字を
挿入しようとしても挿入にはなりません
上書きされるのが正常動作です


意味不明な文字が現れるのは、日本語
2バイトのうち1バイト分が上書き
されてしまうので
0101nobodyさん2009/09/20(日) 17:35:24ID:???
環境はWindows、使ってるのはActivePerl、文字コードはCP932とエスパーしてみる。
しかし、%FORMが謎。

とりあえず、Text::CSV_XSを使ってみて。
■ このスレッドは過去ログ倉庫に格納されています