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

【Perl】初心者コーナーPart9

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。01/12/28 23:21ID:SPLRvqQi
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。

参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://pc.2ch.net/test/read.cgi/php/988809842/
CGIの質問はこちら【CGIだけど、なんか質問ある?part5】
http://pc.2ch.net/test/read.cgi/php/1009331505/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/

過去ログ、その他の役立ち情報は>>2-10を見よう。
0004名無しさん@お腹いっぱい。01/12/28 23:37ID:SPLRvqQi
[Module]
 ・Perl Module Reference: http://www.bekknet.ad.jp/~bero/docj/module/
 ・PPMPackages: http://www.activestate.com/PPMPackages/
 ・河馬屋二千年堂's Page: http://member.nifty.ne.jp/hippo2000/index.htm
[Security]
 ・安全なプログラミングのためのガイドライン:http://www.FreeBSD.org/ja/security/#spg
 ・Perl security:http://www.perldoc.com/perl5.6/pod/perlsec.html
 ・CGI and Security http://www.japu.org/cgi/security/
 ・Perl security和訳:http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlsec.html
 ・The Unofficial Web Hack FAQ:http://www.nmrc.org/faqs/www/
 ・How to Write Secure Code:http://www.shmoo.com/securecode/
 ・Safe CGI Programming :http://www.improving.org/paulp/cgi-security/safe-cgi.txt
[OS]
 ・Linux日本語マニュアル:http://www.linux.or.jp/JM/
 ・FreeBSD日本語マニュアル:http://www.jp.freebsd.org/man-jp/
0005_gunzip01/12/28 23:46ID:SPLRvqQi
ごめん。ついでにこれも。

Perl6 & Parrot VM についての情報
http://dev.perl.org/perl6/

