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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん05/03/10 00:47:16ID:sT66OcmD
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0075nobodyさん05/03/11 17:25:44ID:???
>>72
4回目だろ、とかいう突っ込みはありかな
0076nobodyさん05/03/11 18:45:46ID:stOV0FtX
こんなのは?
print "3回目" if /^3$/;
0077nobodyさん05/03/11 19:20:11ID:???
横着したがるのもたいがいにせいよと
0078nobodyさん05/03/11 20:08:10ID:???
>>10
$value =~ s/\xa4\xa5/`/g;
$value =~ s/\xa5([\xa1-\xfe])/\xa4$1/g;
$value =~ s/`/\xa4\xa5/g;
0079nobodyさん05/03/11 20:13:17ID:???
>>10
ところで、ひらがな→カタカナの変換はあれで大丈夫?

$value = "ばぅばぅ";
$value = "靴が痛い";

こんなのが、ちとヤバイと思うのだけれど。

>>60
大抵は先頭だね。
でも、配布するモジュールでもなければ好きな所に書いていいと思うよ。
(それから、encodingは、エンコードを始める位置で宣言する必要があるはず。)

>>72
sub at($);

for(1..4){
print "3回目" if at 3;
}

sub at($){ $_ == shift }

# 意味不明な世界へようこそ。
00806005/03/11 21:13:35ID:???
>>79
やっと来た・・・・・

やはり先頭ですよね。でももしも間違って
100行目: use DBI;
.
.
.
700行目: use DBI;

とかしても表面上にはエラーにならないくらいだから、内部的にも何の問題もないんですよね?(encordingなどは別として)
0081nobodyさん05/03/11 21:30:45ID:???
use はコンパイル時に評価されるのでは?
実行時に評価されるのは require で。
0082nobodyさん05/03/11 21:43:35ID:???
>>80
useやrequireは何度呼び出しても問題にはならないことになっている。
モジュールを先頭で呼び出すのは分かりやすくする為にすぎないので、実際に使う分にはどこに書いても構わない。

0083nobodyさん05/03/11 21:57:38ID:???
>>80
大丈夫。

http://www.harukaze.net/~mishima/perl/man/perlfunc.1.html
> use Module
> 指定したモジュールから、現在のパッケージにさまざまな
> 内容をインポートします。 多くは、パッケージのサブル
> ーティン名や、変数名に別名を付けることで、実現されて
> います。 これは、
>
> BEGIN { require Module; import Module LIST; }
>
> というのと、全く同値です。

> require EXPR
...
> ファイルは、同じ名前で 2 回読み込まれることはありま
>せん。

http://www.harukaze.net/~mishima/perl/man/perlvar.1.html
> %INC ハッシュ %INC は、do や require によってインクルード
> された、個々のファイル名をエントリとして持っています。
> key は指定したファイル名で、value は実際に見つかった
> 場所となっています。 require コマンドは、指定された
> ファイル名が既にインクルードされているかを、この配列
> を使って調べます。
0084nobodyさん05/03/11 23:40:01ID:???
モジュールの依存関係がわかりやすいように
useは頭に並べておくのが良いと思います。
0085nobodyさん05/03/11 23:55:38ID:???
自分のサイトでだけ使うサブルーチンライブラリなんかで、
後からどんどんルーチンが増えていく時に、useだけルーチンから出しておくと、
何かと面倒。

なので俺は両方に書いてる。
0086nobodyさん05/03/12 00:26:54ID:???
Perlで会員制ネットショップのCGIを組むとします。

ログインとかログアウトってどうやるんですか?
CGI::Session使えば簡単なセッションはできますが、相手のIDとPASSをセッションファイルに入れればいいのかな?
なんかセキュリティ云々がよくいわれてますが、どちらにしても言うほどのセキリティなんか実装しようがないですよね。

つまりどのレベルまですれば一般レベルなのかということです。

CGI::sessionでセッションIDはクッキーに焼くことで渡し、セッションファイルにIDとパスを。
IDとパスが実在すればログイン状態。

