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

Perlコーディング初心者質問スレ Part 38

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/10/07 23:23:08ID:kiEzDCJF
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0007nobodyさん04/10/07 23:39:18ID:???
だれも言わないから言っとく。

>>1 乙かれー
0008nobodyさん04/10/07 23:39:26ID:???
前スレ1氏より

http://www.geocities.co.jp/SiliconValley/5656/
http://www.hyuki.com/writing/techask.html

これはMLでの作法ですが、BBSでの質問にも当てはまると思います。
例え匿名でも、回線の向こうに居るのはあなたと同じただの人ですよ。
0009nobodyさん04/10/07 23:40:21ID:???
あと何かないかな。

WikipediaのPerlの項目
http://ja.wikipedia.org/wiki/Perl
0010nobodyさん04/10/07 23:44:13ID:???
前スレの>>1は文章自体は別に構わないと思うけど、前スレ>>987の意見を考慮して
以前の>>1に戻しました。

0011nobodyさん04/10/08 00:27:11ID:???
>>1乙。シャラポア マンセー
0012nobodyさん04/10/08 00:40:34ID:LN3yr29s
人によってコードの書き方は色々だと思うのですが、
一般的に美しいとされるコードの書き方はどのような書き方ですか?
参考になるようなソースがあればお教えください。
0013nobodyさん04/10/08 01:16:04ID:???
>>12
http://perldoc.com/perl5.8.4/pod/perlstyle.html
http://perldoc.jp/docs/perl/5.8.0/perlstyle.pod
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlstyle.html
00141204/10/08 02:14:31ID:LN3yr29s
どうもありがとうございます。
しかしながら、見た目の美しさではなく、
コードを後から読む人にとって、
直感的に、わかりやすいコードという意味で、美しいといいました。
誤解を招く言い方でスイマセンでした。
0015nobodyさん04/10/08 03:17:19ID:???
>>14
perlstyle にはそういう意味で美しくする為の Tips も載っているだろ?

より具体的に知りたければ、自分の書いたコードをコードレビュー系の
ML なりスレなりに投下してごらん。偏った意見が聞けて面白いよ。
http://pc5.2ch.net/test/read.cgi/php/1049514428/
00161204/10/08 03:46:07ID:LN3yr29s
スレに投下作戦で行こうと思います。
参考になりました。どうもありがとう。
0017nobodyさん04/10/08 03:58:51ID:???
>>1
スレ建て乙

>>14
>コードを後から読む人にとって
それだったら、コーディング標準に従ったコード >>13のURL参照
独自ルールだとどうしても*自分にとって*美しいコードになってしまうことがあるので

質問の意図からすると、
設計の簡潔さ、適切なサンプルコード/ドキュメント(POD)を重視した方がいいんじゃないかな
場合によってはコードを読まずにすませられることもあるよ。
0018nobodyさん04/10/08 09:25:10ID:D4NtGdWq
文字列の中に関数を直接展開するにはどうすればいいのでしょうか?
シェルスクリプトでいうところの↓みたいなことがしたいんですが
echo "current dir is `pwd`"
以前このスレで教えてもらったのですがやり方を忘れてしまいました
ログもググってみたんですが見つかりませんでした
0019nobodyさん04/10/08 11:14:19ID:???
print "current dir is " .`pwd`;

これが高速だし読みやすいのでお勧めだが…
(printに関して言えば、ピリオドよりコンマの方が良いが)

print "current dir is ${\`pwd`}";
print "current dir is ${\do{ `pwd` }";
print "current dir is @{[ `pwd` ]}";

ま、こんな感じで。
0020nobodyさん04/10/08 14:50:00ID:???
モジュールを使うことがオブジェクト指向ということになるんでしょうか?
0021nobodyさん04/10/08 15:16:43ID:???
>>20
全然違います。
モジュールとオブジェクト指向に直接関連はありません。
0022nobodyさん04/10/08 16:02:04ID:SvnbdnXk
プログラム実行中にperlでエラーメッセージを
別ウィンドウを使って表示することは可能でしょうか。
javascriptを使えばできるようなのですが、
perlのみでは無理なのでしょうか?
スレ違いなら申し訳ないです。

00231204/10/08 16:09:32ID:HUGW4EIR
>17
どうもありがとうございます。

>>コードを後から読む人にとって

>設計の簡潔さ、適切なサンプルコード/ドキュメント(POD)を重視した方がいいんじゃないかな
>場合によってはコードを読まずにすませられることもあるよ。

