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

Perl コーディング初心者質問コーナー Part34

■ このスレッドは過去ログ倉庫に格納されています
0001前スレの連投で気分崩したので後よろ04/04/05 16:01ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0696nobodyさん04/05/11 12:08ID:yHiP+CIC
>>695
やっぱり書き込んでいる真っ最中のデータを読み込んだり、
読み込んでる最中に書き込み始めたりしちゃうわけですね。
システム側でなんとかしてくれるのかと思ってました。

共有ロック、取り入れてみたいと思います
ありがとうございました
0697nobodyさん04/05/11 13:57ID:xHapOBBn
Location ヘッダは、Locationヘッダをブラウザに返しブラウザが指定したファイルに飛ぶのか、
サーバーがLocationヘッダで指定されたファイルを返すのか、
どちらでしょう? どちらでもなければ、それを教えてください。

0698nobodyさん04/05/11 14:09ID:???
>>697
前者
0699nobodyさん04/05/11 14:25ID:???
すいませんが、コンパイルの仕方を教えてくれないでしょうか?
サーバをテストに使ったらファイルが消えた時に責任取れないんで
ローカルでテストしたいんですがどうすれば・・・
0700nobodyさん04/05/11 14:51ID:???
Perlはコンパイルせずとも動きますが。
0701nobodyさん04/05/11 14:55ID:???
MySQLをPerlから操作しようとしました。
そしたらinstall_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC ...
とエラーがでました。
恐らくモジュールが入ってないのかと思いますが
どうすればインストールできるでしょうか。
一応、Msql-Mysql-modules-1.2219と言うのをDLしてきましたが
root権限など持っていないので説明にある方法ではインストールできません。
cgiとおなじフォルダにmysql.pmを置いてやれば動くような気もしますが
取り敢えず/mysql/libの中身をまるごと置いてやっただけでは動きませんでした。
070269904/05/11 15:42ID:???
テキストファイルに書いたプログラムをデバッグする方法が知りたいのです
0703nobodyさん04/05/11 15:49ID:???
>>702
winのローカル環境で動かしたいなら
http://x-web.pobox.ne.jp/fcgi/fcgi_01.html
が分かりやすいと思います
0704nobodyさん04/05/11 17:05ID:???
>>694-702
スレ違い
070569904/05/11 17:35ID:???
では、私はどこへ行けばいいのでしょうか?
とりあえず上のリンク先には行ってきましたが・・・
0706nobodyさん04/05/11 17:40ID:???
http://pc5.2ch.net/test/read.cgi/php/1078991985/l50

この人のところに文法チェッカーが配布されとる
0707nobodyさん04/05/11 18:02ID:???
<!--user-->という文字を、<a href="$usaddress">($usaddressは変数展開される)
という文字に変換したいのですが、
$line =~ s/<!--user-->/<a href="$usaddress">/g;
では変換されません。
どこが間違っているのでしょうか?
0708nobodyさん04/05/11 18:06ID:???
>>707
Perlがこわれています。再インストールをしてください。
0709nobodyさん04/05/11 18:12ID:???
>>699
ActivePerlでぐぐれ。
071070704/05/11 18:24ID:???
>>708
それってマジレスですか?
0711nobodyさん04/05/11 18:31ID:???
おれ708じゃねーけど、手元のperlではこうなるからな。
これは普通には変換されているというと思うのだが。

% cat user.pl
$usaddress = "foo";
$line = "<!--user-->";

$line =~ s/<!--user-->/<a href="$usaddress">/g;

print $line, "\n";
% perl user.pl
<a href="foo">
071271204/05/11 19:08ID:j+/3ilVK
http://sumiro2.hp.infoseek.co.jp/cgi-bin/abc/bbbs.cgi
の掲示板なのですが、専用アイコン以外の普通のアイコンが表示されません。
中身は↓のようになってます。どうしたらいいのか、教えてください。お願いします。
http://sumiro2.hp.infoseek.co.jp/afraid/bbs.txt
0713nobodyさん04/05/11 19:18ID:???
>>712
ここはコーディングスレなのでスレ違い。
071471204/05/11 19:20ID:???
うぅぅぅ・・
すいません・・・
0715nobodyさん04/05/11 19:36ID:???
>>714
スレ違いだが、たらい回しにされて可哀想なので一言・・。
http://sumiro2.hp.infoseek.co.jp/afraid/bbsimg/ここにアイコンを格納。
>$imgurl = "./img/";
を
>$imgurl = "http://sumiro2.hp.infoseek.co.jp/afraid/bbsimg/";
に変更。
0716nobodyさん04/05/11 20:04ID:???
( ゚д゚)ハァ?
071770704/05/11 20:54ID:???
>>711
すいません、1からそのように書いたら動きました。
なんか全角スペースかなにか入ってたのかもしれません。
ありがとうございます
0718nobodyさん04/05/11 21:28ID:M72HBXcr
電気ストーブが出来たんですが、鯖エラーになります。どこを修正したらいいんでしょうか