↑これはセキリティ的に足りないでしょうか?
0087nobodyさん05/03/12 00:43:48ID:???
>>86
・IPの一致チェック
・cookieはディスクに保存させない
・可能ならSSLを使用
スクリプト作成者にできることはこれくらいでは。

それと、パスは保存する必要なしかと。
0088nobodyさん05/03/12 02:35:22ID:DLGfeKNq
すいません。四捨五入させなさいとはどう記述すればいいのですか?m(__)m
0089nobodyさん05/03/12 03:03:55ID:???
>>86
セッションで渡り歩かなくても済むような構成にしてしまうのも手。
渡り歩いた履歴はCookieに溜め込んで、最後のページでIDとPassを入力させて完了とか。

>>88
int()をちょいと工夫すればOK。マイナスには気をつけるよろし。
0090nobodyさん05/03/12 07:24:17ID:???
PerlMagickは初心者でOKなんかな。
透過PNGの出力ができないんだけど、仕様ですか?
(透過しない)

透過GIFならできました。
0091nobodyさん05/03/12 08:11:23ID:???
>>88
$num>0 ? int($num+0.5) : int($num-0.5);
0092nobodyさん05/03/12 14:10:22ID:???
>>91
小数点切り上げもそれくらい短くすっきりとできませんか?
0093nobodyさん05/03/12 15:33:01ID:???
$num==int($num) ? $num : int(++$num);
0094nobodyさん05/03/12 15:53:09ID:???
>>93
おお!!
0095nobodyさん05/03/12 17:09:44ID:???
その短いコードが何をやってるかぐらい理解しようや
0096nobodyさん05/03/12 19:44:08ID:???
>>60
ちょっといまさらだけど。
useは、通常の実行文ではなくて、コンパイル中に実行される文だから、普通は先頭。

例えば、
1 + 1;
use hoge;
2 + 2;
とか、書いてしまっても、
絶対にuseから処理される。

if(bool){
  use hoge;
}
とか書いても、ifとか、そんな次元じゃなく、
1番最初にuseが処理される。
だから、普通は先頭に書く。

実行結果は、どこに書いても同じになるかもしれないけど、やっぱ普通は先頭。

スコープに影響するプラグマモジュールなら、話は別で、
適切な場所に書いておくよろし。
(ただし、この場合も実際にはuseは最初に処理されている)。

requireは、実行中に処理される普通の文なので、常に適切な場所が良いと思う。
でも、どこに書いても構わないなら、やっぱ先頭がいいなー。わかりやすいから。
0097nobodyさん05/03/13 08:25:22ID:oiuJgK8i
掲示板つくってるのですがログを読み込んで全部配列に入れて処理してます。
メモリやばいですよね?
0098nobodyさん05/03/13 08:32:34ID:???
>>97
whileで処理した方がいいなぁ
0099nobodyさん05/03/13 08:58:13ID:???
>>97
ログの大きさにもよるが、負荷考えるならまず
書き込んだらhtmlに吐き出すタイプにしような。
0100nobodyさん05/03/13 11:22:33ID:???
>>95
ん?どこが難しいの?
0101nobodyさん05/03/13 11:44:21ID:???
パーミッションの変更はchmodで出来るけれど、
確認する方法はある?
0102nobodyさん05/03/13 12:53:41ID:???
>>101
ファイルテスト演算子
0103nobodyさん05/03/13 13:32:47ID:???
ふつー
chmod … || die
0104nobodyさん05/03/13 15:24:50ID:???
>>87
テンポラリクッキーを使うのですか?でもそれって相手側に協力を求める必要があるんですよね。
IPチェックはちょっと面倒ですが、ログイン時の人間であるかどうかを確認するとセキリティの向上には
なかなかの効果がありそうですね。
SSLは当然です^^

>>89
それだとちょっと利便性が落ちそうですね。
会員価格とかが実現しづらくなります。


あ、IPチェックも無理だ・・・・・
携帯は確か毎回違うIP提出してくるキャリアがあるんだった・・・・

