Perl 初心者コーナー Part21
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/03/18 18:47ID:Dujz7IUF【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 9
http://pc.2ch.net/test/read.cgi/php/1041530204/
参考書籍の話題は、【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
過去ログやお勧めサイトは >>2-10
0667653でつ
03/04/05 14:07ID:t4dpk1aS掲示板を作ったのでつが、細かい部分から全体の流れまでを評価してくれるサイトを知りたかったのでつが・・・
0668nobodyさん
03/04/05 14:08ID:???せっかく専用スレを立てたんだから活用してくれよ。
http://pc2.2ch.net/test/read.cgi/php/1049514428/
0669nobodyさん
03/04/05 14:51ID:???LOG書き込み処理
close (LOG);
open (DAT,$datfile) || &error("ファイルオープンエラー : $datfile");
DAT書き込み処理
close (DAT);
↑こんなときにdatfileを開くところでエラーが出たとき、
logfileには書き込まれてるのにdatfileは書き込まれないって事になりますよね?
それを回避するためには↓のようにすればいいのかなぁなんて素人なりに考えたんですが、
おかしいですか?
open (LOG,$logfile) || &error("ファイルオープンエラー : $logfile");
open (DAT,$datfile) || &error("ファイルオープンエラー : $datfile");
LOG書き込み処理
DAT書き込み処理
close (LOG);
close (DAT);
0670nobodyさん
03/04/05 15:31ID:???openとcloseをどう並べ変えようが無理じゃないかな。
DAT書き込みが失敗したらLOG書き込みを「自分で」削除することが必要。
0671nobodyさん
03/04/05 15:43ID:???&errorの中でexitします
んで、質問はopenで失敗したらだったんですが、
たしかに書き込みで失敗したら一緒ですよね
でも例えば$logfileのmax行数が決まってて、
書き込み処理のなかでmaxを超えてたら古いのを削除とかしてると、、、
こういう複数ファイルの処理の時ってどうするべきなんですかねぇ?
みなさん気にせず書いてるものなんですか?
0672nobodyさん
03/04/05 16:01ID:???完全な物を作ってからリネームするのが普通。
0673デフォルトの名無しさん
03/04/05 16:03ID:E+nPGg0Q>↑こんなときにdatfileを開くところでエラーが出たとき、
それより、書き込むには、
open (LOG,>$logfile) ってしなきゃだめだよ。
open (LOG,$logfile) で書き込めてるなんておかしいよ。
慎重に質問しれ。
0674669
03/04/05 16:22ID:???なるほど。テンポラリーを作っといてリネームするんですね
勉強になりました。ありがとうございます。
>>673
すいません。読み込みのところからコピペしたんで忘れてました。
0675nobodyさん
03/04/05 17:40ID:EfZ+i867多分オーバーフローしてるんだと思うんですけどいい方法無いですか?
0676nobodyさん
03/04/05 17:46ID:???0678nobodyさん
03/04/05 18:06ID:MPfOwriqどーもっす。調べてみます。
0679675
03/04/05 18:11ID:MPfOwriqダメでした。
今やりたいのは十進で60桁程度の演算なんですけど
そういう計算したいときにみなさんはどうやってやるんでしょうか?
0683669
03/04/05 18:59ID:???open (LOG,>$logtmp) || &error("ファイルオープンエラー : $logtmp");
LOG書き込み処理
close (LOG);
open (DAT,>$dattmp) || &error("ファイルオープンエラー : $dattmp");
DAT書き込み処理
close (DAT);
rename("$logtmp", "$logfile") || &error("リネームエラー : $logfile"); #※1
rename("$dattmp", "$datfile") || &error("リネームエラー : $datfile");
ちょっと思ったんですけど、↑こういうことですか?
じゃあ※1でエラー出たら一緒じゃないですか?
0684nobodyさん
03/04/05 19:11ID:???リネーム失敗なら、テンポラリを削除して処理を終了でいいでしょ。
読み書きは正常なのに……とかセコいこと考えないで、完全エラー無し以外は
すべて異常終了扱いにしたほうがいい。
0685nobodyさん
03/04/05 19:13ID:???0686nobodyさん
03/04/05 19:15ID:???という配列があって sortすると
1,10,2,22,3となってしまいます。
これを1,2,3,10,22のように実際の大きさ順に
ソートするにはどうすればいいのでしょうか?
0687nobodyさん
03/04/05 19:18ID:???0688nobodyさん
03/04/05 19:20ID:???0691669
03/04/05 19:43ID:???んーよくわからないんですが・・・
>完全エラー無し以外は すべて異常終了扱いにしたほうがいい。
それはわかるんですが、どういう風に書けばそうなりますか?
rename("$logtmp", "$logfile") || unlink("$logtmp");
rename("$dattmp", "$datfile") || unlink("$logtmp","$dattmp");
こういうことですかねぇ?
あと、今まで既にあるデータを読み込まずに
open (DAT,>>$dattmp) || &error("ファイルオープンエラー : $dattmp");
DAT書き込み処理(追加)
close (DAT);
↑こうして追加してたんですけど、
一度テンポラリファイルを作ってリネームとなると、
全て読み込んでから新しいのを足したものを上書き
しないといけなくなりますよね?
処理の重さは変わらないですか?
0692nobodyさん
03/04/05 20:08ID:???でも、やらなきゃならないんなら、しょうがない。
0693nobodyさん
03/04/05 20:16ID:???open (LOG,>>$logfile) || &error("ファイルオープンエラー : $logfile");
$pointer = 0;
$pointer = ファイルポインタを取得する関数
LOG書き込み処理(追加)
close (LOG);
if (!open (DAT,>>$datfile)) {
if ($pointer != 0) {
open (LOG,>>$logfile)
truncate($pointerで切り詰め);
close (LOG);
}
&error("ファイルオープンエラー : $datfile");
else
DAT書き込み処理(追加)
close (DAT);
end
むちゃくちゃだけど、こんなんはどうですか?
0694Perlですが
03/04/05 20:17ID:qMi3a/lAindex.cgiのFORMデータをsubmit.cgiに引き渡して処理させたいのですが、どうやればいいのでしょうか?
親切なアドバイス待ってます。
0695nobodyさん
03/04/05 20:22ID:???http://tohoho.wakusei.ne.jp/wwwxx034.htm
↑ここ見て研究
0696あぼーん
03/04/05 20:36ID:???! i iノノリ)) 〉
i l l.´ヮ`ノリ <先生!こんなのがありました!
l く/_只ヽ
| ̄ ̄ ̄ ̄ ̄|
http://saitama.gasuki.com/mona/
0698Perlですが
03/04/05 20:41ID:qMi3a/lAそれではなくて他に方法はありませんか?
0699nobodyさん
03/04/05 20:55ID:???なんかムカつく。
submit.cgiでおこなう処理をindex.cgiの中から呼べばいいだろ
わざわざ"引き渡す"意味がわからん
0701nobodyさん
03/04/05 21:19ID:???0702nobodyさん
03/04/05 21:48ID:???ちょっと直した
open (LOG,>>$logfile) || &error("ファイルオープンエラー : $logfile");
$pointer = tell(LOG); # ファイルポインタの位置を返す
LOG書き込み処理(追加)
close (LOG);
if (!open (DAT,>>$datfile)) {
open (LOG,>>$logfile) # ←エラーが発生しないことを祈る
truncate(LOG,$pointer);
close (LOG);
&error("ファイルオープンエラー : $datfile");
} else {
DAT書き込み処理(追加)
close (DAT);
}
こんなんでいいのかどうか分からないが・・・
logfileとdatfileの整合性を保つためのもっといい方法があるのだろう・・・
0703nobodyさん
03/04/05 21:51ID:???>>親切なアドバイス待ってます。
>なんかムカつく。
>>694は、あまりにもアレな質問して叩かれたことがあるに1000クックブック
0706nobodyさん
03/04/05 22:28ID:???$pointer = tell (LOG);
windowsじゃtell使えないんでしょうか?
なぜか0を返すんです。
ちゃんとその後printしたものは追加書き込みになってるんですけどねぇ
0707705
03/04/05 22:37ID:???漏れの環境(WinXP+ActivePerl5.6)で
open(FILE,">>test.dat");
$p = tell FILE;
close(FILE);
print "$p\n";
test.datの中身を例えば、
aaa\r\naaa\r\n
として、上のスクリプトを実行すると、
「10」となります。
なんで706さんは0になるのかなぁ。わかんねぇ。
0708nobodyさん
03/04/05 22:42ID:???perl -e open(F,">>hoge");$p=tell(F);close(F);print $p,"\n";
$ wc hoge
1 4 60 hoge
$ perl -e 'open(F,">>hoge");$p=tell(F);close(F);print $p,"\n";'
60
漏れの環境でも正常です。Win2k
$ perl -v
This is perl, v5.6.1 built for cygwin-multi
0709nobodyさん
03/04/05 22:51ID:???調べてきます。
0710
03/04/05 23:10ID:sLGWgkab0711nobodyさん
03/04/05 23:11ID:RuMeXkuC0712nobodyさん
03/04/05 23:27ID:???0713間違えた
03/04/05 23:28ID:???0714nobodyさん
03/04/05 23:30ID:RuMeXkuCありがとうございます.できました!
0715nobodyさん
03/04/06 00:32ID:httIMQcy0716
03/04/06 00:43ID:88ZLH8qE$ENV{'HTTP_COOKIE'}に値がはいっていれば在り、無ければ無し
0717nobodyさん
03/04/06 00:53ID:/U6PDdMCそれは自分のCGIから吐き出されたクッキーなんですか?
0718
03/04/06 01:00ID:88ZLH8qEそれはクッキーの設定次第w
http://www.futomi.com/lecture/cookie/index.html
自分とこのクッキーかどうか確認したい場合は、クッキーの内容を確認してw
http://www.futomi.com/subroutine/getcookie.html
0719nobodyさん
03/04/06 02:34ID:ONKJQ6B10721間違えた
03/04/06 02:58ID:???でいいだろ。
0722nobodyさん
03/04/06 03:07ID:oW/lvYediisを作動させてブラウザからcgiの確認なんかはできるんですけど、
コマンドプロンプトでの動かし方がわかりません。
どこかの説明で「コマンドプロンプトを開いてper-vと打ち込む」
って書いてあったんですけど、
>'perl-v' は内部コマンドまたは外部コマンド、
>操作可能なプログラムまたはバッチ ファイルとして認識されていません。
ってでてきます。
それ以前に最初から、
>C:\Documents and Settings\***>
これが表示されてるんですけど、この後にperl-vって打つのであってますか?
つまり
>C:\Documents and Settings\***>perl-v
こう打つと
>'perl-v' は内部コマンドまたは外部コマンド、
>操作可能なプログラムまたはバッチ ファイルとして認識されていません。
こうなります。
0723nobodyさん
03/04/06 03:11ID:???まず
C:\Documents and Settings\***>perl -v
と打ってみろ。それでも失敗したら
C:\Documents and Settings\***>PATH
の結果を貼れ
(>>721の名前欄無視して)
0726nobodyさん
03/04/06 03:22ID:???この前見たページ確認しにいってきたらスペース入ってました。
すいませんでした
0727nobodyさん
03/04/06 03:43ID:ONKJQ6B1アクセス解析の入っているページで
use LWP::Simple;
my $url = "http://yahoo.co.jp/";
my $content = get($url);
print $content;
と、ソースを取得した時に
アクセス解析でlwp-trivial/1.35解析されずに
Monazilla/6.00と解析されるようにしたいです。
0729nobodyさん
03/04/06 04:02ID:???$ua->agent(Saitama');
perldocなり、cpan也でもうちょっと調べるべきであるかな
0730nobodyさん
03/04/06 08:03ID:xn7ICdMG.cgiのファイルをいじっていて、その中にメールアドレスを
書こうとしたらエラーになります。
どうも@を書くとエラーになるようですが
cgiの中に@を記入したい場合どうしたらよいのでしょうか?
0731nobodyさん
03/04/06 08:09ID:???書こうとしているのだと想像します。
その場合、@ が配列変数として認識されてしまっているので、
@ の直前に \ をつけて書くことをお勧めします。
あるいは、変数が展開されないシングルクォートで、文字列
をくくるという方法もあります。
今後は、エラーが出たときは、エラーメッセージをここに
貼り付けてご質問されることをお勧めします。
0732nobodyさん
03/04/06 08:09ID:???$email = "foo\@example.com";
$email = q([email protected]):
0733あぼーん
03/04/06 08:37ID:???( ´∀`)/<先生!こんなのがありました!
_ / / / \___________
\⊂ノ ̄ ̄ ̄ ̄\
||\ \
||\|| ̄ ̄ ̄ ̄ ̄||
|| || ̄ ̄ ̄ ̄ ̄||
http://saitama.gasuki.com/saitama/
0734nobodyさん
03/04/06 08:41ID:???0735あぼーん
03/04/06 08:42ID:???http://muryou.gasuki.com/moe/jaz04.html
http://muryou.gasuki.com/moe/jaz03.html
http://muryou.gasuki.com/moe/jaz02.html
http://muryou.gasuki.com/moe/jaz01.html
http://muryou.gasuki.com/moe/jaz06.html
http://muryou.gasuki.com/moe/jaz05.html
http://muryou.gasuki.com/moe/jaz08.html
http://muryou.gasuki.com/moe/jaz07.html
http://muryou.gasuki.com/moe/jaz10.html
http://muryou.gasuki.com/moe/jaz09.html
0736nobodyさん
03/04/06 11:52ID:xQ2onnJ6自鯖構築に利用したいのですが、独自ドメインからWebサーバーに飛ばして、
そこで、perlが処理するのですが、
if ($自鯖稼動状態 == 1) {
print "Location: $ZISABAurl\n\n";
} else {
print "Loaction: $WEBSABAurl\n\n"
}
みたいにしたいのですが。
0737bloom
03/04/06 12:25ID:Ne2teiuv0738あぼーん
03/04/06 12:39ID:???/:\.____\
|: ̄\(∩´∀`) \ <先生!こんなのがありました!
|:在 |: ̄ ̄ U ̄:|
http://saitama.gasuki.com/aomori/
0739あぼーん
03/04/06 12:43ID:???! i iノノリ)) 〉
i l l.´ヮ`ノリ <先生!こんなのがありました!
l く/_只ヽ
| ̄ ̄ ̄ ̄ ̄|
http://muryou.gasuki.com/koumuin/
0740邪穂
03/04/06 13:36ID:xn7ICdMG(´皿`;)了解しました。どうもありがとうです。
0741nobodyさん
03/04/06 18:25ID:???http://pc2.2ch.net/test/read.cgi/tech/1048519394/l50
0744nobodyさん
03/04/07 12:23ID:???0745nobodyさん
03/04/07 21:42ID:???0746nobodyさん
03/04/08 05:31ID:???0747nobodyさん
03/04/08 07:17ID:???#param.text
$param1 = 'value1';
$param2 = 'value2';
という変数宣言文が有り、これを読み込んで記述された通りの変数に展開
するにはどうすれば良いのでしょうか?
open( FILE , 'param.txt');
@buf = FILE;
close(FILE);
foreach(@buf){
$_;
};
print "param1 = $param1\nparam2 = $param2\n";
という感じにしても駄目でした。
0748nobodyさん
03/04/08 07:27ID:???直接の回答じゃないけど、スカラー変数の名前をtxtファイルで
指定しとくのはやめたほうがいいんじゃないかな。
ハッシュでやりましょう。
0749747
03/04/08 07:41ID:???いや、本当はやりたくないんですが、既存のFileを再利用しつつ
新規のprogramを作れというデムパな指令がおりてきまして・・・
なにやらNTT謹製のcgiがこの方法を使っているとかで、既存のFileを
出来るだけいじらずにProgram側で処理しなくちゃならんという事に
なったので困っている次第なのです。
#やっぱ'$'消して連想配列に突っ込むってのが一番安全な方法かなぁ。
0750nobodyさん
03/04/08 07:52ID:???じゃだめなの?
0751nobodyさん
03/04/08 07:56ID:???perl -e '$a="param1"; $$a="value"; print $param1;'
っていう方法もあるよ。
適当に書くと
foreach(@buf){
my ($var,$val) = split(/=/,$_);
$$var = $val;
};
print $param1;
(合ってるかな?)
0752nobodyさん
03/04/08 08:03ID:???open(FILE , 'param.txt');
@buf = <FILE>;
close(FILE);
foreach (@buf) {
my ($var, $val) = split(/\s*=\s*/,$_);
$var =~ s/^\$//;
$val =~ s/^["']//;
$val =~ s/;\s*$//;
$val =~ s/["']$//;
$$var = $val;
}
print "param1 = $param1\nparam2 = $param2\n";
0753747
03/04/08 08:11ID:???えぇと、元になるparam.txtが複数(別名で)有って、呼び出される時の
パラメータ(formの内容次第)で読み替える様にしなくちゃならんので
requireは使用不可と判断しました。
>>751
なるほど、「可変変数」という手が有ったのですね。
あとは改行と「'」消しだけで問題無く(根本的解決では無いが)出来そう
です。
ありがとうございますです。
0756747
03/04/08 11:02ID:???whichfileが存在しない場合ってエラーになりませんでしたっけ?
・・・という事を考えて敢てFile読み込みの方向で考えていたんですが。
0757nobodyさん
03/04/08 11:05ID:KoNa94bz記事の削除機能、修正機能を加えたいと思っています。
記事ナンバーとパスワードを入力し、該当の記事を引き出す事には成功しましたが、
そこからのログファイルの操作?がよく分かりません。
よろしければご教授下さい。お願いします。。
0758nobodyさん
03/04/08 11:11ID:???それだけでどうやって答えろって(ry
該当レスをテキストエリアにでも表示させて編集後に再書込み
該当レスを削除してログを前につめるか削除メッセージで代替して再書込み
そんなとこじゃないの
0759757
03/04/08 11:33ID:sQEXk45Gすいません、、ありがとうございます。
0761nobodyさん
03/04/08 17:58ID:???ディレクトリを削除ってことはできないですかね?
rmdirじゃあ、中に入ってると消してくれないんで
0763nobodyさん
03/04/08 19:07ID:???思いついたんだけど、同じ事考えた人っている?
0764nobodyさん
03/04/08 19:08ID:???れすどうもです。
これは何でしょう?コマンドかなんかでしたっけ?
んーやっぱりディレクトリの中調べて、全部消してrmdirにしようかな
0765nobodyさん
03/04/08 19:17ID:???http://www.linux.or.jp/JM/html/GNU_fileutils/man1/rm.1.html
■ このスレッドは過去ログ倉庫に格納されています