--------------------
Parrot Hello world!
--------------------
# hello.pasm
print "Parrot Hello world!\n"
end
0006名無しさん@お腹いっぱい。01/12/29 00:20ID:5xfLHV23
PERLでSharedMemory使ったりセマフォ切りたい
時のお勧めサイトって有る?
0007名無しさん@お腹いっぱい。01/12/29 01:08ID:???
>>5
TryAndCatch萌え ヽ(´ー`)ノ

FILE *handle1 = NULL, *handle2 = NULL, *handle3 = NULL;
try {
handle1 = fopen ( ... );
handle2 = fopen ( ... );
handle3 = fopen ( ... );
...
}
catch ( ... ) {
if ( handle1 ) close ( handle1 );
if ( handle2 ) close ( handle2 );
if ( handle3 ) close ( handle3 );
throw;
}
0008名無しさん@お腹いっぱい。01/12/29 14:21ID:gaX+fcP8
try-catchはいいやね。
文字列検索よりは早そうだし。
0009名無しさん@お腹いっぱい。01/12/29 22:51ID:???
age
0010名無しさん@お腹いっぱい。01/12/30 08:01ID:tHdvBy1w
>1
スレ立てお疲れ様です。
さっそく質問させていただきます。

Win98にActivePerlをインストールしましたが、
DOSプロンプトから起動できません。
「コマンドまたはファイル名が違います」と言われてしまいます。

sample.plをダブルクリックすると、一瞬だけですが起動するので
Perl自体のインストールは出来ていると思いますが……。

何がおかしいのか、考えられることを教えてください。
0011名無しさん@お腹いっぱい。01/12/30 11:13ID:???
>>10
DOSプロンプトから perl -v でVersion情報が出力されますか?
問題無く出力されるようなら、
 perl C:\somewhere\sample.pl
で実行できるはずですが。(C:\somewhere\は適当に読み替えて下さい)
0012デフォルトの名無しさん01/12/30 11:16ID:???
スクリプトの多分岐にわたる
セッションのテストってどんな風にしてます?
モンキーレンチとか使えるのかなぁ・・・・・
0013名無しさん@お腹いっぱい。01/12/30 12:59ID:???
>>10
PATHが通ってないだけじゃないの?
0014名無しさん@お腹いっぱい。 01/12/30 13:56ID:???
ちょっと読んだ
能動的な型付けとか、最適化に関わる所が結構突っ込まれてるのかな
Class eq Package じゃ無くなるってのも中々よさげ
今よりずっとOOusefulになると良いな

でもオペレータ変更しすぎなんだよ先生よぅ・・・・
%hash{foo} ← これが参照外したスカラーなんて・・・ (死
0015名無しさん@お腹いっぱい。01/12/30 13:59ID:???
あ、>>5 @ _gunzipさんね
>>10
同じくPATHに一票
SETENVだかPATHだかでSET出来たかな(適当)
キーワード書くから調べて栗 w
「PATH」「環境変数」「DOS」「追加」「SET」
0016名無しさん01/12/30 14:54ID:???
>14
間違えてんぞ〜
$hash->{foo} が $hash{foo} or $hash.{foo} だろ、んで
$hash{foo} が %hash{foo} だよん
つーか嫌すぎこれ
0017名無しさん@お腹いっぱい。01/12/30 14:57ID:vG4UP0Ys
%tmp = ("aa0"=>"00","aa1"=>"11","aa2"=>"22");
foreach(0..2){$tmp[$_] = $tmp{aa$_};}
みたいな事をやりたいのですが、
foreach(0..2){$tmp = "aa$_"; $tmp[$_] = $tmp{$tmp};}
しかわかりません。
もっとスマートな方法があれば教えて下さい m(_ _)m
0018名無しさん01/12/30 15:05ID:6JQJx1N9
WEB上でアイコンがUP出来る掲示板とかありますか?
0019名無しさん01/12/30 15:18ID:???
>17
ん?
foreach(0..2){$tmp[$_] = $tmp{aa$_};}
  ↓
foreach(0..2){$tmp[$_] = $tmp{aa.$_};}
00201701/12/30 15:42ID:vG4UP0Ys
>19
あっ、そうですね。恥。。
即レスどうもありがとうございます。
00211001/12/30 17:17ID:???
>11、>13、>15
どうもお答えありがとうございます。
カレント\binでは、perl -vもちゃんと動いていましたが、
他の場所からでは起動できませんでした。
だからアドバイスどおり、PATHが通っているかをまず疑いました。

autoexec.batには、SETで始まる\binまでの行がちゃんとありました。
しかし実際にはうまくいっていないため、
試みにこの行を上の方にもってきて、再起動をすると、なぜかうまくいきました。

というわけで(一応無事に)解決したようです。
どうも助かりました。ありがとうございました。
0022名無しさん@お腹いっぱい。01/12/30 23:56ID:uoyv0Wnn
open DAT,">>$file";
上の様に追記でファイルをオープンした場合
ファイル内容が空になる瞬間というのはあるのですか?
0023名無しさん@お腹いっぱい。01/12/31 00:40ID:???
>>22
ある。

* 他のプロセスが空にする。
* 自分で空にする。
0024ダメ男01/12/31 03:34ID:zWJaANkc
その他では、新規ファイル作成時も
00252201/12/31 03:42ID:lAX6iAu+
今2個のプロセスで追記しまくった所
平気だったです。
00262201/12/31 04:42ID:lAX6iAu+
もう一個質問よろしいですか?
$tmp = "o(";
@data=grep(!/$tmp/,@data);
↑これを実行するとエラーとなるんですが、
何故でしょうか?
0027ダメ男01/12/31 05:07ID:SHzKQGPS
$tmp= "o(";
  ↓
$tmp = "o\\(";
0028名無しさん@お腹いっぱい。01/12/31 12:50ID:???
"("はRegexpのメタ文字なんだよ。
00292201/12/31 15:02ID:???
$tmpの部分は入力フォームから入力してもらい、
さらにgrepした後入力を表示させたいのですが、
こういう場合$tmpに格納されている文字はただの文字として
検索するという方法は無いのでしょうか?
またo(以外にも「ソ」もエラーになるのは文字コードが
メタ文字とかぶっているからですか?
00302201/12/31 15:27ID:???
とりあえず
@data=grep{($tmp1,$tmp2)=split /\t/,$_;$tmp1 ne $tmp}@data;
で緊急避難しました。
29の方法あったら教えて下さい。
0031デフォルトの名無しさん01/12/31 15:51ID:???
>22
無い。但し存在しないファイルならサイズはO
>30
キーワード出たら検索な
http://www.google.com/search?hl=ja&q=PERL+%83%81%83%5E%95%B6%8E%9A+%83G%83%89%81%5B&lr=lang_ja
0032名無しさん@お腹いっぱい。01/12/31 15:59ID:???
>>30=22
CGIかなにかだと思うけど、内部の処理でS-JISを使用するのはお勧めしない。
入出力と内部の処理は分けて、内部ではEUCなんかを使うのが吉。

あと参考までに、quotemeta() や \Q も調べておくとよいでしょう。
 perldoc -f quotemeta
 perldoc perlre
00332201/12/31 21:02ID:???
>>31
どうもすいませんです;;
と検索どうもです。
>>32
なるほどです。
quotemeta() 調べてみます。

ご親切にどうもありがとうございました。
0034おねがいします!02/01/01 02:00ID:RjS1sLKo
超初心者なんですが、、、。
逆スラッシュが打てません。
\になっちゃうんです。
どうしたらよいのでしょうか?
0035名無しさん@お腹いっぱい。 02/01/01 02:43ID:???
http://www.kt.rim.or.jp/~ksk/yen2bs/indexj.html
これをインストールしよう!
0036名梨さん ◆FkWCoMC. 02/01/01 02:44ID:???
>>34-35
34のOSのバージョンわかんないじゃん。。
ちゃんとそれくらい言おうよ>>34
0037名無しさん@お腹いっぱい。02/01/01 02:55ID:???
>>34
おれにはちゃんと逆スラッシュに見えてるが?
00383402/01/01 02:57ID:dE6tT7ED
>36
すみません。
Mac OS 9.04
MacJPerl 5.2.Or4 J1
です。
よろしく!
0039名無しさん@お腹いっぱい。02/01/01 03:01ID:???
みなさん、おめでとうございます!
perlfuncだとdbm〜〜の変わりにtie,untieを使えと書かれてますが
レンタルサーバでモジュールの依存関係(標準も入ってないdeath)何かが面倒な時
はdbm〜を使っても良いですか?
1000件程度なんでそれ程速度も気になりません

>>34
\のままで良いよ (^-^
全角はダメだよ
0040 02/01/01 06:07ID:RYgD0SJz
@char=('0'..'9','a'..'z','A'..'Z');

という62文字を使って 1 (あるいは 0)から ZZZZZZZZ までの
62進数を順番に生成したいのですが、上手にやる方法はありますか?
0041デフォルトの名無しさん02/01/01 16:51ID:???
>40
ハードコーディングで良いなら
push (@value,0) for (1..8);
これを初期値(つまり$value[0]が1桁目、$value[1]が2桁目)にして
値を1増やす関数と、@valueを分解しながら$char[$value[$_]]とかして
表示する関数を書いてみ。
それが出来たら桁とか@charを可変に出来る様にしてみよう。
0042名無しさん@お腹いっぱい。02/01/01 22:46ID:mPGnAlls
Benchmarkモジュールについて教えて下さい。

Benchmark: timing 10000 iterations of for,foreach...
for: 27 secs (27.18usr 0.00 sys = 27.18 cpu)
foeach: 11 secs (10.54usr 0.00 sys = 10.54 cpu)

この出力結果はどういう意味なんでしょうか。forとforeachというアイテム?を比べて、
forが27秒かかってforeachは11秒、これはforeachの方がお得だね、というのは判るんですが、
usrとsysの意味が判らないです。この二つからcpuの使用率を出してるようなんですけど…
0043名無しさん@お腹いっぱい。02/01/02 02:17ID:???
usrが動かしてるべんちに掛かった時間じゃネーノ
んでsysが他のプロセスが使った時間じゃネーノ
んでcpuがトータルのCPU時間って事じゃネーノ
適当に想像だけどね
つーかその結果の方が気になるわっ (w
00444202/01/03 02:53ID:jaPZDeyi
なるほど、何やってもsysが0のままなのが不思議でした。
ありがとうございました。
0045 02/01/03 23:06ID:sFx8M0Lj
>>39
dbmかndbm入っているんだったら、dbmopen使ったって別にいいんじゃないかと思うけど。
将来のバージョンでの対応が保証がされないだけで(笑)
動けばいいやっていうんだったら、全然かまわないかと。
0046名無しさん@お腹いっぱい。02/01/04 00:04ID:VeQd/ckC
>>1 参照不能と言いつつ参照できるぞ
0047名無しさん@お腹いっぱい。02/01/04 00:16ID:???
皆が2ch用ブラウザを利用しているわけではない。
0048名無しさん@お腹いっぱい。02/01/04 12:28ID:SUGVa40q
3Gくらいのテキストファイル処理をしたくすったもんだやっています。
GDBMを使ってDB化(?)しているのですが、
tell & seek のサイズ限界にひっかかっているようです。
この場合は、ファイルを分割するしかないのでしょうか?
初心者です。よろしくお願いします。
0049名無しさん@お腹いっぱい。02/01/04 14:01ID:???
Tie::Handle::BigFileを自分で実装してみるとか。
なかなか面白そうだ。
00504802/01/04 14:14ID:SUGVa40q
ぐぅ〜 そんな力も時間もないでちゅ・・・・・
00514802/01/04 14:15ID:???
わしのIDカコイイな。
00524802/01/04 14:30ID:SUGVa40q
>>49
教えてちゃんですみません。ロジックのヒントをお願いします。
0053名無しさん@お腹いっぱい。02/01/04 14:49ID:kY4aCT8X
既出かもしれませんが。教えてください。
あるCGIで生成した結果を表示後それをHTMLファイルとして保存するにはどうしたらよろしいでしょうか?
0054名無しさん@お腹いっぱい。02/01/04 14:51ID:???
ファイル(F)→名前を付けて保存(A)...
00555302/01/04 14:51ID:kY4aCT8X
追記
HTMLとして保存するスクリプト、または関数をご存知の方お教えください
00565302/01/04 14:53ID:kY4aCT8X
>>54たぶんそんなつっこみがくるとおもってました。(藁
追記です
HTMLとして保存できるスクリプトか関数をお教えください
0057初心者02/01/04 14:58ID:???
>>53
初心者だけど。

HTMLで結果吐いて、
同じ内容をtimeなりでファイル名決めて書き出せばいいのでは?
0058初心者02/01/04 14:58ID:???
あとは自分で調べる努力を。
00595302/01/04 15:04ID:kY4aCT8X
>>57
マジ、わからないんですが、おっしゃられているのは「ファイル(F)→名前を付けて保存(A)...」
で保存してってことですか?
0060名無しさん@お腹いっぱい。02/01/04 15:09ID:???
>53
ダイジョウブ?
0061初心者02/01/04 15:10ID:???
この辺とか。
http://www.google.com/search?num=100&hl=ja&q=perl+%83t%83@%83C%83%8B%83n%83%93%83h%83%8B+print&lr=lang_ja

あとは自分で調べる努力を。
00625302/01/04 15:18ID:kY4aCT8X
>>61
ありがとうございます
0063名無しさん@お腹いっぱい。02/01/04 16:04ID:???
板にgzipをとり入れようと思うんだけど
どのように記述すればいいんでせう?
よろしくお願いします。
0064名無しさん@お腹いっぱい。02/01/04 16:05ID:???
それPerlの質問か?
0065名無しさん@お腹いっぱい。02/01/04 16:14ID:???
>>48
分割したファイルが一つのファイルのように見えるようにインターフェイスを整えるのだ。
だから本当に大きなファイルが扱えるわけではない。
それでいいならちょいと書いてみるが?
0066名無しさん@お腹いっぱい。02/01/04 16:33ID:ZcIQHoBD
KENTのPetitBoardに新記事のマークを付けるにはどうしたらようのでしょうか?
00674802/01/04 16:33ID:SUGVa40q
>>65
ありがとうございます。お願いいたします。 ;;

ファイルサイズはこの先大きくなる一方なのですが、分割していくしかないでしょうか?
もしくは、データベースに突っ込むか・・・・・・

「Cで書け!」と言われてしまいました。
齢20代後半で今からCは身に付くでしょうか? ソース見てもクラクラします ;;
00686502/01/04 16:58ID:???
そんなに期待されると…(汗

あくまでも個人的に面白いと思うから作るだけなんで。
だからといって適当な物を書くわけじゃないですが。

ついでに言うと*DBM_Fileとの連携は出来ないかと。
0069名無しさん@お腹いっぱい。02/01/04 17:16ID:???
166 名前:名無しさん@お腹いっぱい。 投稿日:02/01/04 16:48 ID:ZcIQHoBD
KENTのPetitBoardに新記事のマークを付けるにはどうしたらようのでしょうか???


167 名前:名無しさん@お腹いっぱい。 投稿日:02/01/04 16:51 ID:???
↑何でマルチすんだよ糞ガキ消えろ


168 名前:名無しさん@お腹いっぱい。 投稿日:02/01/04 16:56 ID:ZcIQHoBD
うるせぇ俺は20歳だ。そんだけ気になっとんだ。


169 名前:名無しさん@お腹いっぱい。 投稿日:02/01/04 16:57 ID:ZcIQHoBD
そんな事より即効で文句言うてめぇの方がガキだ。
0070名無しさん@お腹いっぱい。02/01/04 17:37ID:AGeoy3Tc
>>67
バイナリで書くよりはCの方が簡単です。

まぁマジレスすると身につかないことは無い。
構文自体はPerlに似てるし。ただ、Perlに比べて
もっと「プログラムらしい規約」が多々出てくるので
Perl以外にプログラムをやったことが無かったら
馴染めないかもね。

おれは逆にZ80からCやFortran、RINGOやAppleScript等を
経てからPerlに来て、なかなかPerlに馴染めなかったけど。
00714802/01/04 18:02ID:SUGVa40q
>>68
すみません。ヒント程度の気楽なもので十分です。
ありがとうございます。
やりたいのはレコードの検索なので、DBMと連携なりは、考えます。

>>70
ありがとうございます。道のりの割に、使う機会が少なそうで・・・・
でも追い込まれないと勉強しないし・・・・・
自分は、N88BASIC -> 永い永い月日 -> Perl, PHP, VBScript群
しょぼ。
00726502/01/04 19:28ID:???
とりあえず

・配列にファイルハンドル(以下FH)を入れておく

・そのFHを通じて何か書き込みをする度にサイズをチェック(stat()してもいいし長さを記録しておいても良い)
・サイズが一定値を超えたら新しいファイルを作成して配列に新しいFHを追加
・seek()やらtell()やらは合計ファイルサイズを考慮して計算
・これらのことを通常のIOインターフェイスを通じて行えるようにタイクラスに閉じ込める。

って感じで(超適当な説明だが)

DBMと連携するにはまた別のことを考えなきゃいけないね。
複数のDBMハッシュを保持したタイハッシュクラスを考えればいけるんじゃないだろうか。
0073 02/01/04 19:32ID:CJ4spD6O
PostgreSQL使ってみるとか。
0074 02/01/04 19:36ID:CJ4spD6O
後は検索ルーチン次第だけど、検索項目ごとにインデックス用のDBM作って、
メインデータは、データのカテゴリごとに分割する。
データ自体に一意のID振っておけば、それでデータの抽出が出来る。
そもそも、そんな巨大なデータをwhileとかで回しても、効率よくないだろうし。
00754802/01/06 14:51ID:4VaeiTUG
>72
うをー! ありがとうです! エンジンかかってきた! やるでー!!

>73 >74
ありがとー
DBに入れるのも考えましたが、ディスク資源も既に虫の息なので、ホント ツライです。
0076名無しさん@お腹いっぱい。02/01/07 23:02ID:???
>>75
シーラカンス本(約\3,500)説明ワカリヤスイヨ.
プログラミング一から勉強するよりよっぽど楽勝ですし。
0077名無しさん@お腹いっぱい。02/01/08 16:04ID:2bmV9luV
アクセスカウンターやその他のデータを
ファイルに記録する時などでファイルを
open (FILE,"+<$file");
で開いて変更するのと

open (FILE,"$file");
書き換え作業
open (FILE,">$file");

という方法だと後者だと良くないのでしょうか?
0078名無しさん@お腹いっぱい。02/01/08 16:06ID:???
良くなくない
0079名無しさん@お腹いっぱい。02/01/08 16:11ID:???
>>77
どういう考えでそういう結論に至ったのか問い詰めたい
0080名無しさん@お腹いっぱい。02/01/08 16:20ID:2bmV9luV
即レスどうもです。
いろいろスクリプト見てると前者の方が多いと感じまして
後者の方はいかんのかな?と思ったです。
特に問題は無いと考えて良いみたいですね。
他に美しくない、負荷がかかる、なんかの問題も
無いのでしたら、何故前者の方がよく使われてるのでしょうか?
0081名無しさん@お腹いっぱい。02/01/08 16:35ID:???
前者の方がコードが簡単だからではないだろうか。
処理中に落ちてデータが壊れる確率も大差ない気がする。

消えにくいようにするならこれかな?

open IN, "<$file" or die;
# ...
close IN;
open OUT ">$file.tmp" or die;
# ...
close OUT;
rename "$file.tmp" => "$file" or die;

0082名無しさん@お腹いっぱい。02/01/08 16:36ID:XZoY9u5U
>処理中に落ちてデータが壊れる確率も大差ない気がする。

後者の方が壊れる確率高いよ。
0083名無しさん@お腹いっぱい。02/01/08 17:03ID:2bmV9luV
1度のopenで、ファイルに書き込むデータのサイズが
減る可能性がある場合はtruncateは必須なんでしょうか?
0084名無しさん@お腹いっぱい。02/01/08 17:09ID:???
>>83
まず自分で試して見れ。
0085名無しさん@お腹いっぱい。02/01/08 17:11ID:???
どう言う意味が分からないよぅ。
ファイルサイズを揃えておきたい時なんかはそのまま書き出して
閉じたりするよ
必須と聞かれればNOになる
0086名無しさん@お腹いっぱい。02/01/08 17:28ID:???
>>84-85
ごめんです
試したら思いっきり変になりました。
これってOSによって実装されてない場合あるんですよね?
あんま使いたくなかったなぁ。
レスどうもでした。
0087名無しさん@お腹いっぱい。02/01/08 17:45ID:2bmV9luV
すいません。もう1つ質問よろしいでしょか?
皆さんはチャットやらカウンターなんか作らない
かもしれないですが、
カウンターの場合は読み書き両用で1度だけopenするのに対して
チャットなんかだと読み込みのみでopenして
書きこみはまた後で書き込みのみでopenしてるのですが
この違いは何なのでしょうか?
0088名無しさん@お腹いっぱい。02/01/08 17:48ID:???
作ったヤツに聞け。
0089デフォルトの名無しさん02/01/08 18:06ID:???
カウンターだからチャットだからと言う事は無い
ただCGI(だよな??)は排他とかトランザクション取らなきゃならないので
色んな手法でデータの同一性を保証出来るようなコードを書く必要は有る
チャット位ならどうって事ないような気がするが
0090どなたか02/01/09 12:29ID:6I7ENOMK
指定した個数の固有な乱数を効率良く得る方法ってありますか?
例えば1から100の範囲で4つ乱数を生成して、それを一つの配列に入れたいんですが。

$max = 乱数の最大値
$num = 個数
@kekka = 得られた乱数を[0..($num-1)]で格納する配列

という風にしたいんですが、どうしてもうまくいきません。
単純に指定個数の乱数を作って配列に入れるならできるんですが、
重複を許さないためにifやwhileで今までの結果を参照させようと
するとうまいコードが思い浮かびません。
もしかしたら簡単な解決方法があるのかと思いここに書き込ませてもらいました。
0091デフォルトの名無しさん02/01/09 13:06ID:???
uniqな値って事かな

until ($n == $max) {
 $r = rand(100);
 push(@ary,$r) and $n++ if(!grep /$r/,@ary);
}
0092デフォルトの名無しさん02/01/09 13:08ID:???
あ、ちょっと違うか
until (my $n == $num) {
 my $r = rand($max);
 push(@kekka,$r) and $n++ if(!grep /$r/,@kekka);
}
0093名無しさん@お腹いっぱい。02/01/09 13:19ID:???
なんとなく90は「整数を」欲しがってるきがするので、その書き方をしてみる。

my @kekka;
my $max = 100;
my $num = 4;

die('$max の値が $num より多いとダメだから注意な。') if $num > $max;

my %temp;
my $rnd;
my $n = $num;
!$temp{($rnd = int(rand $max) + 1)}++ and push(@kekka, $rnd) and --$n while $n;
00949302/01/09 13:20ID:???
あ、dieのメッセージが逆だ(w
00959002/01/09 13:23ID:6I7ENOMK
おお!早速有り難うございます。そうです、uniqueな値を指定個数生成したいんです。
でも実行してみたらループしてる・・・うーん、どっか変数間違えたかな。
こんな感じでやってみたんですが

#ここから

$max="10";
$num="4";

until (my $n == $num) {
my $r = int(rand($max));
push(@kekka,$r) and $n++ if(!grep /$r/,@kekka);
};

print "@kekka";

#ここまで

これってgrepの結果が真だった場合は同じ$nでまたループしてるんですよね。
ということは、grepが真を返してない(?_?)
0096名無しさん@お腹いっぱい。02/01/09 13:25ID:lzfPILoX
ちかごろは、srand;しないでも良くなったんですか?
00979002/01/09 13:26ID:???
お!!!93さんの動いた!!!
助かった〜〜〜
91さんも93さんも有り難うございます。
解読して考え方を参考にしますね。
00989002/01/09 13:27ID:6I7ENOMK
>>96
perl5だといらないそうです
0099名無しさん@お腹いっぱい。02/01/09 13:28ID:???
>96
らしき話をどこぞで見たような。
01009002/01/09 13:31ID:???
自己レス。 5.004 以降だとsrandが無い場合は最初のrandが自動的に
呼び出しているそうです。その場合はtimeとprocess IDを元にsrandしている
ことになるそうです。受け売り。
0101名無しさん@お腹いっぱい。02/01/09 13:54ID:lzfPILoX
>>98-100
なるほど〜、ありがとうございます。
5.003以前だとsrandしないといけないって事ですね。
バージョン依存は難しいです、いろいろ。。。
0102名無しさん@お腹いっぱい。02/01/09 15:11ID:yTZZpKpq
初めまして、今回仲間内のHPで出席簿を作ってみようということになって少しやってみたのですけど
まったくうまい子といきません。
やりたいことは、名前入力 名前に対してのカウント数
これくらいです。
一応ソース載せます、めちゃくちゃだと思うので一から出直せとかきついこといってください。
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
foreach $pair(split(/&/, $query)){
($name,$value)=split(/=/,$pair);
$name=$value;
}

OPEN(FILE, ">+./$name/count.dat);
$count=<FILE>;
print FILE ++$count;
close<FILE>;
OPEN(NAME, ">+./namedata.dat");
while ($check=<NAME>){
if ($check ne $query){
seek(NAME,0,2);
print NAME $query\n;}
}

####スミホマ
print"content-type: text/html\n\n";
print"<table border=\"1\">";
while($uname[$list]=<NAME>){
$data="./$uname[$list]/count.dat";
print"<tr><th>$uname[$list]</th><td>$data</td>\n";
}
print"content-type: text/html\n\n";
print"<table border=\"1\">";
foreach $key (sort keys %uname){
print"<tr><th>$key</th><td>
まだ途中です。
0103名無しさん@お腹いっぱい。02/01/09 15:29ID:???
>>102
それだとフォームからのを ほとんど読み捨てない?
あと
OPEN(hoge,">+ filename");
だと関数名が違ううえに 開いた途端ファイルが空になりそう。
http://tohoho.wakusei.ne.jp/wwwperl.htm
■ このスレッドは過去ログ倉庫に格納されています