トップページ⇒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
0611nobodyさん03/04/04 09:48ID:???
出た、bloom
そろそろ赤字でIP晒して欲しいな。
0612nobodyさん03/04/04 11:02ID:lpjcObWV
データと、CSV形式で保存したいと思ってます。
で、CSV形式つっても、アプリによって微妙に差があるじゃないですか?

そこで、自分はエクセル用のCSVにしたいと思ってるんですが、
その際の仕様はどーすればいいんでしょうか?

●値は,で区切る
●値の中に"があるときは""と入力
●改行はそのまま改行を入れる。
●数字以外はセルの値を""でくくる

・・・でOK?
0613nobodyさん03/04/04 11:07ID:???
perlと関係ねー
0614nobodyさん03/04/04 11:37ID:T4cPGriS
keys 関数
 keys関数は、ハッシュ変数のすべてのキーをリスト値として返します。
@key = keys( %hash );
 キーの格納には乱数を使った手法が使われるため、ハッシュ全体を出力する場合、その順番は保証されません。ですから、@key には %hash のキーが順序を無視して格納されます。

順番通りに格納すればいいのに、どうしてこういう仕様になってるんですか?
perl作ってる人は何を考えてるんですか?
0615nobodyさん03/04/04 11:37ID:???
>>612

>>2
> [お薦め]
>  ・Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm ★読んどけ
061661503/04/04 11:39ID:???
間違えた>>3だ。

>>614

