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

Perl 初心者コーナー Part21

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/03/18 18:47ID:Dujz7IUF
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

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
0666nobodyさん03/04/05 12:45ID:???
>>665
>>656に関しても頼む。
0667653でつ03/04/05 14:07ID:t4dpk1aS
ここに春には長過ぎまつ

掲示板を作ったのでつが、細かい部分から全体の流れまでを評価してくれるサイトを知りたかったのでつが・・・
0668nobodyさん03/04/05 14:08ID:???
>>667
せっかく専用スレを立てたんだから活用してくれよ。
http://pc2.2ch.net/test/read.cgi/php/1049514428/
0669nobodyさん03/04/05 14:51ID:???
open (LOG,$logfile) || &error("ファイルオープンエラー : $logfile");
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:???
errorが何をする関数か分からん。その中でexitしてたら結局同じ。
openとcloseをどう並べ変えようが無理じゃないかな。
DAT書き込みが失敗したらLOG書き込みを「自分で」削除することが必要。
0671nobodyさん03/04/05 15:43ID:???
>>670
&errorの中でexitします
んで、質問はopenで失敗したらだったんですが、
たしかに書き込みで失敗したら一緒ですよね

でも例えば$logfileのmax行数が決まってて、
書き込み処理のなかでmaxを超えてたら古いのを削除とかしてると、、、

こういう複数ファイルの処理の時ってどうするべきなんですかねぇ?
みなさん気にせず書いてるものなんですか?
0672nobodyさん03/04/05 16:01ID:???
正式なファイル名で中途半端な物を作るのは良くない。
完全な物を作ってからリネームするのが普通。
0673デフォルトの名無しさん03/04/05 16:03ID:E+nPGg0Q
>>669

>↑こんなときにdatfileを開くところでエラーが出たとき、
それより、書き込むには、
open (LOG,>$logfile) ってしなきゃだめだよ。
open (LOG,$logfile) で書き込めてるなんておかしいよ。
慎重に質問しれ。
067466903/04/05 16:22ID:???
>>672
なるほど。テンポラリーを作っといてリネームするんですね
勉強になりました。ありがとうございます。
>>673
すいません。読み込みのところからコピペしたんで忘れてました。
0675nobodyさん03/04/05 17:40ID:EfZ+i867
コンビネーション{nCr}の計算をしたいんですが結果がおかしいんです。
多分オーバーフローしてるんだと思うんですけどいい方法無いですか?
0676nobodyさん03/04/05 17:46ID:???
まず原因を突き止めなさい。闇雲に動いても意味無い。
0677nobodyさん03/04/05 18:04ID:???
>>675
BigIntでも使えば。
0678nobodyさん03/04/05 18:06ID:MPfOwriq
>>677
どーもっす。調べてみます。
067967503/04/05 18:11ID:MPfOwriq
>>677
ダメでした。
今やりたいのは十進で60桁程度の演算なんですけど
そういう計算したいときにみなさんはどうやってやるんでしょうか?
0680nobodyさん03/04/05 18:15ID:???
>>679
そろばん
0681nobodyさん03/04/05 18:31ID:???
>>679
だから本当にオーバーフローのせいなのか?計算式間違ってるとか
0682nobodyさん03/04/05 18:52ID:???
>>681
forの中身が間違ってました。
スレ汚し申し訳ないです。
068366903/04/05 18:59ID:???
>>672

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:???
>>683
リネーム失敗なら、テンポラリを削除して処理を終了でいいでしょ。
読み書きは正常なのに……とかセコいこと考えないで、完全エラー無し以外は
すべて異常終了扱いにしたほうがいい。
0685nobodyさん03/04/05 19:13ID:???
1つ目のrenameが成功して2つ目のrenameが失敗すると困りませんか
0686nobodyさん03/04/05 19:15ID:???
1,2,3,10,22
という配列があって sortすると
1,10,2,22,3となってしまいます。
これを1,2,3,10,22のように実際の大きさ順に
ソートするにはどうすればいいのでしょうか?
0687nobodyさん03/04/05 19:18ID:???
sort {$a <=> $b}
0688nobodyさん03/04/05 19:20ID:???
renameは失敗しないことにする。
0689nobodyさん03/04/05 19:27ID:???
>>688
それでは最終的に元ファイルが更新される保証がない。

0690nobodyさん03/04/05 19:31ID:???
>>689
「元ファイルが更新される保証」はいらないだろ。
「$logfileと$datfileの整合性が保たれる保証」が必要。
069166903/04/05 19:43ID:???
>>684
んーよくわからないんですが・・・
>完全エラー無し以外は すべて異常終了扱いにしたほうがいい。
それはわかるんですが、どういう風に書けばそうなりますか?
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:???
>>669
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/lA
ファイルをアップロードするシステムを構築していますがわからないことだらけです。
index.cgiのFORMデータをsubmit.cgiに引き渡して処理させたいのですが、どうやればいいのでしょうか?
親切なアドバイス待ってます。
0695nobodyさん03/04/05 20:22ID:???
>>694
http://tohoho.wakusei.ne.jp/wwwxx034.htm
↑ここ見て研究
0696あぼーん03/04/05 20:36ID:???
   ,.´ / Vヽヽ
    ! i iノノリ)) 〉
    i l l.´ヮ`ノリ <先生!こんなのがありました!
    l く/_只ヽ    
  | ̄ ̄ ̄ ̄ ̄|
http://saitama.gasuki.com/mona/
069766903/04/05 20:41ID:???
>>693
わざわざ有難うございます。
ちょっとわからない事だらけなんで調べてきます。
0698Perlですが03/04/05 20:41ID:qMi3a/lA
>>695
それではなくて他に方法はありませんか?
0699nobodyさん03/04/05 20:55ID:???
>親切なアドバイス待ってます。
なんかムカつく。

submit.cgiでおこなう処理をindex.cgiの中から呼べばいいだろ
わざわざ"引き渡す"意味がわからん
0700nobodyさん03/04/05 21:14ID:???
>>693
if ($pointer != 0)
の条件判断は不要な気がする。
0701nobodyさん03/04/05 21:19ID:???
ファイルポインタ?
0702nobodyさん03/04/05 21:48ID:???
>>669
ちょっと直した

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:???
>>699
>>親切なアドバイス待ってます。
>なんかムカつく。
>>694は、あまりにもアレな質問して叩かれたことがあるに1000クックブック
0704nobodyさん03/04/05 22:14ID:???
>>702
tell(LOG);で0を返すんですが・・・
0705nobodyさん03/04/05 22:18ID:???
>>704
「>>」でopenすれば、ファイルの末尾の位置を返すよ。
0706nobodyさん03/04/05 22:28ID:???
>>705
$pointer = tell (LOG);

windowsじゃtell使えないんでしょうか?
なぜか0を返すんです。
ちゃんとその後printしたものは追加書き込みになってるんですけどねぇ
070770503/04/05 22:37ID:???
>>706
漏れの環境(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:???
$ cat hoge
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:sLGWgkab
PerlでGUID取得する方法ないっすかね?
0711nobodyさん03/04/05 23:11ID:RuMeXkuC
ハッシュの値で並び替えを行いキーと値を表示したいのですがどうすればいいでしょうか
0712nobodyさん03/04/05 23:27ID:???
sort {$hash->{$a} cmp $hash->{$b}} keys(%hash)
0713間違えた03/04/05 23:28ID:???
sort {$hash{$a} cmp $hash{$b}} keys(%hash);
0714nobodyさん03/04/05 23:30ID:RuMeXkuC
>>713
ありがとうございます.できました!
0715nobodyさん03/04/06 00:32ID:httIMQcy
クッキーがあるかどうか確認する方法を教えてください。
0716 03/04/06 00:43ID:88ZLH8qE
>>715
$ENV{'HTTP_COOKIE'}に値がはいっていれば在り、無ければ無し
0717nobodyさん03/04/06 00:53ID:/U6PDdMC
>>716サソ
それは自分のCGIから吐き出されたクッキーなんですか?
0718 03/04/06 01:00ID:88ZLH8qE
>>717
それはクッキーの設定次第w
http://www.futomi.com/lecture/cookie/index.html

自分とこのクッキーかどうか確認したい場合は、クッキーの内容を確認してw
http://www.futomi.com/subroutine/getcookie.html
0719nobodyさん03/04/06 02:34ID:ONKJQ6B1
PerlでUserAgentを書き換えるにはどうすればいいんですか?
0720nobodyさん03/04/06 02:37ID:???
>>719
「何の」UserAgentを書き換えたいのか?
0721間違えた03/04/06 02:58ID:???
$ENV{'HTTP_USER_AGENT'} = "もじら Version 2.3";
でいいだろ。
0722nobodyさん03/04/06 03:07ID:oW/lvYed
xpで、active perlが入ってて、
iisを作動させてブラウザから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の名前欄無視して)
0724nobodyさん03/04/06 03:11ID:???
>>722
PATHが通っていないのでは?
0725nobodyさん03/04/06 03:14ID:???
>>723
有難うございます。いけました>perl -v
でもなぜですか?
0726nobodyさん03/04/06 03:22ID:???
ってゆうか、perl -v って打つのが普通なんですね。
この前見たページ確認しにいってきたらスペース入ってました。
すいませんでした
0727nobodyさん03/04/06 03:43ID:ONKJQ6B1
>>720
アクセス解析の入っているページで
use LWP::Simple;
my $url = "http://yahoo.co.jp/";
my $content = get($url);
print $content;
と、ソースを取得した時に
アクセス解析でlwp-trivial/1.35解析されずに
Monazilla/6.00と解析されるようにしたいです。

0728nobodyさん03/04/06 04:01ID:???
>>727
はyahooがアクセス解析してると仮定してます。
0729nobodyさん 03/04/06 04:02ID:???
my $ua = LWP::UserAgent->new;
$ua->agent(Saitama');

perldocなり、cpan也でもうちょっと調べるべきであるかな
0730nobodyさん03/04/06 08:03ID:xn7ICdMG
CGIを設置しているのですが
.cgiのファイルをいじっていて、その中にメールアドレスを
書こうとしたらエラーになります。

どうも@を書くとエラーになるようですが
cgiの中に@を記入したい場合どうしたらよいのでしょうか?
0731nobodyさん03/04/06 08:09ID:???
ダブルクォートでくくられた文字列の中にメールアドレスを
書こうとしているのだと想像します。

その場合、@ が配列変数として認識されてしまっているので、
@ の直前に \ をつけて書くことをお勧めします。

あるいは、変数が展開されないシングルクォートで、文字列
をくくるという方法もあります。

今後は、エラーが出たときは、エラーメッセージをここに
貼り付けてご質問されることをお勧めします。
0732nobodyさん03/04/06 08:09ID:???
$email = '[email protected]';
$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:???
packageってC++のnamespaceみたいなもの?
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
perlで指定したサーバーが稼動しているか倒れているか調べる関数か何かありますか?
自鯖構築に利用したいのですが、独自ドメインからWebサーバーに飛ばして、
そこで、perlが処理するのですが、

if ($自鯖稼動状態 == 1) {
  print "Location: $ZISABAurl\n\n";
} else {
  print "Loaction: $WEBSABAurl\n\n"
}

みたいにしたいのですが。
0737bloom03/04/06 12:25ID:Ne2teiuv
http://www.agemasukudasai.com/bloom/
0738あぼーん03/04/06 12:39ID:???
   ______________
 /:\.____\
 |: ̄\(∩´∀`) \  <先生!こんなのがありました!
 |:在  |: ̄ ̄ U ̄:|
