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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
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などで一個一個数えていくしかないのでしょうか?
0107nobodyさん04/10/14 00:12:11ID:???
>>106
$a = scalar keys %HASH;
01088904/10/14 00:15:43ID:???
どなたかわかる人いらっしゃらないでしょうか;
それともこういうのは理論上無理なんですかね・・・
0109nobodyさん04/10/14 00:33:02ID:???
@data = ('A,2,黄緑',
         'C,3,青紫',
         'B,4,赤',
         'C,6,青',
         'A,7,緑',
         'A,9,紫',
         'B,10,黄');
こんな感じである配列の先頭にあるa,b,cの数を数えて

連想配列に
%count = (A,3,
             B,1,
             C,2);
こんな感じに持って行くにはどうしたら良いんでしょう?
0110nobodyさん04/10/14 00:46:44ID:???
(りんご、みかん、りんご、ぶどう、みかん、すいか、りんご)
という配列のなかから一番多いものだけを取り出すってのはどうしたらいいですか?
この中だとりんごに当たりますね。
0111nobodyさん04/10/14 00:49:57ID:???
ここは丸投げスレか
0112nobodyさん04/10/14 00:52:58ID:???
>>111
答えられない人はお帰りください^^
0113nobodyさん04/10/14 01:31:30ID:???
>>108
まずurlにマッチングさせてからinnerかouterか判定させれば?
urlの正規表現についてはググればすぐに出てくるので。
あと、エスケープする必要があるものとそうでないもの調べてくれ。
0114nobodyさん04/10/14 02:27:52ID:???
>>110
ここはアルゴリズムを質問するスレではない。
「こういうアルゴリズムを考えたので Perl で実装したいんですが
どうコーディングしたら良いですか?」
という質問形式にして出直してきたまえ。

例えば、いったん各々の個数を全部数え上げるというアルゴリズムで行くなら、
ハッシュをインクリメントしていって、数え終った後でソートする、というのが素直だろうな。
0115nobodyさん04/10/14 05:34:49ID:???
前に114と同じことを書いたら叩かれたのを思い出した
0116nobodyさん04/10/14 06:51:34ID:ETIFZxwk
【目的】
Net::SSH::Perlを使ってサーバに入り、任意のメールアドレスに対してメール
を送信するスクリプトを作る。

【スクリプト】
#!/usr/bin/perl -w
use Net::SSH::Perl;
$host = "www.test.net";
$user = "hogehoge";
$pass = "2ch_test";
$cmd = "mail hoge\@hoge.ne.jp";
$body = "www.test.net is ok\n";
$ssh = Net::SSH::Perl->new($host);
$ssh->login($user, $pass);
$ssh->cmd($cmd);
$ssh->cmd($body);

【説明】
スクリプトを実行したとき、指定したサーバにログインすることはできるので
すが、それ以上処理が進まず、メール送信もされません。ただ、スクリプトを
実行させてキーボードから文字を入力してCtrl-Cで処理を中断するとメールは
配信されます。
[mona@localhosst mona]% ./test.pl<Enter>
これはテストです。<Enter>
Ctrl-C

【教えて欲しいこと】
$bodyの内容を自動的に標準入力に代入し、メールを送信する。
加えて、サーバからの切断も自動的に行ってくれる。
以上の二点を解決したいです。
よろしくお願いします。
0117nobodyさん04/10/14 08:14:10ID:???
@a = "ァー";

for(@a){
@b = split / | /; #全角or半角スペースで切る
}

for(@b){
print;
}

というコードを実行すると何故か

と表示されます。これはどういうことでしょうか?
$aの「ァー」の部分を色々変えてみましたが、
こうなるのは「ァー」と「ぁー」です。
どなたか分る方いたら教えてください。
0118nobodyさん04/10/14 08:36:03ID:eMIY0T+H
http://www.dp.j-phone.com/dp/tool_dl/web/useragent.php
の表はユーザーエージェントの解説なのですが、表の一番下にあるような
「J-PHONE/4.0/J-SH51/SN*********」という文字列で、
SN以降を削除し他の部分だけを残したいんです。その場合の正規表現は
どう書けばいいのでしょうか?
$abc =~ s/(.+)[SN](.+)/$1/; だとダメでした。どなたかお力添えをお願いします。
0119nobodyさん04/10/14 10:24:52ID:???
>>118
$abc =~ s/SN.*//;
0120nobodyさん04/10/14 10:36:01ID:???
>>117
たぶんソースをeucで書いてるだろうから、

use encoding 'euc-jp';

を頭に追加すれば直ると思うが。

unicode機能を有効にしないperlでは日本語の2バイトコードは
1つの文字としては扱えず、1バイトずつバラバラのバイト列と
なってしまう。

"ァー" = "\xa5\xa1\xa1\xbc"
/ | / = /\xa1\xa1| /

なので、ァーの部分は真中の\xa1\xa1の部分を区切りとして
splitされてしまい、\xa5\xbcが出力される。これは「ゼ」。

同様に「ぁー」のときは「ぜ」になってるはず。



0121nobodyさん04/10/14 10:38:58ID:???
>>117
http://www.din.or.jp/~ohzaki/perl.htm#JP_EUC_JP
ここから下を読むことを勧める。
012211804/10/14 10:39:49ID:eMIY0T+H
>>119
レスありがとうございます。
でもそれではうまく行きませんでした。
SN以降が削除されずにそのまま出力されているようです。
012311804/10/14 10:43:11ID:eMIY0T+H
失礼、うまくいきました!
感謝感謝です。ありがとう。
012411704/10/14 12:36:50ID:???
>>120
ありがとうございます!
完璧な説明大変感謝してます。
012511704/10/14 12:42:18ID:???
感謝した先から申し訳ないのですが、
コードはEUCで書いてるのですが
扱ってるデータがS-JISだったりします。
use encoding 'euc-jp';
したら、データが化けてしまいます。
そういう場合
:コードの文字コードと 扱ってるデータの文字コードが違う場合:
どう対処したらよいのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています