【Perl 】初心者コーナーPart8
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001名無しさん@お腹いっぱい。
01/10/24 14:11ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。
参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://ebi.2ch.net/test/read.cgi/php/988809842/l50
CGIの質問はこちら【CGIだけど、なんか質問ある?part4】
http://ebi.2ch.net/test/read.cgi/php/1000804655/l50
過去ログ、その他の役立ち情報は>>2-10を見よう。
0896892
01/12/25 01:19ID:SHv7CWw6どうもありがとうございます。
読んでたんですけど、低次元なレベルなもので
代入だと別なのかも・・・と思いまして。
0897892
01/12/25 03:25ID:qZ0BU43GWHILEで処理してる間に(これは読み取りのみで開いた)
別の処理が書きこみしても大丈夫でしょうか?
例えば
#処理1
open (FILE,./file.dat)
while(<FILE>){〜〜〜;}
close FILE;
#処理2
open (FILE,">./file.dat")
print FILE $hogedata;
close (FILE);
みたいな感じでAさんが処理1をやってる場合に
Bさんが処理2をやるというのは問題無いですか?
0898892
01/12/25 03:27ID:qZ0BU43Gclose (FILE);です。
0899名無しさん@お腹いっぱい。
01/12/25 04:08ID:???0900遅いか
01/12/25 07:28ID:???ファイルハンドルはリストコンテキストだと全てを(メモリに)読み込み
スカラーコンテキストだと一行読み込みます。
foreach(){}の()とか配列、リストを左辺に置く代入文は右辺は
リストコンテキストで評価されます。
面倒なときはscalar(オブジェクト)で強制的にオブジェクトをスカラーで評価できます。
while(<IN>){}は$_=<IN>の省略なのでスカラー評価でメモリは抑え目です。
0901名無しさん@お腹いっぱい。
01/12/25 07:44ID:???問題ある。
同時に1つのファイルを読み書きすると
おかしなデータを読み込むかもしれない。
処理1側で @data = <FILE>; とやっていてもダメ。
flock関数について調べると吉。同時に読み書きできないようにできる。
蛇足だけどPerl5くらいから,組み込まれたり事前に宣言されている関数は
open FILE, '> ./file.dat';
close FILE;
みたいに ()無しでも使える。
0902イヤーソ
01/12/25 12:56ID:???0903名無しさん@お腹いっぱい。
01/12/25 16:46ID:mgSxI3Lqそれを順に並び替えて(123、132、213、231・・・・・のように)
全パターン出力する書き方を教えてください。
よろしくお願いします
0904名無しさん@お腹いっぱい。
01/12/25 17:17ID:???0905903
01/12/25 17:27ID:???@a="A","B","C";
を
画面上で
ABC
ACB
BAC
BCA
CAB
CBA
の表示させたいのです。
よろしくお願いします。
0906名無しさん@お腹いっぱい。
01/12/25 17:36ID:???それってPerlの話?それともアルゴリズムの話?
Perlの話なら、とりあえず疑似コードかCでアルゴリズム書いてみ。
0907名無しさん@お腹いっぱい。
01/12/25 17:37ID:???もし分かったら二度と戻ってくるな
もし分からなかったらお前は正真正銘完全完璧にプログラムには
向いてないからやっぱりもどってくるな、諦めろ
0908名無しさん@お腹いっぱい。
01/12/25 17:43ID:???0909名無しさん@お腹いっぱい。
01/12/25 17:46ID:???&permutation( [], 1 .. 999999 );
sub permutation{
my $stack = shift;
unless( @_ ){
print "@$stack\n";
return;
}
for( my $i=0; $i<@_; $i++ ){
push @$stack, $_[$i];
&permutation( $stack, @_[0..$i-1], @_[$i+1..$#_] );
pop @$stack;
}
}
何で皆怒ってるの?
0910名無しさん@お腹いっぱい。
01/12/25 17:46ID:???0911903
01/12/25 17:46ID:???はてはて?
0912名無しさん@お腹いっぱい。
01/12/25 17:49ID:???お前みたいに相手の言っていることも性格に読み取れないようなヤツは
正真正銘完全完璧にプログラムには向いてないからやっぱりもどってくるな、諦めろ(p
0913デフォルトの名無しさん
01/12/25 17:53ID:???0914名無しさん@お腹いっぱい。
01/12/25 20:23ID:Ca6wsnSBNET::FTPモジュールが入ってるかどうか確認するにはどうしたらいいでしょう?
0915名無しさん@お腹いっぱい。
01/12/25 20:31ID:???押すとパスクラックしてくれるCGIの作り方教えて
0916892
01/12/25 20:45ID:Is9/IN8sレスありがとうございます。
度々申し分けないのですが、
#処理1
open (FILE,./file.dat)
while(<FILE>){〜〜〜;}
close FILE;
〜〜〜〜〜〜〜〜; #この処理は重要では無いので
〜〜〜〜〜〜〜〜; #処理1で空データを読み取ってしまっても構わない
#処理2
open (FILE,./file.dat)
while(<FILE>){〜〜〜;}
close FILE;
#処理3
open (FILE,">./file.dat")
print FILE $hogedata;
close (FILE);
上のような一連の流れの場合、処理1ではそのまま読み取って(ロック無しで)
処理2で再度読み取り、この読み取ったデータを元に処理3で
ファイルに書きこむ場合は処理2の前でロックすれば良いのでしょうか?
あと私の覚えてる範囲だとロック処理を行う理由は
別のユーザーが実行したプロセスが
ユーザー1のプロセスがファイルに書きこんでる最中に
ユーザー2が読み取ると空のデータを読み取ってしまい
このデータを元にファイルに書きこむと空データになってしまう。
それを防ぐためにロック処理をしてる。
と覚えてるのですが、他にも理由というのはあるのですか?
0918名無しさん@お腹いっぱい。
01/12/25 22:57ID:???ただの紳士協定です。
有るプロセスが排他ロック(LOCK_EX)すると他のプロセスは排他ロック(LOCK_EX)
が出来なくなるだけで、共有ロックは勿論、読み込みも書き込みも自由に出来るということです
今書いてるのはCGIみたいですが、ややこしければ深く考えずに2行目でロックして
exitする前にアンロックでも大抵は十分です
0919名無しさん@お腹いっぱい。
01/12/25 23:00ID:JNXKMJjKそうですか。スクリプトの内容というか、
よく上のような場面の処理1で、ロックがかかってるか
調べてから読み取った方が良いのかな?
と考える場面があったので(mkdir方式でロックしてます)
レスありがとうございます。
0920名無しさん@お腹いっぱい。
01/12/25 23:00ID:???処理時間1分とかなら別ですよ :-)
0921名無しさん@お腹いっぱい。
01/12/25 23:16ID:???perldoc -l Net::FTP
とか
perl -e "use Net::FTP"
など
処理1はどうでもいいわけでしょ?
処理2〜3で扱うデータとの整合性が必要ないならそれでいい
ただタイミング的に(別プロセスとの関係で)おかしいデータを取り得るって
ことじゃないの?
それがいやなら(=整合性は要らなくても正しいデータが欲しいなら)処理1の前に
ロックしてしまえと
0924名無しさん@お腹いっぱい。
01/12/26 00:46ID:???∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ピュ.ー ( ・∀・)< わーぃ♪
=〔~∪ ̄ ̄〕 \________
= ◎――◎
0925名無しさん@お腹いっぱい。
01/12/26 00:51ID:gQqjt0L+それはそうと>>815
できないこともないけど1度やったら捕まるね。
0926名無しさん@お腹いっぱい。
01/12/26 00:53ID:???0927名無しさん@お腹いっぱい。
01/12/26 01:59ID:ONuCP+Nn$hash{__PACKAGE__} = "hogehoge";
だと、"__PACKAGE__"と言うキーのハッシュ値ができてしまいます。
今は、
$packagename = __PACKAGE__;
$hash{$packagename} = "hogehoge";
と2行で書いているんですが、もう少しスマートな書き方はありませんか?
0928名無しさん@お腹いっぱい。
01/12/26 02:46ID:xizBefjbdefined $hash{'keyname'}
とかそーゆーんじゃなくて?
0929名無しさん@お腹いっぱい。
01/12/26 03:20ID:???$hash{__PACKAGE__}は $hash{"__PACKAGE__"}と
等価だから、基本的にはそのやり方しかないんじゃないかなぁ。
$hash{''. __PACKAGE__} =1;とかでもいけることはいけるけど。。。
0930名無しさん@お腹いっぱい。
01/12/26 03:42ID:???そうですね。
レスありがとうございます。
0931914
01/12/26 03:52ID:FVfGl49Uありがとうございます。
0932名無しさん@お腹いっぱい。
01/12/26 08:23ID:???$hash{+__PACKAGE__}
0933JAPU ◆JAPUTeX.
01/12/26 09:36ID:???LOCK_EX されると、LOCK_SH で flock を呼び出したときもブロックされます。
(もちろん、LOCK_NB ビットも立てた場合はそのまま失敗する。)
通常、書き込みを伴う処理については LOCK_EX を、読み込みのみの処理のと
きは LOCK_SH を指定します。これだと、書き込みするときは他のプロセスか
ら読み書き両方できず、読み込みする場合は他のプロセスから読み込みのみ可
能となります。
あと、open FH, "> ..." とした場合はその瞬間にファイルサイズが 0 になっ
てしまうので、ロックする意味がないです。>> とか +< で open しておいて、
truncate とかするのがよい。
蛇足ながら、ファイルをクローズ、またはプロセスが終了した時点でロックは
解除されます。
0934名無しさん@お腹いっぱい。
01/12/26 14:44ID:???func ($foo,$hoge,$poyo,$baz,$biz);
のように長い引き数が有る関数の呼び出しで、func内で@_に入った値を
任意の名前にエイリアスする方法は有りませんか?
少し前まで直接$_[3] = '100'; の様に代入してたんですが、とても読みにくいので
今はリファレンスを貰ってます
でも、これでも参照外しが大変なので、せっかく参照呼出しなのだから
何か良い方法が無いかなと思ってしまって・・・
よろしくお願いします。
0935名無しさん@お腹いっぱい。
01/12/26 14:48ID:Y7QEtnjdfunc内で
my (*foo,*hoge,*poyo,*baz,*biz) = \@_;
の様にして一発でエイリアスを張る事って出来ないですかね。。。
0936名無しさん@お腹いっぱい。
01/12/26 15:12ID:???Perl って Call by reference じゃないと思うけど。。
0937名無しさん@お腹いっぱい。
01/12/26 15:44ID:???print S "Referer: $ENV{'HTTP_REFERER'}\r\n";
print S "User-Agent: $ENV{'HTTP_USER_AGENT'}\r\n\r\n";
だけで十分ですかね?
やっぱり全部送ってやったほうが良いでしょうか?
また、そう言う場合もっとすっきりやる方法はありませんでしょうか?
0938名無しさん@お腹いっぱい。
01/12/26 15:46ID:???0939名無しさん@お腹いっぱい。
01/12/26 16:33ID:???my ($out, $in1, $in2) = (0 .. 2);
sub foo{
# $_[ $in1 ] と$_[ $in2 ] を使って何か演算をする
$_[ $out ] = $result;
return 1; # 成功
}
}
こんなのはどうだろうな。まぁ馬鹿げているが。
0940名無しさん@お腹いっぱい。
01/12/26 16:39ID:???事前にこんなようなの書いとけばできる。
sub func(\$\$) {
local($one,$two) = @_;
}
0941名無しさん@お腹いっぱい。
01/12/26 17:40ID:o9s6aZoqひょっとして 頻繁に起動されるスクリプトでLOCK_SHを使っている場合,
LOCK_EXを掛けようとすると延々待たされますか?
0942名無しさん@お腹いっぱい。
01/12/26 17:48ID:???そんな彼方にはプロセス丸ごと排他を推奨
0943名無しさん@お腹いっぱい。
01/12/26 17:50ID:???LOCK_SHしてるやつがいなくなるまで待つ。
だからクリティカルセッションはなるべく短めにすること。
0946934
01/12/26 19:03ID:Y7QEtnjd押し切るとlocal使う事になりそうですね、、、
Call by referenceはCの様に関数間で値をmoveするんじゃなくて、
見かけ上、引き数が呼び出し先に突き抜けてくるという意味で書きました
これはプロトタイプでも解決出来ないですよね、、、、
取り合えずconstな値はローカルにコピーして、書き換える時は@_を直接
書き換えることにします (でもやりにくいなぁ・・・
0947940
01/12/26 19:14ID:???sub swap(\$\$) {
local(*one,*two) = @_;
($two,$one) = ($one,$two);
}
でリファレンス渡しになる。
使う時はswap($aaa,$bbb); みたいに書く。
0948名無しさん@お腹いっぱい。
01/12/26 19:52ID:???参照呼出しで合ってる、俺も前にちょっと考えてenumしたりしたけど結局大きい変数とかは $_[] に書いてるよ
0949916
01/12/26 21:06ID:???>open FH, "> ..." とした場合はその瞬間にファイルサイズが 0 になっ
てしまうので
データが空になる瞬間を間違えて覚えてました。
レスありがとうございます。
0950JAPU@コミケも近いですね ◆JAPUTeX.
01/12/26 21:15ID:???LOCK_SH (shared) だけならいくらでも同時に可能。読み込みだけの時はこれ
だけ使っておけ。
LOCK_EX (exclusive) は他のプロセスが LOCK_EX / LOCK_SH しているとダメ。
LOCK_NB (non-blocking) を指定していなければ、他のロックしているプロセ
スがロックをやめるまで待ち続けます。書き込みを伴うときはこれ使っておけ。
説明悪い?
LOCK_SH は LOCK_SH のみと共存可能。
LOCK_EX は LOCK_EX とも LOCK_SH とも共存不可能。
って書いた方がいいのかな。
>>944
なんでそんな結論になるかなぁ...
0951941
01/12/26 21:46ID:???「別のスクリプトから書き込む時にLOCK_EXを掛けようとすると延々〜」って書いてたつもりでした。。。
0952名無しさん@お腹いっぱい。
01/12/27 02:01ID:K1xvVgg1などで0〜10まで順に実行している時
0〜10の値は何に格納されているのですか?
http://tohoho.wakusei.ne.jp/wwwperl1.htm#Tokushu
ここを見たのですが、乗って無いみたいなので。。。
お願いします。
0953952
01/12/27 02:06ID:K1xvVgg1foreach(@array){
てした時に何回目なのかを格納する変数を教えて下さい。でした。
951だと$_
てなっちゃいますね。すいません。
0954んとねんとね
01/12/27 02:22ID:???0955名無しさん@お腹いっぱい。
01/12/27 02:27ID:K1xvVgg1これだけいろいろな特殊変数があるのに!意外だ…。
ではforeach(@array){
$tmp++;
とやって数えるしかないのですね。。。なるほど。
即レス感謝です。
ありがとうございました。
0956かもかも
01/12/27 04:31ID:GPy3eH+bfor ( $[ .. $[+$#a ){
print "id= $_, value= $a[$_]\n";
}
0957名無しさん@お腹いっぱい。
01/12/27 05:20ID:06m3pfEiなるほど〜。変数では無いですけど、
そういう方法もありますね。
# $[+$#a
# ここでなんで$[を足すのかがまだわからんですけど
レスどうもです。
0958かもかも
01/12/27 05:26ID:STachx1UなのでR!
0959名無しさん@お腹いっぱい。
01/12/27 05:40ID:???0960名無しさん@お腹いっぱい。
01/12/27 09:06ID:???0961そろそろ次スレを・・・
01/12/27 09:38ID:???0962名無しさん@お腹いっぱい。
01/12/27 10:23ID:???$[ は足さなくてよい。ていうか、足しちゃだめ。
$#aで、$[ をバイアスとする@aの最後の添え字の意味になる。
perldoc perldataでは、以下のように説明されている
scalar(@whatever) == $#whatever - $[ + 1;
>>958
デフォルトの$[ == 0だから動いただけ。
local $[ = 1;
を965の先頭に入れて動かしてみ。
てことで、>>958新スレよろしく!
0963えいじ
01/12/27 19:20ID:VRi8wtO1print OUT "あいうえお\n";
close(OUT);
でfilename.txtが新規作成されるんですけど
http://www.****.com/ のトップのディレクトリだけは
新規作成されません。
どうしたら解決できるかご存知の方おられますでしょうか。
よろしくお願いいたします
0964名無しさん@お腹いっぱい。
01/12/27 19:51ID:???にしてエラーを見てみ
0965名無しさん@お腹いっぱい。
01/12/27 19:54ID:???0966名無しさん@お腹いっぱい。
01/12/27 19:54ID:???0967名無しさん@お腹いっぱい。
01/12/27 20:16ID:???同意します。
0968名無しさん@お腹いっぱい。
01/12/27 20:22ID:???なんだ。そういう勘違いをしていたのか。
0969名無しさん@お腹いっぱい。
01/12/27 20:26ID:???0970名無しさん@お腹いっぱい。
01/12/28 01:03ID:???わざわざAA張って煽る事すらウザイ
0971名無しさん@お腹いっぱい。
01/12/28 04:07ID:OJh+njZn再接続しても同一ユーザーだと特定する方法ってないんですか?
0972名無しさん@お腹いっぱい。
01/12/28 04:12ID:???0973名無しさん@お腹いっぱい。
01/12/28 04:18ID:???パソコン初心者板で聞いてみて。http://pc.2ch.net/pcqa/index.html
0974名無しさん@お腹いっぱい。
01/12/28 05:07ID:???おいそれは屁理屈に近いだろ。このくらい教えてやれよ。
0975名無しさん@お腹いっぱい。
01/12/28 06:33ID:???有るよ
0976有るなら
01/12/28 14:25ID:???0977プッ返し げら
01/12/28 14:30ID:???0978名無しさん@お腹いっぱい。
01/12/28 15:17ID:???どうしてもうまく改造できません..。
よければアドバイス願いします。
0979名無しさん@お腹いっぱい。
01/12/28 15:27ID:???そのこととPerlとどんな関係があるんだ?
0980名無しさん@お腹いっぱい。
01/12/28 15:29ID:???if($filename=~m/\.mid$/)
print "Content-Type:audio/midi";
0981980
01/12/28 15:30ID:???0982980
01/12/28 15:31ID:???if($filename=~m/\.mid$/){print "Content-Type:audio/midi\n\n";}
0983978
01/12/28 16:12ID:???先生!ありがとうございます!!
ある、画像アップロード掲示板を使用しているのですが
それはイメージ(GIFやJPEG)画像しかうpできないんです。
それじゃーとりあえず982の記述を適当に書き込んだら良いのでしょうか?
0984982
01/12/28 17:06ID:???>>983
コードを見ればどこかに受け入れ可能な拡張子を判断するところがあるだろ?
そこに.midを付け加えればOK
09861000
01/12/28 21:18ID:???0987sage
01/12/28 22:53ID:???0988sage
01/12/28 22:53ID:???0989sage
01/12/28 22:53ID:???0990sage
01/12/28 22:53ID:???0991sage
01/12/28 22:53ID:???0992sage
01/12/28 22:53ID:???0993sage
01/12/28 22:53ID:???0994sage
01/12/28 22:53ID:???0995sage
01/12/28 22:53ID:???レス数が950を超えています。1000を超えると書き込みができなくなります。