http://saitama.gasuki.com/aomori/
0739あぼーん03/04/06 12:43ID:???
   ,.´ / Vヽヽ
    ! i iノノリ)) 〉
    i l l.´ヮ`ノリ <先生!こんなのがありました!
    l く/_只ヽ    
  | ̄ ̄ ̄ ̄ ̄|
http://muryou.gasuki.com/koumuin/
0740邪穂03/04/06 13:36ID:xn7ICdMG
>>731-732
(´皿`;)了解しました。どうもありがとうです。
0741nobodyさん03/04/06 18:25ID:???
Perlについての質問箱 4箱目
http://pc2.2ch.net/test/read.cgi/tech/1048519394/l50
0742nobodyさん03/04/07 04:20ID:???
>>741
厨が迷い込んでくるから貼らないでくれよ…
0743nobodyさん03/04/07 10:56ID:???
>>742
プッ
0744nobodyさん03/04/07 12:23ID:???
早いな。
0745nobodyさん03/04/07 21:42ID:???
春休みが終わった途端に加速していたスレが止まりましたね。
0746nobodyさん03/04/08 05:31ID:???
花見で忙しいんだ罠
0747nobodyさん03/04/08 07:17ID:???
外部に置いた設定File"param.txt"に

#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:???
>>747
直接の回答じゃないけど、スカラー変数の名前をtxtファイルで
指定しとくのはやめたほうがいいんじゃないかな。
ハッシュでやりましょう。
074974703/04/08 07:41ID:???
>>748
いや、本当はやりたくないんですが、既存のFileを再利用しつつ
新規のprogramを作れというデムパな指令がおりてきまして・・・

