【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を見よう。
0867分からないくせに生意気なことを言ってみる
01/12/23 15:35ID:???Perlでメモリーを気にするのはナンセンス
0868名無しさん@お腹いっぱい。
01/12/23 15:43ID:???returnって関数なの?
0869868
01/12/23 15:45ID:???0870名無しさん@お腹いっぱい。
01/12/23 15:46ID:???0871名無しさん@お腹いっぱい。
01/12/23 15:47ID:???いや、関数らしいぞ。プログラミングPerl改訂版(JP)の237ページに載っている。
0872名無しさん@お腹いっぱい。
01/12/23 15:51ID:???0873名無しさん@お腹いっぱい。
01/12/23 15:51ID:???0874名無しさん@お腹いっぱい。
01/12/23 15:56ID:???他の言語とは意味が違うとしか思えないよ。
0875名無しさん@お腹いっぱい。
01/12/23 15:58ID:???ifやforも関数にすればよかったのにね。 (w
0876JAPU ◆JAPUTeX.
01/12/23 16:05ID:???過度にメモリを気にするのはナンセンスだけど、ある程度は考えようぜ。(苦笑)
(>>866 の場合は while 使うのが吉。)
0877名無しさん@お腹いっぱい。
01/12/23 23:28ID:???突っ込み隊が一杯釣れそうだな (・∀・)
0878名無しさん@お腹いっぱい。
01/12/24 01:49ID:???まだドキュメント読んでる最中なんで、可否が解れば幸いです ^^
0880名無しさん@お腹いっぱい。
01/12/24 04:33ID:???0881名無しさん@お腹いっぱい。
01/12/24 05:44ID:???有るか無いか聞いてどうすんの?
>いらっしゃーい、perlのコーディングで困ってる人のスレです。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0882名無しさん@お腹いっぱい。
01/12/24 06:24ID:uH077O8Q常套手段って有りますか
例えば上限を5とすると、5を超えるとsleep秒待ってリトライ
と言う感じで実装したいのです
0883821@v(・ v ・)v
01/12/24 08:10ID:???Socket.xs、ちょっと開けて読んでみましたけど、難解ですねー
と言うかこれってスパゲッティー?
頑張りますー 、ありがとうっす。
0884名無しさん@お腹いっぱい。
01/12/24 15:39ID:CE1hGHz4具体的な方法をご存知の方がいらっしゃいましたらご教授お願い致します。
0885名無しさん@お腹いっぱい。
01/12/24 16:03ID:n/gVuaksJSで書き出せば可能かと。
0886名無しさん@お腹いっぱい。
01/12/24 16:10ID:???何でSSIなん? つーかJavaスクはWEB製作だろっつの >ム板さん
Googleで「Javascript」「Set-Cookie」で検索してヒットしたものを
SSIでexeccmdすれば良いの、ソースは検索すれば100万件位出てきます
0887田イ戈
01/12/24 17:44ID:???<meta http-equiv="Set-Cookie" content="cookiename=cookievalue">
か。Perlとは関係ないのでスレ違い。
JavScript を execcmd って何だろう?
0888名無しさん
01/12/24 17:56ID:???<meta http-equiv="Set-Cookie" content="cookiename=cookievalue">
って何だろう?
0889名無しさん@お腹いっぱい。
01/12/24 18:01ID:???0891884
01/12/24 21:50ID:zH2D792Bexeccmdでパールで作ったCGIを呼び出すのですが、
それをクッキーに食べさせる方法を聞きたかったのであります。
JAVAスクリプト使うか
<meta http-equiv="Set-Cookie" content="cookiename=cookievalue">
を使えばいいのですね。
JAVAスクリプトはまだやったことがないので
後者を使ってみます。
どうもみなさんありがとうございましたm(__)m
0892名無しさん@お腹いっぱい。
01/12/25 00:55ID:SHv7CWw6てやるのと@data = <FILE>
とかに代入して処理するのだと@dataの方が
メモリ使わなかったりするのですか?
0893892
01/12/25 00:59ID:SHv7CWw6@dataの方がメモリ使ったりするのですか?
0894名無しさん@お腹いっぱい。
01/12/25 01:02ID:???します。
0895名無しさん@お腹いっぱい。
01/12/25 01:04ID:???少し上のレスくらい読んでみたらどーよ。
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:???レス数が950を超えています。1000を超えると書き込みができなくなります。