0105nobodyさん05/03/13 15:25:19ID:???
remove関数
0106nobodyさん05/03/13 17:40:44ID:???
>>105
誰に?
0107nobodyさん05/03/13 18:35:32ID:???
コーディングのスレじゃなくて
perl全般の質問スレになったの?
0108nobodyさん05/03/13 18:39:04ID:???
うん。
0109nobodyさん05/03/13 23:36:26ID:???
>>107
っていうか分ける意味がわからんだろ
0110nobodyさん05/03/14 01:38:13ID:???
>>109
でも、WebProgにあるのにActivePerlのインストール方法とか聞く奴がいるからなあ。
0111nobodyさん05/03/14 11:03:24ID:???
>>110
それはスレを分けても変わらないでしょ。
基本的にこの板内のPerl関係の質問は大抵同じ人間が回答してるんだから
個人的には分割することに意義を感じられないな。まあ既に分かれてるものを
無理してくっつける必要があるというわけではないけどさ。
0112nobodyさん05/03/14 13:44:36ID:???
確かに板自体がもうずっと人少な杉だし
回答者はどのスレでも一緒だろうな

そろそろどっかとまた合併すんじゃね?
0113nobodyさん05/03/14 14:07:00ID:???
そもそもマとムとwebprogと分けるに至った経緯が知りたい。
ヲタク板なんて細分化する必要ないのになぁ。
0114nobodyさん05/03/14 14:52:44ID:???
ゲ製も別だし
0115nobodyさん05/03/14 16:09:47ID:???
ユーザ層が違うんだよ。
0116nobodyさん05/03/15 10:01:02ID:3Ik8WJWF
gzip圧縮転送についてですが
tp://tech.bayashi.net/pdmemo/gzip.html
これを/bin/gzipでなくCompress::Zlibでやりたいのですが
open(STDOUT,"| $gzip -1 -c");の部分をどのように処理すればいいか
分かりません。どなたかご教授願います。
0117nobodyさん05/03/15 10:28:44ID:???
ttp://aspn.activestate.com/ASPN/CodeDoc/Compress-Zlib/Zlib.html かな
0118nobodyさん05/03/15 11:26:01ID:???
>>115
ユーザ層ごとに分けてどうするのよ。どうせ同じPerlだろ。
周辺関連に差は出るが、広い意見だったりちょっと関係ない知識までつくのが大手掲示板の利点でしょ?

CGIは作れるがwindowsで使える簡単なソフトは作れないなんていう人はこの板には結構いそう。
なんかもったいない。みんな一緒なら、知らずに目に入って付く知識で十分できるようになるのに。

って個人的な意見ゴメンね,(__),
0119nobodyさん05/03/15 11:53:16ID:???
>>115が言いたいのはマ、ム、ウェブプ、ゲ製で
扱われる言語や話題のユーザー層が違うってことだろ
012011605/03/15 11:56:36ID:3Ik8WJWF
>>117
ご回答ありがとうございます。
教えていただいたwebに私のやりたい処理と似たような処理が紹介されてましたが
ちょっと違う感じです。スクリプト内部にprint文で書かれた内容全部をgzip圧縮させて
転送させたいです。スクリプトを貼り付けると、以下のような感じで処理したいです。
##の部分がうまくいきません。

#!/usr/bin/perl
use Compress::Zlib;

if ($ENV{'HTTP_ACCEPT_ENCODING'} =~ /gzip/) {
 print "Content-type: text/html\n";
 if($ENV{'HTTP_ACCEPT_ENCODING'} =~ /x-gzip/){
  print "Content-encoding: x-gzip\n\n";
 } else {
  print "Content-encoding: gzip\n\n";
 }

## ここで$bufferに<h1>Hello world</h1>以下の出力内容全てを代入したい

 print Compress::Zlib::memGzip($buffer);

} else {
 print "Content-type: text/html\n\n";
}