ところで、PODとは、コメントのことでしょうか?
コメントだとしても、コードを読まずに済ませられるとは考えにくいので
違う気もします。宜しけれご教授ください。
0024nobodyさん04/10/08 16:28:01ID:???
>>22
スレ違いもしくは板違い。
http://pc5.2ch.net/hp/
http://pc5.2ch.net/test/read.cgi/php/1095633323/

>>23
http://perldoc.com/perl5.8.4/pod/perlpod.html
http://perldoc.com/perl5.8.4/pod/perlpodspec.html
http://perldoc.jp/docs/perl/5.6.1/perlpod.pod
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlpod.html
0025nobodyさん04/10/08 16:39:18ID:3yz40YUb
sendmailでメール送るときにccとかってどう書けばいいですか?


open MAIL ,"| /usr/sbin/sendmail -t";
print MAIL "From: ".'"ほげほげ" <info@2ch.net>'."\n";
print MAIL "To: ".''."\n";
print MAIL "Cc: ".'<test@test.jp> <hoge@hoge.net>'."\n";
print MAIL "Bcc: ".''."\n";
print MAIL "Subject: ".""."\n";
print MAIL "\n";
print MAIL "test";
close MAIL;

みたいにしても動作しませんでした。
もちろん普通にtoだけいれたら動作します。
どなたかお願いします。
0026nobodyさん04/10/08 17:35:29ID:???
スパムに使われそうだから、回答しないわ
0027nobodyさん04/10/08 17:47:14ID:???
>>23
> ところで、PODとは、コメントのことでしょうか?
> コメントだとしても、コードを読まずに済ませられるとは考えにくいので

PODは、コメントと言うよりは、ドキュメントと言った方が適切かもしれない。

Perlの標準モジュールの多くは慣習的に、
モジュールの説明、そのモジュールの使い方(実際に動く最小限のコード)
関数/メソッドのリファレンス、... などを含んでいるので
たとえば、◯◯をしたいといったとき、
PODにそのサンプルが載っていれば内部実装のコードを読む必要はない。
(デバッグで必要になる時までは...)
00281204/10/08 18:01:20ID:HUGW4EIR
>24 >27
どうもありがとう。色々コード&POD読んでみます。
精進します。ありがとう。
00292504/10/08 18:25:06ID:3yz40YUb
>>26
spamに使うならID出しませんよ。

どなたか>>25の回答をお願いしますm(__)m
0030nobodyさん04/10/08 18:26:49ID:???
>>26
ソンナコトイッタラナンデモソウジャナイカw

ウイルス作成に使われそうだから、このスレ閉じるか?
0031nobodyさん04/10/08 18:38:42ID:???
>>25
open MAIL ,"| /usr/sbin/sendmail -t";
print MAIL "From: ほげほげ <info@2ch.net>\n";
print MAIL "To: \n";
print MAIL "Cc: <test@test.jp>,<hoge@hoge.net>\n";
print MAIL "Bcc: \n";
print MAIL "Subject: スレ違い\n";
print MAIL "\n";
print MAIL "Ccでアドレス列記はperlには関係することではない";
close MAIL;
0032nobodyさん04/10/08 19:01:26ID:???
IDなんて飾りですよ
003335023500533629004/10/09 17:26:34ID:???
節穴とどっちが個人特定性が高いだろうか
0034nobodyさん04/10/09 18:07:02ID:???
>>33
その節穴ってどうなってんの?

個人特定性は節穴の方が高いでしょ。ID衝突は時々見かける。
0035nobodyさん04/10/09 19:46:27ID:r3ZvWrWV
ログが100行を越した場合最後の1行を残してあとのログが消えるようにしているのですが
ログが10行を越したときに1行だけ残してあとのログが消えるようにするのとどっちが負荷が低いのでしょう_?
つまり、頻繁にログを1行にするのと、100行ものログを読みこむのと、どちらが負荷がかかるんでしょう。
0036nobodyさん04/10/09 19:51:25ID:???
>>35
自 分 で 試 し ま し ょ う 。

use べんちまーく;
0037初心者です。04/10/09 20:26:36ID:fCvsZBf9
フリーの掲示板の設置が上手く出来たのですが、スクリプトの改造で
以下の戻り先URLの設定でターゲットの設定は出来ないのでしょうか?
_topに戻りたいのですが、戻れません。