http://pc5.2ch.net/test/read.cgi/php/1010583350/68
071971804/05/11 21:40ID:M72HBXcr
コンソールでperl -cw stove.plとしてチェックしても
特にエラーは出ていません。

しかし、Windows2000 + Apache2 + perl5.6.1では
鯖エラー500が出てしまいます。
どの辺がまずいのでしょうか?
0720nobodyさん04/05/11 21:43ID:???
flock とか使ってたりして・・・
072171804/05/11 21:48ID:M72HBXcr
コマンドプロンプトで
perl stove.pl
としたら、htmlのソースが表示されました。
これはサーバの問題でしょうか?
それとも、ソースに不備があってもコマンドプロンプトでは表示されるんでしょうか?
0722nobodyさん04/05/11 21:50ID:???
CGIの拡張子設定が .pl になってないんじゃ?
072371804/05/11 21:52ID:M72HBXcr
あ、stove.plは
http://pc5.2ch.net/test/read.cgi/php/1010583350/68-69
に分けて貼ってあるソースです。
0724nobodyさん04/05/11 21:58ID:???
>>718
http://www.rfs.jp/sitebuilder/perl/03/02.html
0725nobodyさん04/05/11 22:04ID:???
なんかふざけたやつだな。
答える気にならん。
072671804/05/11 22:17ID:lgCnMYEo
>>722
アドバイスありがとうございます。
拡張子設定はplになっています。

>>724
ありがとうございます。
よく読んでみます。
072771804/05/11 22:23ID:lgCnMYEo
>>724
print "Content-type: text/html", "\n\n";

が抜けていた為だったようです。

おかげで、エラーは出なくなりました。
しかし、ONボタンを押してもストーブが付きません。
なぜでしょうか?
072871804/05/11 22:37ID:lgCnMYEo
自己レスです。

’O N'などとスペースを入れてしまっていました。
ONに直して動くようになりました。
0729nobodyさん04/05/12 00:31ID:cFb5OXA3
�@$hoge->a='1';
�A$hoge->a('1');
�Bif ($hoge->a eq '1'){

}
�@左辺値としても使えて、$hoge->{'a'}に'1'をセットする
�Aみたいに引数で$hoge->{'a'}にセットできて
�Bみたいに引数が与えられない場合$hoge->{'a'}の値を返す
ようなメソッドを書きたいのですけどどうやったらいいのか判りませんです
どっかで見た気がするけど見つからないです
気が向いたら教えてくださいまし
0730nobodyさん04/05/12 02:08ID:???
>>729
http://perldoc.com/perl5.8.4/pod/perlsub.html#Lvalue-subroutines

require 5.006;

sub Foo::foo : lvalue {
  my $self = shift;
  @_ and $self->{'-foo'} = shift;
  $self->{'-foo'};
}

my $obj = bless {} => 'Foo';
$obj->foo = 'foo!'; print $obj->foo; # foo!
$obj->foo('bar!'); print $obj->foo; # bar!
0731nobodyさん04/05/12 04:19ID:???
質問です。
配布しているcgiに以下の記述がありました。
2ch型掲示板でID生成部分の一部です。

> $id = crypt($identify,"${year}S\.E${mday}X${mon}");

crypt関数への第二引数の部分で、「S」や「\.」、「E」、「X」はただのノイズ用文字なのでしょうか?
\記号が含まれてるため何か意味を持つのではないかと思い質問いたしました。

引用元 ttp://www.toshinari.net/ 「2chブラウザ対応掲示板」
0732nobodyさん04/05/12 06:17ID:???
>>731
http://perldoc.com/perl5.8.4/pod/func/crypt.html
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/crypt.3.html
0733nobodyさん04/05/12 10:27ID:???
>>729
Attribute::Property
http://search.cpan.org/~juerd/Attribute-Property-1.05/
とかも。」
073473104/05/12 11:58ID:???
>>732
回答ありがとうございます。

saltは先頭が$1$以外の場合、通常先頭2文字を使うため、
$id1 = crypt($identify,"${year}"); # 104
$id2 = crypt($identify,"${year}S\.E${mday}X${mon}"); # 104S.E12X4
のどちらでも同じ結果となりました。(v5.8.2 built for MSWin32-x86-multi-thread)
もし何らかの要因で各変数が空だとしてもEとXは不要になると思うんです。
ひょっとしてコーディングミスなのでしょうか。
0735nobodyさん04/05/12 12:54ID:???
>>734
それは作者のみぞ知る、だな。
0736nobodyさん04/05/12 13:00ID:???
>>731のやり方で2chと互換性のあるトリップ生成できるの?
もしそうならこの話題継続キボン
073773104/05/12 13:19ID:???
>>735
どうもありがとうございました。

>>736
トリップはトリップキーをplainに、トリップキーの2文字目3文字目をsaltに、
足りない場合はH.を末尾に置き、後ろからn文字取ればn桁トリップになります。
$trip = substr(crypt($key, substr($key."H.", 1, 2)), -8); # 8桁トリップ
2chでもしたらばでもトリップ生成方法は同じのようです。
私の質問したID部分は、本家2chの場合トリップよりも複雑になっているようですが。
0738nobodyさん04/05/12 13:38ID:???
for と foreach の内部処理は同じという事を初心者板で見ましたが、
では foreach(@array) は for のように書けるのでしょうか。
こちらでは for($i = 0; @array; ++$i) とかやってみたのですがエラーが出ました。
0739nobodyさん04/05/12 13:39ID:???
初心者スレでした。
0740nobodyさん04/05/12 13:52ID:???
for(@array)
for($i=0; $i<@array; $i++)
0741nobodyさん04/05/12 14:05ID:???
という事は最終的に
for($i = 0; $i < @array; $_ = $array[$i], ++$i)
のような感じになってるのですね。
スッキリしました。
0742nobodyさん04/05/12 14:42ID:???
◆ 全サーバトリップ統一作戦
http://qb3.2ch.net/test/read.cgi/operate/1067245837/
0743nobodyさん04/05/12 16:37ID:???
>>741
単にforとforeachを交換しても実行するバイトコードは変わらない、というだけの話だと思うが。
for(@array){ ... } # OK
foreach(my $i = 0; $i < @array; $i++){ .. } # OK

for($i = 0; $i < @array; $_ = $array[$i], ++$i){} はfor(@array){}に比べると
ずっと遅い、$_がlocal化されない、$_を書き換えても@arrayの要素は変わらない、などの違いがあるしな。
0744nobodyさん04/05/12 16:58ID:???
>>743
添字使いたいときもfor(my $i = 0; $i < @array, $i++) {...} よりfor(0..$#array) {...}の
方が速いよね。なんとなく0..$#arrayのリストを最初に作ってから〜とかしそうで
最初は抵抗あったけど、試してみるとその辺は処理系がよろしくやってくれてる
みたいだし。
0745nobodyさん04/05/12 19:03ID:???
無効コンテキストの場合、演算子の位置はどちらが見易いですか。
多くの人はポストのようですが。
#オプティマイザが勝手にプリにしてくれるのはラクダ本で理解
0746nobodyさん04/05/12 23:29ID:???
>>745
インクリメント・デクリメント演算子のことか?

普通はポストだが、C++のコードを読み書きした直後はついプリにしてしまうね。
0747nobodyさん04/05/12 23:33ID:???
$a++
++$a

ってことか?
0748nobodyさん04/05/13 00:54ID:???
$hoge++; で統一だな。
C#かなにかも後置推奨だった木がするので。
最もC#などとPerlじゃ変数の命名規則も違うけど
0749nobodyさん04/05/13 05:29ID:???
>>748
もっと色々のコーディングをしてみると前置も後置も便利なのが判るかと思います。
0750nobodyさん04/05/13 06:04ID:???
場合によって使い分けろってことだな。
0751nobodyさん04/05/13 06:06ID:???
プリデクリメントとポストインクリメント固定。
アセンブラとCからの習慣。
0752nobodyさん04/05/13 10:08ID:???
メール送信のプログラムを書いているのですが、
サーバの環境上、Dateフィールドが自動で設定されません。
そこで、自力でDateフィールドを

Date: Wed, 12 May 2004 08:50:48 +0900

のように書きたいのですが、書き方がわかりません。
(途中まではわかるのですが、下記例の最後の行がわかりません)
どなたかご存じの方、教えていただければ幸いです。

# 日時の取得 $ENV{'TZ'} = "JST-9";#タイムゾーンの設定
$times = time();#時刻を取得
($sec,$min,$hour,$mday,$month,$year,$wday,$stime) = localtime($times);
$month++;
$year = $year + 2000;
@month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
@weekly = ('Sun', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sut');#表示したい曜日文字
$Date = sprintf?(ここ不明)

0753nobodyさん04/05/13 10:30ID:???
>>752
http://perldoc.com/perl5.8.4/pod/func/sprintf.html
http://www.rfs.jp/sitebuilder/perl/05/05.html#sprintf
075475204/05/13 10:57ID:???
>>753
すみません、それをみてもちんぷんかんぷんでして。。。
できれば>>752のケースの例を教えていただけませんでしょうか?
そこから勉強したいと思いまして。
すみませんが、よろしくお願いいたします。
075575204/05/13 11:33ID:???
以下のように、sprintfを3回つかうことはできたのですが、1回ですます方法がわかりません。
sprinfの中でカンマを表示したく、それはどのようにすればいいのでしょうか?

$ENV{'TZ'} = "JST-9";#タイムゾーンの設定
$times = time();#時刻を取得
($sec,$min,$hour,$mday,$month,$year,$wday,$stime) = localtime($times);
$year = $year + 1900;
@month_array = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
@weekly_array = ('Sun', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sut');#表示したい曜日文字

$hour = sprintf( "%02d", $hour );
$min = sprintf( "%02d", $min );
$sec = sprintf( "%02d", $sec );
my $Date = qq|$weekly_array[$wday], $mday $month_array[$month] $year $hour:$min:$sec +0900|;
0756nobodyさん04/05/13 11:39ID:???
$date = sprintf("Date: %s, %02d %s %04d %02d:%02d:%02d", $weekly[$wday], $mday, $month_array[$month], $year, $hour, $min, $sec);
0757nobodyさん04/05/13 11:40ID:???
$weekly[$wday] を $weekly_array[$wday] に修正しといて。
0758nobodyさん04/05/13 11:47ID:???
>>755
strftime使った方が楽じゃない?

use POSIX qw(strftime);
my $Date = strftime("%a, %d %b %Y %H:%M:%S %z", localtime);

sprintf(printf)の使い方も憶えといて損はないと思うけどね。激しく基本だと思う。


0759nobodyさん04/05/13 11:49ID:???
>>755
# JST == GMT + 9 時間
my $time = time + 9 * 60 * 60;
my $diff = '+0900';

my($sec, $min, $hour, $mday, $month, $year, $wday) = gmtime $time;
my @month = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
my @wday = qw(Sun Mon Tue Wed Thr Fri Sut);

my $Date = sprintf
  'Date: %s, %02d %s %04d %02d:%02d:%02d %s',
  ($wday[$wday], $mday, $month[$month], $year + 1900, $hour, $min, $sec, $diff)
;

# 別解
my $Date = sprintf
  'Date: %s, %02d %s %04d %02d:%02d:%02d %s',
  (split /\W+/, scalar gmtime $time)[0,2,1,6,3,4,5], $diff
;
0760nobodyさん04/05/13 13:09ID:???
my $Date = "Date: " . `/bin/date -R`;
色々な方法があるかと。
0761nobodyさん04/05/13 18:00ID:???
スレ違いかどうか自信ないけど、質問。
Perlでの変数の値域ってどうなっているんでしょう?
文字列で扱うときはいいんですけど、数値で扱うときはどこまで大きい数字が扱えるかは、
Perlのバージョンとかで違うのでしょうか?
0762nobodyさん04/05/13 20:48ID:???
±999999999999999
0763nobodyさん04/05/13 20:53ID:???
>>761
perl -V してみる。
0764nobodyさん04/05/13 22:13ID:???
>>761
Perlのバージョンでは基本的には変わらない(perl6になれば変わるかもしれない)が、
バージョンは同じでもコンパイルオプションやOSによって異なる可能性がある。
まぁ普通はこんな感じだと思うが。小さすぎると思うならMath::Big(Int|Float)で。

> perl "-V:[in]v(size|type)"
ivsize='4'
ivtype='long'
nvsize='8'
nvtype='double'
0765nobodyさん04/05/14 04:19ID:7/s5Izsl
crypt関数の使用可否によって処理を振り分けたくて、以下のようなコードを書きました。

# crypt関数使用可否チェック
undef $check_crypt;
$check_crypt = eval { crypt('1111', '11'); 1; }; # ここが23行目
if ($@) { $check_crypt = 2; }

if ($check_crypt == 1) { crypt関数が使える時の処理 }
elsif ($check_crypt == 2) { crypt関数が使えない時の処理 }
else { 不明な時の処理 }


これを、-wオプション付で構文チェックすると

Useless use of a constant in void context at c:\www\〜\xxx.cgi line 23.

と注意されたのですが、どこが問題なんでしょうか?
このままでも使用に問題は無いのですが、少し気になるので・・。
よろしくお願いします。
0766nobodyさん04/05/14 05:21ID:???
>>765
戻り値を使うべき関数であるところの crypt() が
無効コンテキスト (void context) に置かれているから。

my $check_crypt = eval { crypt('1111', '11') } ? 1 : $@ ? 2 : 0;

とか

if (eval { crypt('1111', '11') }) { 使用可能 }
elsif ($@) { 未実装 }
else { crypt が何らかのエラー }
0767nobodyさん04/05/14 06:02ID:???
>>755
use HTTP::Date;
my $Date = time2str(time()+60*60*9);
$Date =~ s/GMT/+0900/;
とか。

>>761
use Config;
print "このシステムでは、\n",
"整数型(IV)はCで言うと$Config{ivtype}で、バイト長は$Config{ivsize}バイト\n",
"実数型(NV)はCで言うと$Config{nvtype}で、バイト長は$Config{nvsize}バイト\n";
いろいろ調べてみては。
076875204/05/14 10:31ID:???
皆様、いろんな解法ありがとうございます。
参考になります。

sprintfもなんとなくわかってきました。精進します。
ありがとうございます。
0769nobodyさん04/05/14 10:36ID:???
Perlで例えば2004/5/14と言う日付のデータが在ったとした時
その日はその月の何週間目になるか調べる方法は在りますか?
この場合3が取得できるようにしたいです。
077076504/05/14 10:52ID:???
>>766
レスありがとうございます。
問題の箇所を
$check_crypt = eval { crypt('1111', '11') } ? 1 : $@ ? 2 : 0;
と書き換えることにより、無事解決することができました。

無効コンテキストというものに理解が弱く、検索や書籍で調べても
まだ完全に理解するまでには至っていないのですが、
crypt関数の戻り値を利用すべき所なのに利用していなかったことが
問題だったのですね?
ちゃんと理解できるまで、もっと調べてみます。

ありがとうございました。
0771nobodyさん04/05/14 11:57ID:???
>>769
これのような気がする。
http://search.cpan.org/~amurren/DayOfNthWeek-1.0/

違ったら適当に探してくれ。
http://search.cpan.org/search?m=all&q=Date&n=100
0772nobodyさん04/05/14 12:19ID:???
>>769
問題の説明が曖昧だ。「その月の何週間目」という言い方はあまり
しないと思うのではっきりと定義して欲しい。

多分、月を週に分割してそのいくつ目に入るかって意味だとは思う
のだが、週の始まりは何曜日かとか、最初の週は0週目なのか
1週目なのかとかといった数え方の好みがあるだろうし。

Date::Manip使うかPOSIXのstrftimeの%Uか%W使うかだろうなぁ。
0773nobodyさん04/05/14 16:41ID:???
すみません、
.htpasswdで発行されたパスワードとIDを保存してあるリストを、
perlで組んだCGI(例えばBBSやチャット)の認証の際に利用したいと
思っているのですが、htpasswdで暗号化されたパスワードとBBSとかの
フォームに入力されたパスワードをコンペアする良い方法はないものでしょうか。
0774nobodyさん04/05/14 16:47ID:???
>>773
Apache::Htpasswd
077576104/05/14 20:16ID:???
レス�dくすです。
調べてみます。
0776nobodyさん04/05/14 23:19ID:???
>>769
日付から曜日を求めるツェーラの公式ってのがあったと思う

ちと、検索しても全然引っかからない…
その公式の事を書いてあった本も見つからない…

質問は「調べる方法は在りますか?」なので
ありますと言っておこう。
0777nobodyさん04/05/14 23:26ID:???
ったく。しゃーねーなぁ
ツェーラーも見つけられないのか
[(y+[y/4]-[y/100]+[y/400]+[13m+8]/5+d)%7]
0778nobodyさん04/05/14 23:54ID:???
>776
Zeller の公式(普通ツェラーと表記すると思う)はあくまで曜日(というか日数)を求めるものなので、
それだけでは単純に何週目という値が出てこない。
以前 CGI 関係のスレで質問があって書いてみたことがあるけど、もうひとひねり必要。
0779nobodyさん04/05/14 23:58ID:???
ツェラーで検索したら直ぐ引っかかったよ。
0780nobodyさん04/05/15 00:03ID:???
>778
って言うか、前スレだったよ…_| ̄|○

Perl コーディング初心者質問コーナー Part33
http://pc5.2ch.net/test/read.cgi/php/1078076768/934
0781nobodyさん04/05/15 10:55ID:???
zellerでぐぐるといろいろやってる人がいるね。

「日曜=0曜日というルールだと2004/5/1は6曜日。
2004/5/16はカレンダーで21マス目に現れる。」
これから気付けばint使って簡単に書けるでしょ。
0782lock04/05/15 11:43ID:if9npvZf

あの、最近CGIを作らんとならんコトになりまして、
ファイルのロック関係を調べたのですがちょっとお馬鹿な俺の脳味噌では理解出来ませんでした。

取り敢えずめんどう事は避けたいので、実行ロックをかけてプロセスが同時に動けないようにしたいです。
初めての経験なので負荷とか速度は気にしないことにして、安全を優先させるつもりです。

fllckを使って実現させようと思っているのですが、どのように記述すれば最も安全なのでしょうか?
開発環境はwin98ですが、本番の実行環境はUNIX系のOSです。
お馬鹿な質問で申し訳ありませんが、どなたかよろしくお願いします。
0783nobodyさん04/05/15 12:05ID:???
最大接続数を1に設定するよろし
0784nobodyさん04/05/15 12:20ID:???
>>782
安全優先ならちゃんと仕組みを理解してから使う。
急を要するならどこかから似たCGI探してから丸投げスレで頼みこむ。
0785nobodyさん04/05/15 13:09ID:???
>>782
もう一台、検証用にマシンを用意してLinuxか*BSDでもインスコ
したほうがよい。
現行のwin98をwin2000以降にしてVMwareって手もあるが。
0786名無しさん04/05/15 14:51ID:???
>>782
とりあえずWindows98ではflockがかからなかったと思うのだが。。
UNIXの中にもかからんのがあるらしい。
0787nobodyさん04/05/15 15:01ID:???
>>786
http://perldoc.com/perl5.8.4/pod/perlport.html#FUNCTION-IMPLEMENTATIONS
078878204/05/15 17:32ID:MHBM3z7f
ロックについて少しだけ分かってきました。
検索すると以下のコードに辿り着いたのですが、

open(OUT, "+< outfile.txt");
flock(OUT, 2);
truncate(OUT, 0);
seek(OUT, 0, 0);
print OUT "........";
close(OUT);

これはイツロックが解除されてるんでしょうか?
closeの時にファイルハンドルといっしょに消滅してるの??
と言いますか実行ロックがやりたいんだけど、プログラムの先頭に
open(OUT, "+< outfile.txt");
flock(OUT, 2);
これを書きっぱなしにしたらダメですか?
0789nobodyさん04/05/15 17:37ID:???
>>788
>プログラムの先頭に(略)これを書きっぱなしにしたらダメですか?
プログラムの開始はそこじゃないですよ。
スタートアップルーチン,perl_alloc,construct,parse(,run)して初めて(Perl)プログラムの先頭に行くわけです。
0790nobodyさん04/05/15 17:51ID:???
>>788
実行ロックって何よ?
脳内用語を使うな
079178204/05/15 18:08ID:MHBM3z7f

すみません、実行ロックは実行フェーズに対するロックの意でした。
つまり、インタプリタに引き渡された直後の実行フェーズの一番初めの処理としてロックをかけ、
それ以後の処理を複数のプロセスが同時に動いてほしくないと言うことです。
0792nobodyさん04/05/15 18:08ID:???
LOCK_EXをlock_executingの略だと思っているとか。んなわけないか。
0793nobodyさん04/05/15 18:25ID:???
なんかウザくなってきたな。
0794nobodyさん04/05/15 18:27ID:???
>>791
BEGINブロック作ってそこでflock。
そして、ENDブロックでclose。

壊れてもいいファイルだから、closeを書かなくても、
CGIなら問題ないのだろうけど、書いておくのがお約束。
0795nobodyさん04/05/15 18:33ID:jlBwPWFJ
Perlどっかから貰ってきて、
掲示板のデザイン変えようとしてもどこにHTML書けばいいか分かりません。
属性名を変数にしてPrintで書けば良いの?
■ このスレッドは過去ログ倉庫に格納されています