print "<h1>Hello world</h1>";
print "aaaaaa";
0121nobodyさん05/03/15 12:24:33ID:???
>>120
printした後は標準出力に渡されるのでPerlでは圧縮しようがないのだが。
パイプでつなぎたくなければ圧縮してからprintするしかなかろう
0122nobodyさん05/03/15 12:35:49ID:???
すいません。助けてください。
ID番号の出るスレッドに書き込みしたのですが
どうしてもそのレスを消したい場合に方法はないのでしょうか?
すごく困っています。絶対入れてはならないことをレスしてしまったもので・・
0123nobodyさん05/03/15 12:39:02ID:???
>>122
レスの削除は、削除依頼板。
http://qb5.2ch.net/saku2ch/
0124nobodyさん05/03/15 12:52:16ID:???
>122
どこやねwん
012511605/03/15 13:03:28ID:???
>>121
ご回答ありがとうございます。
tp://www.rfs.jp/sitebuilder/perl/02/08.htmlを参考にして子プロセスを作ることで出力を$bufferに代入することができました。
回答していただいた方々ありがとうございました。
参考までに成功したスクリプトを貼っておきます。(直したほうがいいところは指摘お願いします)

#!/usr/bin/perl
use Compress::Zlib;

if ($ENV{'HTTP_ACCEPT_ENCODING'} =~ /gzip/) {
print "Content-type: text/html\n";
if($ENV{'HTTP_ACCEPT_ENCODING'} =~ /x-gzip/){
print "Content-encoding: x-gzip\n\n";
} else {
print "Content-encoding: gzip\n\n";
}

if( open BUF, "-|" ){
while ($buf = <BUF>) {
$buffer = $buffer.$buf;
}
close(BUF);
print Compress::Zlib::memGzip($buffer);
exit(0);
}
} else {
print "Content-type: text/html\n\n";
}
print "<h1>Hello world</h1>";
print "aaaaa";
0126nobodyさん05/03/15 13:05:48ID:???
>>125
その汚さなんとかしろよ
012712505/03/15 13:06:21ID:???
すいません。全角でインデントするのを忘れてました。
それ以外で直したほうがいい部分は指摘ください。
012812205/03/15 13:31:20ID:???
削除スレ教えていただきありがとうございます。
ですが、とてもじゃないけど、該当する項目がなくって無理でした。
というのが、自分の独り言を赤裸々にタイピングしてる途中に、
間違って「書き込む」のボタンを押してしまったんです。
しかも、人に知られたら恥ずかしいし、どうしようもない内容なんです。
で、IDが1日たっても変わってなかったってのもあって、きっと誰かが
それに気付いて恥をかくか、煽りの的になるなーと思うと、もー気になって
気になってパニックしてます。書き込みは慎重に行うべきですね。
0129nobodyさん05/03/15 15:54:03ID:???
>>127
いや、全角インデントとかの話じゃなくてさ。
まあ好きにしてくれ。
0130nobodyさん05/03/15 15:54:46ID:???
>>128
というか何を血迷ってここに書き込んでるんだ?
Perlとどういう関係があるんだよ。
0131nobodyさん05/03/15 16:10:30ID:???
DBIでMySQLにつないでるんですが、例えばnameフィールドが重複してるデータだけ検索するのって可能ですか?

MySQLだけでは無理だと思うのでPerlでやるしかないと思うのですが、

name,age,mail
太郎,19,[email protected]
次郎,28,[email protected]
....

こういうデータからnameの重複文だけ表示させたいのです。
こういうのって1回ずつやらないといけないのでしょうか?

my $data = select 1番目のデータ取得
my @重複 = select 色々 where name=$data

みたいに。(変な書き方ですみません。)


dataの中から例えばメールアドレスが重複してるのがあるかないか、あるなら
それをすべて表示。
一発で[email protected]という値がいくつ重複してるか、[email protected]がいくつ重複してるかを調べたいのです。
0132nobodyさん05/03/15 16:27:56ID:???
>>131
全データのnameフィールドを取り出してハッシュで数えれば一撃。

0133nobodyさん05/03/15 16:40:21ID:???
>>125-126
そう? 少し気になるとこもあるけど、まだマシな方だと思うなあ。
というわけで >>126 お手本プリーズ
01344805/03/15 16:49:20ID:???
>>131
>MySQLだけでは無理
普通にできますが
SELECT count(*) AS `count`, * FROM `table` GROUP BY `name` HAVING `count` > 1 ORDER BY `count` DESC
013513405/03/15 17:01:28ID:???
確認したらエラーが出たので訂正
SELECT count(*) AS `count`, `name` FROM `table` GROUP BY `name` HAVING `count` > 1 ORDER BY `count` DESC
0136nobodyさん05/03/15 19:02:33ID:???
>>131
対象列がnameからmailに変化してるのにワロタ
0137nobodyさん05/03/15 22:04:08ID:???
ム板の香具師にこのスレが低能集いスレに扱われている件について
0138nobodyさん05/03/15 22:04:56ID:???
>>125
見ただけでもヘッダのつき方が滅茶苦茶だと思う。
問答無用で圧縮されたものを送っているというのも。
013913805/03/15 22:06:55ID:???
おっと、ブラケットを読み間違えてた。ごめん。
0140nobodyさん05/03/15 22:09:23ID:???
>>137
どっちも見てる奴がほとんどじゃないの?
0141nobodyさん05/03/15 22:09:47ID:???
>>138-139
>>137
0142nobodyさん05/03/15 22:17:03ID:???
いや、でも誤読を誘発しやすそうなコーディングではあると思うよ。
014313805/03/15 23:51:35ID:???
腹が立ったので書き直してみた。
圧縮された内容にヘッダが付かないようにしたのと、
forkに失敗したときの対策。

my $pid;
if ($ENV{HTTP_ACCEPT_ENCODING} =~ /((?:x-)?gzip)/){
    my $encoding = $1;
    if ($pid = open(BUF, "-|")){
        local $/;
        my $buffer = <BUF>;
        close(BUF);

        print "Content-encoding: $encoding\n",
            "Content-type: text/html\n\n",
            Compress::Zlib::memGzip($buffer);
            exit;
    }
}
if (not defined $pid){
    print "Content-type: text/html\n\n";
}

print <<"EOF";
<html>
<head><title>test</title></head>
<body><h1>Hello world</h1><p>test-test</p></body>
</html>
EOF
exit;
0144nobodyさん05/03/16 00:23:12ID:???
if ($ENV{HTTP_ACCEPT_ENCODING} =~ m/((?:x-)?gzip)/ and open BUF, '-|'){
    my $encoding = $1;
    local $/ = undef;

    print "Content-Encoding: $encoding\n",
          "Content-Type: text/html\n\n",
          Compress::Zlib::memGzip <BUF>;

    close BUF;
    exit;
}

print "Content-Type: text/html\n\n",
      <<"EOF";
<html>
<head><title>test</title></head>
<body><h1>Hello world</h1><p>test-test</p></body>
</html>
EOF
0145nobodyさん05/03/16 01:23:42ID:???
144 > 143 ?

しかし local $/ = undef; っていいな、使える。 いままで気づかなかったよw

コードはいいけど、HTML中途半端なのは何でかなw
どうせ省略するなら title と p だけでいいのに。
0146nobodyさん05/03/16 06:44:11ID:???
>>144
圧縮する内容物にもヘッダが付きますが、必要ですか?
014712505/03/16 08:48:11ID:???
>>143-144
きれいに修正ありがとうございます。
活用させていただきます。
0148nobodyさん05/03/16 11:21:44ID:uAWX38vA
htmlファイルをopenして、その中のリンクを取り出し、アンカー名 URL、というふうにしたいのですが、
URL中に?があるときだけうまく取り出せません
念のためエスケープしてもうまくいきません
たすけて

348 while ($main=~m/(<a href=\"(.*?)\">(.*?)(?: +?)?(?: +?)?<\/a>)/ig){
349 $matc1=$1;$matc2=$2;$matc3=$3;
350 if ($matc2 eq $matc3){
351 $main=~s/\Q$matc1/$matc2/;
352 }else{
353 $main=~s/$matc1/$matc3 $matc2/;
355 }#if else;
356 }#while;
0149nobodyさん05/03/16 13:37:59ID:???
>>148
いろいろ無駄っぽw

$main =~ s{<a href="(.*?)">\s*(.*?)\s*</a>}{ ($1 eq $2) ? $1 : $1 .' '. $2 }eig;
0150nobodyさん05/03/16 13:40:10ID:???
あ、: $2 .' '. $1 か。
0151nobodyさん05/03/16 14:36:59ID:???
>>150
別にeqまでしなくていいでしょ。それならtitleとか考慮したら?

s{<a\s+.*?href="(.*?)".*?>\s*(.*?)\s*</a>}{$2 $1\n}ig;

0152nobodyさん05/03/16 15:11:14ID:???
> 別にeqまでしなくていいでしょ
え、なんで?
>>148 でそう書いてるなら、その条件で書くべきなのでわ。
どっからどこまでしたいのかなんてわからないよ。
あと、考慮するなら s オプションもつけとけば。
0153nobodyさん05/03/16 16:46:33ID:???
>>152
ごめん本人のコードは汚いから全く読んでないんだ^^;
日本語だけ読んだ。

ごめんよ〜。
0154nobodyさん05/03/16 17:55:11ID:???
> 汚いから
ワロタw
まあ>>148は参考にするよろし。
0155nobodyさん05/03/17 06:55:12ID:???
すみません、質問です。コードを書いて構文チェックしてみたらsyntaxエラーが出て、
色々と絞ってみると下記のコードがエラーの原因だと分かったのですが、どのように治せばいいのでしょうか?
while ( my ($code, $ress) = each(%DATA{'expect'}) ) { }
%DATA{'expect'}はハッシュのハッシュです。これを%DATAに変えてみるとエラーが出なかったので、
ハッシュのハッシュをeachにぶちこんでるのが何か悪いのかな、と思いましたが解決方法が分かりません。。
どなたかご教授して頂けると幸いです。
0156nobodyさん05/03/17 07:36:06ID:???
%{ $DATA{'expect'} }
01579705/03/17 11:09:03ID:???
>>98
はいwhileで1行づつ読み込んで処理しようと思います。ありがとうございます。

>>99
Flash用なのでテキストに書き出すことにしまふ。ありがとうございます。
015812505/03/17 12:01:21ID:???
再びの質問で大変恐縮なんですが、もう1つ教えてください。
>>143のスクリプトでgzipの圧縮レベルを設定してみたのですが
Compress::Zlib::deflateInit( -Level => 1 );
という行を追加してCompress::Zlib::memGzip($buffer)の内容をファイルに書き出してみて
ファイルサイズを調べてみたのですが
-Level => 1の場合と-Level => 9の場合とでファイルサイズ変わんないのですが
使い方間違ってますか?
$bufferの中身はいろいろ変えてみましたが、やはり変わりませんでした。
0159nobodyさん05/03/17 13:27:19ID:+OmKbfyB
質問です。
多数のファイルを生成する際に、ファイル名としてユニークな名前がほしいのですが
Perlの定石としてはどんな方法を用いるのでしょうか?

timeからファイル名を作ろうかと思ったんですが、同じ名前になることもあるだろうし
通し番号を持つのも面倒だし、と思いまして。
0160とうかつ05/03/17 13:38:35ID:ZeP4drG9
perlのファイルアップロードに関する質問です、よろしくお願いします。
HTMLの<INPUT type="file">フォームで指定したファイルをcgiと同じ場所にアップロードしたいと思っていますが、
どうしても成功しません。、以下に関連ソースを書きます。

●フォームHTMLの中の記述
<FORM>
<INPUT type="file" name="pic_file_name" size="80">
<INPUT type="button" value="写真の追加" onClick=doAddPic()>
</FORM>
※この<FORM>〜</FORM>内に他に多数の<INPUT>あり。

●フォームHTMLのJavaScript記述
<SCRIPT language="JavaScript">
<!--
function doAddPic()
{
  document.Form.action = "./pic_upload.cgi";
  document.Form.method = "post"
  document.Form.enctype= "multipart/form-data";

  document.Form.submit();
}
//-->
0161とうかつ(続き)05/03/17 13:39:20ID:ZeP4drG9
●pic_upload.cgi
use CGI;
my ($buffer);
$CGI::POST_MAX = 1024 * 1000; # max = 1MB

# オブジェクト作成
my $query = new CGI;

my $file_handle = $query->upload('pic_file_name');

# ファイル保存
my $save_name = "UploadFile.xxx";# 名前は仮
open (OUT, ">$save_name") || die "Can't open Savefile!";

binmode (OUT);
while(read($file_handle, $buffer, 1024))
{
  print OUT $buffer;
}

close (OUT);
close ($file_handle);
0162とうかつ(続き)05/03/17 13:39:57ID:ZeP4drG9
・cgiは最後まで正常に走る。
・"UploadFile.xxx"ファイルは作成されるが、中身に書き込まれない。
・途中 print "$file_handle"; としても何も出力されない。
・クエリーname 'pic_file_name' でファイル名は送られている。ほかのINPUTデータについても正常に送られている。
・フォルダの権限は777
・perlのバージョンはv5.8.0

apacheは自分でインストールした物ですので特別な設定が必要だったらかけている可能性も考えられます。
もし可能性がありましたら教えて下さい。
何とか動かしたいと思っていますのでご支援お願いします。
0163nobodyさん05/03/17 13:44:23ID:???
>>159
定石とか知らんけど

my $file = time();
while (-e $file . '.txt') { $file++; }
$file .= '.txt';

とかじゃね?
0164nobodyさん05/03/17 13:55:35ID:???
>>163
それだけだと危ないよ。

>>159
1個のプロセスがファイル作成関連処理のをしている間は
他プロセスにはさせないようにしれ。
0165nobodyさん05/03/17 13:57:08ID:???
>>162
>・"UploadFile.xxx"ファイルは作成されるが、中身に書き込まれない。
>・途中 print "$file_handle"; としても何も出力されない。

もう答えは出てるじゃん。アホ?
0166nobodyさん05/03/17 13:59:10ID:???
>>164
じゃあ一旦 temporary.txt に書き出した後、
>>163 でチェックして rename するとか。 ダメ?
0167nobodyさん05/03/17 14:01:44ID:???
>>160
まず不必要でしかも微妙そうなそのJavaScriptをやめてみるとこから始めてみるのはどうだろう?
0168とうかつ05/03/17 14:11:41ID:ZeP4drG9
>>167
早速やってみました、JavaScriptを抜いた普通のHTMLでやってみましたところ
正常にアップロード出来てしましました、ありがとうございます。

それはそれでまた困ったな…submitボタンの区別が出来ない…
0169nobodyさん05/03/17 14:18:07ID:???
>>166
誰やねんおまえは。159か?
普通に排他処理使って特定ファイルを開いてる間に本処理をやればいい。

>>168
お前はこのスレ以前の問題なんじゃないか?
0170とうかつ05/03/17 14:29:11ID:???
>>169 JavaScriptは別の所で質問させていただきますね
0171nobodyさん05/03/17 14:29:18ID:???
>>159
Perl の定石はしらないけど、漏れはいつも djb 風に、
sprintf("%d.%d.%d", time(), $$, $uid++);
みたいなのを使ってます ($uid はプロセス内で unique になる数字) 。
ファイルシステムをネットワークで共有している場合は、
さらにこれにホスト名も付けます。
0172nobodyさん05/03/17 14:34:28ID:???
>>168
できたのかw
で、なんで submitボタン〜 とか考える必要があるの?
というか type="button" で submit させる方がいかがなものかと。
とりあえず class と CSS で指定しとけば 「区別」 はつくんじゃないの?

>>169
いやファイルロックの話じゃなくて、ユニークなファイル名をつけたい、って話なのだよ。
0173nobodyさん05/03/17 15:59:43ID:???
>>172
だからAというファイル名がユニークであるか確認してからAというファイルを新規に作成
するには排他処などで他のプロセスをとめないいけないんだよ。

もしかして新規作成するファイルをロックするとかいう勘違いしているのかな?
01744805/03/17 16:24:48ID:???
>>173
>>171みたいにプロセスIDを付け加える方法はどうでしょうか
■ このスレッドは過去ログ倉庫に格納されています