その「perl作ってる人」に聞け
0617nobodyさん03/04/04 11:46ID:???
>>614
ハッシュだからに決まってるだろ。
0618nobodyさん03/04/04 12:12ID:???
>>614
メモリ効率や実行速度を優先させたから。
0619nobodyさん03/04/04 13:05ID:???
>>609スルーかよ
0620nobodyさん03/04/04 13:12ID:???
>619 なんでKENT氏のaskaBBSなんてものをわざわざ探して調べてやらにゃならんのだ
0621nobodyさん03/04/04 13:16ID:???
(´・ω・`)…
0622nobodyさん03/04/04 13:28ID:???
>>620
それがこの板の住人の仕事であり、使命でもあるから。
0623nobodyさん03/04/04 13:29ID:Oo/SV5Mj
getpw... getgr...という組みこみ関数のことなんですが、/etc/passwd, /etc/group
のパスを指定することができない(みたい)ので、テストで非常に難儀します。
サンプルのpasswd,groupファイルを読ませる方法はないのでしょうか。仕方なく
Unix::ConfigFileを使っているのですが、重いです。非常に便利で、なおかつどこで
も使える組みこみ関数なだけに惜しい。
062425103/04/04 13:49ID:???
>>606
Win32::APIが入ってないんじゃないの?

>>612
http://www.din.or.jp/~ohzaki/perl.htm#CSV2Values
http://www.din.or.jp/~ohzaki/perl.htm#CSVfromValues

>>614
配列みたいに、キーにはa>bみたいな上下関係無いもん・・・
何をもっての順番なのか意味不明・・・
0625nobodyさん 03/04/04 13:59ID:???
>>614
>キーの格納には乱数を使った手法が使われるため、
って笑われぞ。ちゃんと順番には出てくる。
メモリーの格納順であって、キーの順番になっとらんだけだつーの(w
0626nobodyさん03/04/04 14:11ID:???
>>607
え?ほんとうですか?
0627nobodyさん03/04/04 14:37ID:???
>>626
IISで公開したら違反になるかも。
0628nobodyさん03/04/04 14:43ID:???
>>627
IISってなに?
俺はXP+Active Perl+AN httpdで公開してるけど、、
マズいのかなぁ。
0629nobodyさん03/04/04 14:47ID:???
s
0630nobodyさん03/04/04 14:48ID:n4Opp+jH
ログイン・ログオンなどについて熱く語ってるサイトあったら教えてください。
ヤフーのログイン・ログオンはどういう仕組みなのかな?
0631nobodyさん03/04/04 14:57ID:???
>>630
そりゃ Perl と全く関係無いとは言わないけれど、
そもそも Perl スレに書き込む話題か?
0632nobodyさん03/04/04 15:00ID:???
>>628スルーでつか?
0633nobodyさん03/04/04 15:07ID:???
>>632 なんで>>628氏がライセンス違反になるかなんてわざわざ探して調べてやらにゃならんのだ
0634nobodyさん03/04/04 18:42ID:???
>628
Win板のXPスレで聞いてこい。
0635nobodyさん03/04/04 18:47ID:jyfKo/rm
>>632
スルーでつが?それが何か?
063660603/04/04 19:09ID:???
>>624

試しにperl.exeを起動して、最初の一行目に
use Win32::API;
と、入力してリターンを押すとウインドウが閉じてしまってエラーメッセージすらも見れません

win32::apiが入ってない場合はどのようにすればいいのでしょうか?
よろしくお願いします(´Д⊂)
0637nobodyさん03/04/04 19:16ID:???
>試しにperl.exeを起動して
>ウインドウが

この時点で俺はお手上げだなぁ。
とりあえず、その perl.exe とやらはどこから入手したのさ?
063860603/04/04 19:33ID:???
>>637

ActivePerl-5.6.0.623-MSWin32-x86-multi-thread.msi

のセットに入っている奴です
0639nobodyさん03/04/04 19:41ID:???
>>606
っつーか、perl.exeのウインドウ って何?
0640nobodyさん03/04/04 20:50ID:???
たぶん、>>606 はコマンドプロンプトを知らんのでしょう。
perl.exeを*ダブルクリックで*起動して、perlがstdin待ちになったところへ
use Win32::API;と入れて、すく終了してウィンドウが閉じたと。漏れはUNIX派なので
ここらへんよく分からんが、WindowsだとCtrl-d押さなくても終了になるんかな。

コマンドプロンプトを知らん人が、Win32::APIなど使えるわけありません。あきらめ
た方が時間の節約になりますYO。
0641nobodyさん03/04/04 20:54ID:???
皆わかってて、からかってるんだってば。

優しい人発見。 >>640
0642nobodyさん03/04/04 21:11ID:???
>>641
なんだそうか。ワリィワリィ。
064360603/04/04 21:22ID:???
とりあえず、ある***.plってのを動かしたいんですが
一種類だけ動かないんで聞いてみました

0644nobodyさん03/04/04 21:28ID:OlDxyviA
ページが変わっても変数や配列を保持しておくことができますか?
例えばあるページで使用した$test1=10を次のページでも
form変数やurl変数で送らずに使用したいです。
可能でしょうか?教えてくださいまし。
0645nobodyさん03/04/04 21:29ID:???
>>643

>>640の
> たぶん、>>606 はコマンドプロンプトを知らんのでしょう。
についてはどうかね?
0646nobodyさん03/04/04 21:30ID:???
>644
ファイルに保存しる。
0647nobodyさん03/04/04 21:30ID:???
>>644
ファイルに記録しておく
0648nobodyさん03/04/04 21:32ID:???
>>644
ファイルに書き出しておく
0649nobodyさん03/04/04 21:33ID:???
>>646-648
言い方はいろいろだけど、やってることは同じなのねん。
0650nobodyさん03/04/04 21:36ID:???
>>644
データをプーリングしておくためのサーバを起動しておく。
で、現ページでPUTして次ページでGETする。
0651nobodyさん 03/04/04 21:47ID:???
>>640
レベルはそんな所であろうな・・・
一応Un?xで動かないとか訳解らん事言ってるんじゃないのな・・・

ppm install win32-api

とコマンドプロンプトに打ち込めばモジュールはインスコ出来るけど
ttp://member.nifty.ne.jp/hippo2000/perltips/module_install.htm
>606はココ読んで勉強しなさい
065260603/04/04 22:05ID:???
>>651

解決しました
time-hiresとhttp-liteは入れたんですが、一つ足りなかったようですね
なんか勉強不足で訳分からない事言ってたと思いますが
ありがとうございます
0653nobodyさん03/04/05 01:50ID:???
自作CGIを評価してくれるサイト知りませぬか?
0654nobodyさん03/04/05 03:01ID:???
>>653
俺が評価してやる。貼れ。
0655nobodyさん03/04/05 03:40ID:???
漏れも自作CGIを評価してくれるスレが欲しいな
せっかくだから653が立ててよ
ていうかこのスレでガンガン貼っていってもいい?
一応初心者ってことで質問とは限ってないみたいだし
0656nobodyさん03/04/05 04:00ID:???
ソース貼るなら
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/index.html
で専用スレ立てる方がいいぞ。
半角空白とかそのまま貼れるし。
0657nobodyさん03/04/05 04:14ID:???
iisで鯖公開したら違反ってマジで?
なんでそうなるのよ?
じゃあiisってなにするためにあるの?
0658nobodyさん03/04/05 05:12ID:???
>>657
製品の価格を高くするためでは?
0659nobodyさん03/04/05 05:13ID:???
配列@dataには[0-9],\n,\tとスペースが含まれてます。
それを確かめるためのif文はどう書けばいいのでしょうか?
要するに、
if (配列@dataに、[0-9],\n,\tとスペース以外が使われている){
&error;
}
この( )の中の記述です。
やっぱforeach等でまわさないとダメっすか?
0660nobodyさん03/04/05 05:25ID:???
>>659
if (join('', @data) !~ /^[0-9\n\t ]+$/){
&error;
}
066165903/04/05 06:45ID:???
>>660様!
完璧っす!
joinの使い方覚えました!

実は。。。
/^[0-9\n\t ]
を
/[^0-9\n\t ]
って読み違えてて。。。
きゃははははは! (もう笑うしかない。。。 自爆)
0662マリモーマ ◆r6PDGT6Xd2 03/04/05 11:23ID:4Hc1kYlW
僕が立てようと思ったが 無理だった  よかったら 下を使ってね
タイトル 自作CGIを評価するスレ
内容   自分の作った CGIを みんなに評価してもらうレスだよ
0663nobodyさん03/04/05 11:59ID:???
>>661
>きゃははははは! (もう笑うしかない。。。 自爆)
                            ~~~~~~
0664nobodyさん03/04/05 12:13ID:???
>>655
独立したスレの方がいいと思う。。。ここではPerl以外はスレ違いになるし。
0665nobodyさん03/04/05 12:21ID:???
というわけで立ててくる。
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取得する方法ないっすかね?
■ このスレッドは過去ログ倉庫に格納されています