なにやらNTT謹製のcgiがこの方法を使っているとかで、既存のFileを
出来るだけいじらずにProgram側で処理しなくちゃならんという事に
なったので困っている次第なのです。

#やっぱ'$'消して連想配列に突っ込むってのが一番安全な方法かなぁ。
0750nobodyさん03/04/08 07:52ID:???
require "param.txt";
じゃだめなの?
0751nobodyさん03/04/08 07:56ID:???
requireが駄目なら、
perl -e '$a="param1"; $$a="value"; print $param1;'
っていう方法もあるよ。
適当に書くと
foreach(@buf){
 my ($var,$val) = split(/=/,$_);
 $$var = $val;
};

print $param1;

(合ってるかな?)
0752nobodyさん03/04/08 08:03ID:???
ちょっとだけちゃんと書いてみた。スカラーだけ。その他param.txtの書き方に制限有り
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";
075374703/04/08 08:11ID:???
>>750
えぇと、元になるparam.txtが複数(別名で)有って、呼び出される時の
パラメータ(formの内容次第)で読み替える様にしなくちゃならんので
requireは使用不可と判断しました。

>>751
なるほど、「可変変数」という手が有ったのですね。
あとは改行と「'」消しだけで問題無く(根本的解決では無いが)出来そう
です。

ありがとうございますです。
075474703/04/08 08:17ID:???
>>752
あ、入れ違いで、、、
意図した通りに動作しました。
ありがとうございます。
0755nobodyさん03/04/08 08:53ID:???
>>753
%form = フォーム;
require $form{'whichfile'};
じゃだめなの?
075674703/04/08 11:02ID:???
>>755
whichfileが存在しない場合ってエラーになりませんでしたっけ?
・・・という事を考えて敢てFile読み込みの方向で考えていたんですが。
0757nobodyさん03/04/08 11:05ID:KoNa94bz
掲示板作ってます。
記事の削除機能、修正機能を加えたいと思っています。
記事ナンバーとパスワードを入力し、該当の記事を引き出す事には成功しましたが、
そこからのログファイルの操作?がよく分かりません。
よろしければご教授下さい。お願いします。。
0758nobodyさん03/04/08 11:11ID:???
>>757
それだけでどうやって答えろって(ry

該当レスをテキストエリアにでも表示させて編集後に再書込み
該当レスを削除してログを前につめるか削除メッセージで代替して再書込み

そんなとこじゃないの
075975703/04/08 11:33ID:sQEXk45G
>758

すいません、、ありがとうございます。
0760nobodyさん03/04/08 11:50ID:???
>>756
-f で確認したらいいだろ?
0761nobodyさん03/04/08 17:58ID:???
中にファイルが入ってようが無かろうが関係なしに
ディレクトリを削除ってことはできないですかね?
rmdirじゃあ、中に入ってると消してくれないんで
0762nobodyさん03/04/08 18:14ID:???
>>761
Linux だったら
rm -rf /
0763nobodyさん03/04/08 19:07ID:???
今日、STDOUTをtieしてContent-Lengthを出すっていうのを
思いついたんだけど、同じ事考えた人っている?
0764nobodyさん03/04/08 19:08ID:???
>>762
れすどうもです。
これは何でしょう?コマンドかなんかでしたっけ?
んーやっぱりディレクトリの中調べて、全部消してrmdirにしようかな
0765nobodyさん03/04/08 19:17ID:???
>>764
http://www.linux.or.jp/JM/html/GNU_fileutils/man1/rm.1.html
■ このスレッドは過去ログ倉庫に格納されています