# 戻り先URL
$home = 'http://xxxxx.com/index.html';

誰か教えて下さいませ。大変困ってます。<(_ _)>
0038nobodyさん04/10/09 20:29:04ID:???
>>37
スレ違いもしくは板違い。
http://pc5.2ch.net/hp/
http://pc5.2ch.net/test/read.cgi/php/1095633323/
0039nobodyさん04/10/09 21:00:25ID:LGUhwPv/
IISでActive Perl入れてやってますが
SMTPを使ってのメール送信で送れてはいますが
OEでの受信で宛先の部分が
undisclosed-recipients になってしまいます。
送信元は正常に表示されているのですが。
どこを修正すればよいでしょうか?
お願いします。

use Net::SMTP;
$smtp = Net::SMTP->new('***.***.ne.jp'); #SMTPサーバ
$smtp->mail(from@test.ne.jp); #送信元
$smtp->to(to@test@ne.jp); #宛先
$smtp->data();
$smtp->datasend("Subject:メール\n"); #件名
$smtp->datasend("メール本文");
$smtp->dataend();
$smtp->quit;
00403904/10/09 21:03:05ID:LGUhwPv/
間違いました
× $smtp->to(to@test@ne.jp); #宛先

○ $smtp->to(to@test.ne.jp); #宛先
00413904/10/09 21:04:23ID:LGUhwPv/
ご存知の方、お願いします。
0042nobodyさん04/10/09 21:13:32ID:???
>>39
$smtp->datasend("To: ・・・\n); はどうした?
宛先がないだろうが
0043nobodyさん04/10/09 21:21:16ID:???
>>39
> $smtp->mail(from@test.ne.jp); #送信元
$smtp->mail('from@example.jp'); # MAIL FROM

> $smtp->to(to@test@ne.jp); #宛先
$smtp->to('to@example.jp'); # RCPT TO

> $smtp->datasend("Subject:メール\n"); #件名
> $smtp->datasend("メール本文");
$smtp->datasend("To: 39 <to\@example.jp>\n"); # To: ヘッダ
$smtp->datasend("Subject: メール\n");
$smtp->datasend("\n");
$smtp->datasend("メール本文");
0044nobodyさん04/10/09 21:24:19ID:???
>>39
君はRFC2822を勉強したまえ。このままでは腐ったメッセージ垂れ流しそうな悪寒。
0045nobodyさん04/10/09 21:46:43ID:LGUhwPv/
>>42
返信ありがとうございます。

$smtp->mail(to@test.ne.jp);  のすぐ下に
$smtp->datasend("To: to@test.ne.jp\n"); を
追加してみたけど駄目でした。
どこがまずいのでしょうか?
0046nobodyさん04/10/09 21:48:33ID:LGUhwPv/
>>43
ありがとうございます。
やってみます。
0047nobodyさん04/10/10 00:20:52ID:mkQG3wAc
ある関数内からスコープ外にある無名ハッシュの値を
操作したいのですがうまくいきません

my $p = { data => 1 };

&abc($p);
print "$p->{data}\n";

sub abc {
my $p = shift;
$p->{data} = 2;
}

↑のようにやってみたのですがなぜかダメでした
再帰処理がしたいので関数内から直接変数の値をいじることはできません
0048nobodyさん04/10/10 00:32:57ID:???
>>47
そのコードは問題なく動くので別の所がおかしいのだろう。
use strict; や -w オプション、デバッガで地道に調べてくれ。
0049nobodyさん04/10/10 00:48:31ID:???
blessしたあとにインスタンス変数に代入してもいいんですか?
0050nobodyさん04/10/10 02:42:47ID:???
オブジェクト指向な考えだと掲示板でいう
書き込みとか削除とかをifで分けていく部分はどういう風にしたらいいんですか?
0051nobodyさん04/10/10 03:08:11ID:???
わけわかめ
0052nobodyさん04/10/10 03:10:22ID:???
if ($mode eq 'write') {
    &write;
} elsif ($mode eq 'delete') {
    &delete;
}

こんな感じのt所です。
0053nobodyさん04/10/10 03:11:28ID:???
>>50
http://module.jp/dist/web+db-press6-perl-oo.pdf
0054nobodyさん04/10/10 03:14:22ID:???
>>53
デザインパターンなんて言葉を知らなかった
さんくすべるーまっち
0055nobodyさん04/10/10 03:18:58ID:vb66WTKp
$AoA[$i] = [@array] という配列のリファレンスを配列に入れる処理が
@{$AoA[$i]} = @array で代用できるという事がよく分かりません。

@{$AoA[$i]} = @array と言うのはどういうことですか?
@($AoA[$i]) = @array との違いを教えてください。
0056(1/2)04/10/10 04:56:32ID:???
>>55
普通の配列変数を書く時の @array って書き方。コレ、本当は @{array} の
{ } を省略したものなんだよ。@{ と } で挟まれたホニャララを配列として扱い
ますよ、って意味で、ホニャララが 裸のワード だったら普通の配列変数と
して扱われるんだ。

@{array} = (0,2,4,8); # array という名前の配列変数

ホニャララはリファレンスでも構わなくて、配列に対してできる操作は
同じようにできちゃう。配列の要素を見る時は ${ ホニャララ }[ 添え字 ]
って構文になるよ。

$a_ref = [1,3,5,7]; # 名無しのリストリファレンス

print @{array};  push @{array}, 10; ${array}[0] = 12;
print @{$a_ref}; push @{$a_ref}, 9; ${$a_ref}[0] = 11;

そして当然、代入も。

@{array} = (0,2,4,8);
@{$a_ref} = (1,3,5,7);

文法的に間違えようのない場所なら、この { } は省略できるんだ。

print @array;
print @$a_ref;
0057(2/2)04/10/10 05:01:32ID:???
続き。

Perl の変数は予め宣言しなくても使えるよね。この振る舞いと同じように、
未定義な「場所」をムリヤリ配列として使おうとすると、本当にそういう事に
しちゃうんだ。その「場所」がスカラー値しか収められない「場所」なら、
それ自体はスカラー値であるリストリファレンスが収まるってわけさ。

@{AoA} = (); # 空っぽの配列

# スカラー値を収められる入れ物に、リストリファレンスを作って入れる
${AoA}[0] = [0,2,4,8];

# ${AoA}[1] は配列だと勝手に決めて、代入しちゃう!
@{${AoA}[1]} = (1,3,5,7);

気をつけなきゃいけないのは、未定義でもリファレンスでもない「場所」を
ムリヤリ配列として使おうとした時。perl はこういう時、下の例なら $foo の
値、つまり hoge って名前の配列変数を勝手に使っちゃうんだ。

$foo = 'hoge'; # ただの文字列
@hoge = (2,4,6,8);
@{$foo} = (0,1,2,3);
print @hoge; # 0123

この危険な機能の名前はシンボリックリファレンス。 use strict 'refs'; と
唱えておく事で禁止できるよ。
0058nobodyさん04/10/10 14:32:49ID:bziwCOA4
メールアドレスの@から右のドメインを取得するには
どのような関数がありますでしょうか?

例えば、test@aaa.ne.jpの aaa.ne.jpだけを取得したいんです。
ご存知の方お願いします。
0059nobodyさん04/10/10 14:58:33ID:???
>>58
index
0060nobodyさん04/10/10 15:21:22ID:bziwCOA4
>>59
indexは検索文字が対象文字列に存在するかのだと思いましたが
どのようにすればよいんでしょうか?
0061nobodyさん04/10/10 16:18:08ID:???
>>60
my $addr_spec = 'test@example.com';

# http://tohoho.wakusei.ne.jp/wwwperl2.htm#index
# http://tohoho.wakusei.ne.jp/wwwperl2.htm#substr
my $domain = substr $addr_spec, index($addr_spec, '@') + 1;

# http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlre.html
($domain) = $addr_spec =~ /([^@]+)\z/;
00625504/10/10 19:15:24ID:vb66WTKp
>56 >57
ありがとうございました。

つまり

$a_ref = [0,2,4,6];

などと記述があった後に

@{$a_ref} = (1,3,5,7); 

と書かれていたら

$a_ref = [1,3,5,7]; と読替えて良いと言うことでしょうか?
00633904/10/10 20:18:00ID:bziwCOA4
>>61
できました。
ありがとうございました。
0064大文字小文字混在をアルファベット順にソートしたい04/10/10 21:23:27ID:0NABqG2B
ID(大文字小文字混在の半角英数)と得点を格納したハッシュ%dataがあります。
これを得点の高い順に並べ、さらに同じ得点同士ではアルファベット順に並べて
IDを取り出したいと思います。そこで以下のようにしました。

%data= ('aaa' => 90, 'bbb' => 80, 'CCC' => 80, 'DDD' => 70,);
@id_array = sort { $data{$b} <=> $data{$a} or $a cmp $b} keys %data;

しかし、これでは同じ得点の人が
大文字のアルファベット順→小文字のアルファベット順になってしまいました。
(上の例ではaaa, CCC, bbb, DDD,の順になる)

アルファベットの順(aaa, bbb, CCC, DDDの順)に並べ替える方法はありますか?
0065nobodyさん04/10/10 21:35:49ID:???
>>64
自分で sort の中に何が書けるかわかってないんじゃない?

まぁいいや。
sort { $data{$b} <=> $data{$a} or lc($a) cmp lc($b) }
とか、大文字と小文字を無くすようなことをしてやれば、全て正解でしょうに。
00666404/10/10 22:02:50ID:0NABqG2B
>>65
できました。

文字コード自体が大文字アルファベット→小文字アルファベットの順に
なってるので、仕様だと思ってあきらめていました。

ありがとうございます。・゚・(ノД`)・゚・。
0067nobodyさん04/10/11 00:30:18ID:???
>>62
いや、だいぶ違う。

@$a_ref = (...)は新しいリファレンスを作らないし、tieやblessなどの影響はそのまま。
$a_ref = []は新しいリファレンスを作る。

特に後者にする必要がなければ、前者の方法を使った方がいい。
00686204/10/11 01:38:46ID:21NinhME
>>67
わかりました。あの後、ラクダ読んでなんとなく
感覚が掴めました。ありがとうございました。
0069nobodyさん04/10/11 17:04:09ID:???
みんなクッキーに日本語入れる時、16進数に直してますか?
漏れは直さないでそのまま使えてるんだけどなんで一般的に直す必要があるのでしょうか?
0070nobodyさん04/10/11 17:30:37ID:???
>>69
スレ違い。
http://pc5.2ch.net/test/read.cgi/php/1095633323/
http://www.studyinghttp.net/cgi-bin/rfc.cgi?2616
0071nobodyさん04/10/12 00:56:44ID:J8ZBB7PX
perlに限らず一般的なプログラミングの話になっちゃうかもしれないけど・・・
掲示板のCGIを作ってる最中なんだけど、
(1)全ての書き込みを一つのログファイルにする
(2)書き込み毎にログファイルをつくる
ログが1000件あると仮定して10件を表示する場合、どちらの方がリソース食うだろう?
(1)の場合、処理手順は少ないが余計なデータを大量に読み込む。
(2)の場合、opendir、readdirでファイル名を読み込み、かつ各々のファイルを読み込むので、
処理は繁雑になるが余計なデータをメモリ上に展開しない。
はやりシステムとのやり取りが多くなる(2)の方がコスト高いのだろうか?
0072nobodyさん04/10/12 00:59:02ID:???
>>71
スレ違い。
http://pc5.2ch.net/test/read.cgi/php/1034645635/
0073nobodyさん 04/10/12 01:04:57ID:???
ルーチンにもよるが・・・

儂のケースでは、データーが300件ぐらいで使ってたフリー鯖でゴルァされたのでsql導入した。
0074nobodyさん04/10/12 01:05:44ID:???
>>71
俺は(1)を選ぶ。システムコールが少ない方が好きなので。
しかしログがでかくなると厄介なのも確か。
0075nobodyさん 04/10/12 01:29:03ID:???
あと、データーが固定長なら1ファイルにして
seekで位置決めしてread,writeってのもあり。
0076nobodyさん04/10/12 01:35:04ID:???
>>73-75
レスありがとうございます。とりあえず、一般的(と思われる)(1)の方法でやってみます。
データは可変長ですが、固定長にしてoffsetで狙い撃ちもアリですね。ちょっと工夫してみます。
>>73
すいません。そのスレ知りませんでした。
0077nobodyさん04/10/12 01:52:29ID:???
低額でsql使えるところを探すのが、後々のこと考えても楽になると思うな。
0078nobodyさん04/10/12 10:44:09ID:???
質問です、
open IN,$dat.dat
@var[50..60]=<IN>
これは$dat.datを全部読んでいるんですか?それとも60行目で処理が終了しますか?
0079nobodyさん04/10/12 11:21:32ID:???
キミは@varの中身を覗いた上でその発言をしているのかね?
0080nobodyさん04/10/12 11:27:40ID:???
>>78
読むことは読むけど、速いことは速いんじゃない?
今のCPUで読み込みファイルの大きさで遅いってことは、普通の取り扱う範囲の
テキストファイル(1M以下程度)だとあり得ない希ガス。

Perlが一番遅いのって、「値のコピー」周辺だと思うんだけどネェ。
(特にリスト系)

まぁ、ファイルの大小と、スライス有・無でベンチとってみれヴぁ?
0081nobodyさん04/10/12 11:47:38ID:???
>Perlが一番遅いのって、「値のコピー」周辺だと思うんだけどネェ。
前スレにファイルの扱いの方が遅いと書いてあった希ガス
よほどたいそうなモン作らない限りは誤差の範囲だろ
0082nobodyさん04/10/12 11:59:34ID:???
http://2ch2.net/imenu/
これの作り方教えて下さい
0083nobodyさん04/10/12 12:11:37ID:???
CGIでやるんなら、パラメータで作るのが手っ取り早いっしょ
0084nobodyさん04/10/12 15:01:19ID:???
use benchmarkで計測した結果があるのですが、
出力結果の見方がわかりません。
テンプレにはベンチマーク関連の資料が見当たらないのですが、
見方などが載っているサイトをご存知の方いませんか?
0085nobodyさん04/10/12 16:54:23ID:???
>>84
>>3
http://perldoc.com/perl5.8.4/lib/Benchmark.html
http://pc5.2ch.net/test/read.cgi/php/997829243/

出力のどの部分が分からんのか具体的に示した方がいいよ。
0086nobodyさん04/10/13 12:37:35ID:SrofvYG0
Q:0〜6の数字をそれぞれ$p1 〜 $p7に代入したい
ただし、$p1 〜 $p7はそれぞれ違う数字になるように代入したい
と思い、こんなコードを考えたのですが
 
00878604/10/13 12:38:00ID:SrofvYG0
$p1 = int(rand 7);
 $p2 = int(rand 7);
 while($p1 == $p2){
 $p2 = int(rand 7);
 }
 $p3 = int(rand 7);
 while($p1 == $p3 or $p2 == $p3){
 $p3 = int(rand 7);
 }
 $p4 = int(rand 7);
 while($p1 == $p4 or $p2 == $p4 or $p3 == $p4){
 $p4 = int(rand 7);
 }
 $p5 = int(rand 7);
 while($p1 == $p5 or $p2 == $p5 or $p3 == $p5 or $p4 == $p5){
 $p5 = int(rand 7);
 }
 $p6 = int(rand 7);
 while($p1 == $p6 or $p2 == $p6 or $p3 == $p6 or $p4 == $p6 or $p5 == $p6){
 $p6 = int(rand 7);
 }
 $p7 = int(rand 7);
 while($p1 == $p7 or $p2 == $p7 or $p3 == $p7 or $p4 == $p7 or $p5 == $p7 or $p6 == $p7){
 $p7 = int(rand 7);
 }
00888604/10/13 12:38:40ID:SrofvYG0
見れば見るほど頭悪そうな感じがします。。。7くらいならいいけど
p1〜p100までに1〜100までの数字をそれぞれ違う数字が入るようにするなんてするとひどいコードになる事に・・・
うまくループ構文使えばもっと簡単なコードになる気がするのですが
私では作れませんでした・・・どなたかご存知でしたら教えていただけますでしょうか。
(ちなみになぜこんな事をやりだしたかというと、特定個数の全てのアイコンを毎回順序をランダムで表示したいと考えたからです)

連続カキコすいません。(改行エラーでたので)
0089nobodyさん04/10/13 12:41:40ID:???
質問です。BBSのログを読み出す際に、URLがある場合にはリンクを貼ろうと思っています。
例えば、普通にリンクを貼るだけならできるのですが、
自サイトへはinner、他サイトへはouterというスタイルを適用したいと思っています。

ログの例:(MyIDを含むのが自サイトとします)
http://localhost/MyID/<;BR>http://www.2ch.net/

出したい出力結果(HTML上):
<A href="http://localhost/MyID/"class="inner">http://localhost/MyID/<;/A><BR><A href="http://www.2ch.net/" class="outer">http://www.2ch.net/<;/A>

sub link { # 引数に渡すのはログ全体
 $_[0] =~ s/([^=^\"]|^)((http|ftp|https)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+MyID[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+)/$1<A href="$2" class="inner">$2<\/A>/g;
 $_[0] =~ s/([^=^\"]|^)((http|ftp|https)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+)/$1<A href="$2" class="outer">$2<\/A>/g;
}

こう記述すると、前者も後者も全てouterになってしまいます。

if ($_[0] =~ /MyID/) {
 $_[0] =~ s/([^=^\"]|^)((http|ftp|https)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+MyID[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+)/$1<A href="$2" class="inner">$2<\/A>/g;
} else {
 $_[0] =~ s/([^=^\"]|^)((http|ftp|https)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+)/$1<A href="$2" class="outer">$2<\/A>/g;
}

こうすると、今度は自サイトへのリンクは貼られるのですが、他サイトへのリンクは貼られなくなってしまいます。
上記の出したい出力結果を出すには、どのように記述したらよいのでしょうか。
0090nobodyさん04/10/13 13:24:29ID:???
>>86
数値を配列に入れてから
その配列をランダマイズすれば?
00918604/10/13 13:33:52ID:SrofvYG0
>>90
配列ってランダマイズできるんですか・・・。
知りませんでした汗
ありがとうございました。探してやってみます。
0092nobodyさん04/10/13 13:44:56ID:???
>>86

@array=();
for ($count = 0; $count < 7; $count++) {
push(@array,$count);
}
&shuffle( \@array );

sub shuffle {
my $array = shift;
my $i;
for ($i = @$array; --$i; ) {
my $j = int rand ($i+1);
next if $i == $j;
@$array[$i,$j] = @$array[$j,$i];
}
}

&shuffleを呼び出す前と、呼び出した後で@arrayの中身を見てみよう。
0093nobodyさん04/10/13 13:55:48ID:???
>>89
\大杉
0094nobodyさん 04/10/13 15:22:33ID:???
>>86
@outにランダムな数値を出力。

@in = (1 ..100);
@out = ();
srand;
foreach (@in) {
  my $r = int rand (@in + 1);
  push(@out, $in[$r]);
  $out[$r] = $_;
}
0095nobodyさん04/10/13 15:30:25ID:???
>>94
それ、値が入らない場合もあるし、
同じ値が入りまくってるじゃん。
>>86の要件を満たしてないぞ。
0096nobodyさん04/10/13 15:48:10ID:???
>>86

srand(time());
%hash = map {$_ => rand()} 0 .. 6;
@array = map $_, sort {$hash{$a} <=> $hash{$b}} keys(%hash);
print "@array\n";
0097nobodyさん04/10/13 16:04:53ID:???
いろいろ書いてみるのも楽しいのだが、オレは堕落したので
List::Utilのshuffle使うな
0098nobodyさん04/10/13 16:07:16ID:???
俺は5.6だから使えないYO!!
モジュールに頼りっきりになるのもアレだが、でも使えるものは使っていきたいよね。
0099nobodyさん04/10/13 16:11:23ID:???
(12 15 17 20 50)のような配列があったとして
↑の配列の中から18に一番近い数字を取り出すみたいなのはどうしたらいいでしょうか?
0100nobodyさん 04/10/13 16:20:30ID:???
>>99
$seed =18;
$tmp = $seed;
@data = (12,15,20,50);
for(@data){
  my $diff = abs($_ - $seed);
  $min = $_ if($diff <= $tmp);
}
print $min;

こんなんでどない?
01019904/10/13 16:24:16ID:???
ミスった。

$seed =18;
$tmp = $seed;
@data = (12,15,20,50);
for(@data){
  my $diff = abs($_ - $seed);
  if($diff <= $tmp){
    $min = $_;
    $tmp = $diff;
  }
}
print $min;
0102nobodyさん04/10/13 16:27:05ID:???
もし、数値の配列がクソ長いのであれば、
abs($_ - $seed);が0の時はlastで抜けちまった方が良さげ
0103nobodyさん04/10/13 16:32:45ID:???
thx!!!
0104nobodyさん04/10/13 16:37:15ID:???
オレはList::Utilラブなので、

reduce {abs($a-$seed)<abs($b-$seed)?$a:$b} @data
01058604/10/13 18:17:10ID:???
いろんなコードを書いていただいてありがとうございました。
書いていただいた全てのコードが勉強になりました。
一つ一つ検証して試してみたいと思います。
0106nobodyさん04/10/14 00:02:36ID:pD0/ztzC
連想配列の配列数を得るにはどうすればいいのでしょうか?
forなどで一個一個数えていくしかないのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています