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

【Perl】初心者コーナーPart10

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。02/02/24 22:18ID:zOj6Yq/3
いらっしゃーい、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を見よう。
0449nobodyさん02/03/13 00:42ID:???
>>444
$score{$name} に点数が入っていて、100点満点だとします。
while( ($n,$s) = each %score) { $inverse{sprintf("%03d $n",$s)} = undef; }
$rank = 0; $last_score = -1;
foreach(sort {$b-$a} keys %inverse ) {
  /(\d+) (.+)/;
  $rank++ if $1 != $last_score;
  $last_score = $1;
  printf("$rank位,$2,%d点\n",$1);
}
てのはどうでしょう。
045044902/03/13 00:47ID:???
>>449
最初の%inverseへの代入は無駄でした・・・
foreach (sort {$score{$b}-$score{$a}} keys %score) {...}
てすればいいのねー。
045144802/03/13 01:08ID:???
おまえらって、そのていどなんだぁー。
0452448 ◆8hKGWRIE 02/03/13 01:09ID:???
>>451
俺の姿で言いたいことはそれだけかい?
0453nobodyさん02/03/13 01:14ID:???
なんか>>452がかっこいい・・・
0454nobodyさん02/03/13 01:16ID:???
>444
ソートだとこんな感じかな
並べ替えて,前の点数と同じなら同位,違うなら上から数えた順位。
while(<DATA>){
 chomp;
 ($name,$score) = split /,/;
 push @score, {name=>$name,score=>$score};
}
my $allrank = 1;
my($prevscore,$rank);
foreach(sort {$a->{score} <= $b->{score}} @score) {
 $rank = $allrank if ($_->{score}!=$prevscore);
 print "$rank位,$_->{name},$_->{score}点\n";
 $allrank++;$prevscore=$_->{score};
}

__DATA__
ishida,80
inoue,70
gotou,70
satou,65
shibata,90
suzuki,80
0455nobodyさん02/03/13 01:39ID:???
私なら Schwartzian Transform

@score = map { $_->[0] }
sort { $b->[1] <=> $a->[1] or $a->[0] cmp $b->[0] }
map { [$_, (split /,/)[1]] }
<DATA>;

叩き台にでもなれば。

0456nobodyさん02/03/13 01:40ID:???
>>455
それだと順位どうすんのよw
045744802/03/13 01:48ID:???
なに悩んでんだよー。このていどで。
0458わんらいな−02/03/13 02:13ID:???
foreach (
 map {
  do{
   $ninzu++;
   $rank = $ninzu if ($_->[1]!=$prevscore);
   $prevscore=$_->[1];
  };
  [$rank, $_->[0], $_->[1]]
 }
 sort { $b->[1] <=> $a->[1] or $a->[0] cmp $b->[0] }
 map { [split /,/] }
 <DATA>
)
{print "$_->[0]位,$_->[1],$_->[2]\n"}
045945802/03/13 02:15ID:???
chomp忘れた。
0460nobodyさん02/03/13 02:59ID:???
$| = 1;って何をするものなんですか?
0461nobodyさん02/03/13 03:12ID:???
>460
print関数使った直後にデータが出力されるようになる。
指定しないと,ある程度出力データが貯まってから出力される。
http://tohoho.wakusei.ne.jp/wwwperl1.htm#Tokushu
0462nobodyさん02/03/13 03:15ID:???
バッファリングの防止
046344402/03/13 03:43ID:MYvm6b7t
みなさん、本当にありがとうございます。

>446-448さん
簡潔すぎて・・意図する所がわからず
悩みに悩んだ結果がこれですけど、これでいいですか??
参照はかなり苦手です。。しかも無名配列。。
でも、おかげさまでかなり勉強になりました。
結果はばっちりでした。

@data = <DATA> ;
@tmp = map {(split /,/)[1]} @data;
@data = @data[sort {$tmp[$b] <=> $tmp[$a]} 0 .. $#tmp];
foreach ( @data ) {
chomp ;
($name,$score) = split /,/ ;
push @r , [ $name , $score ] ;
}
$score = 101;
for($i = $j = 0; $i <= $#r; $i++){
if($r[$i]->[1] < $score){
$j = $i ;
$score = $r[$i]->[1];
}
$r[$i]->[2] = $j + 1 ;
}
for ( $i = 0 ; $i <= $#r ; $i++ ) {
print "$r[$i]->[2]位,$r[$i]->[0],$r[$i]->[1]点\n" ;
}
__DATA__
ishida,80
inoue,70
gotou,70
satou,65
shibata,90
suzuki,80
tanaka,80
046444402/03/13 03:43ID:MYvm6b7t
>449-450さん
結果が・・・
1位,shibata,90点
2位,tanaka,80点
2位,ishida,80点
2位,suzuki,80点
3位,gotou,70点
3位,inoue,70点
4位,satou,65点
みたいになります。。
やはりループの回数数えないといけないんですね。
それと「100点満点だとして」というのが
どこに影響してるのかよくわからないんです。。

>454さん
一番素直に理解できました。
ソートのとこの式がちょっとおかしかったですけど。
(sort {$b->{score} <=> $a->{score}} @score)
ですよね。

ともかく、皆さん本当にありがとうございました。
全部理解してテストするのに2時間程かかりました。
もっと勉強せねば。。
0465nobodyさん02/03/13 03:44ID:XatxhEQY
ディレクトリ以下の全htmlファイルからリンクを探し出し、置換し,その
結果だけ表示したいんですけど、途中まで書いたんですけど、わからなくて…

$dir = '.';
opendir(DIR, $dir) or die;
@file = sort grep { /\d+\.html/i && -f "$dir/$_"} readdir(DIR);
closedir(DIR);

foreach(@file){
if( $_ =~ /<a href="http:\/\//i ){

s/co\.jp/ne\.jp/g;
print;
}
}
0466nobodyさん02/03/13 04:27ID:???
>>455 >>458 みたいなのは、Perl臭さが漂いすぎて、大好き。
いや、単なる個人的意見ですが。

>>465
HTML::LinkExtor使うと簡単ですよ。
0467nobodyさん02/03/13 04:32ID:???
>>465
引数で指定されたディレクトリに移動して.をopendir
readdirを見ていき$_が
・ディレクトリなら再帰(引数は今見てる$_)
・HTMLファイルなら開いて痴漢してプリント
全部見終わったら..に移動

な関数を作る。でいいのでは?
465は自力でできそうな気がするのでわざとコードは書かない(w
0468nobodyさん02/03/13 04:55ID:???
>>465
foreach (@file) {
open FH, $_ or die $!;
while (<FH>) {
if (m{<a\s+href="(http://[^"]+\.co\.jp[^"]*)"}i) {
$1 =~ s/\.co\.jp/.ne.jp/g;
print "$1\n";
}
}
close FH;
}

--------------------
use IO::Dir;
use HTML::LinkExtor;

foreach (grep { /\.html$/i } IO::Dir->new(q/./)->read) {
my $parser = HTML::LinkExtor->new;
$parser->parse_file($_);
foreach my $elem ($parser->links) {
$elem->[0] eq q<a> or next;
while (@$elem) {
my ($attr, $value) = splice @$elem, 0, 2;
next unless $attr eq "href"
and $value =~ m{http://.+\.co\.jp/?}i;
$value =~ s/\.co\.jp/.ne.jp/g;
print $value, "\n";
}
}
}

双方とも動作確認無しですが。
0469nobodyさん02/03/13 04:57ID:???
>>467
書いちゃったよ…スマソ
047047002/03/13 08:13ID:DQ1JFad8
CSV形式の名簿を住所で都道府県別に表示したいんですが、
以下のようにソートすると当然、文字コード順で愛知(アイチ)、
愛媛(アイヒメ)……という順番になります。([18]が住所です)

-----------------------------------------------------------
# 都道府県別にソート
if($sort == 3){
@LINES = sort { (split(/\,/,$a))[18] cmp (split(/\,/,$b))[18] } @LINES;
}
-----------------------------------------------------------

これを都道府県コード順にソートするにはどうしたらよろしい
でしょうか?
http://www2.odn.ne.jp/sasabomb/tables/jisx0401.html

もちろんCSVに都道府県コードは含まれていません。どなたか
ご教示よろしくおながいします。
0471nobodyさん02/03/13 08:27ID:???
>>470
47都道府県名をあなたが望む順番でリストに格納。
そのリストに従ってデータをソートするルーチンを書く。

愛媛も愛知も同じ愛である以上、一緒に並ぶのは当然。
0472ほい02/03/13 09:55ID:68BwgqOI
# 都道府県別にソート
if($sort == 3){
$i = 0;
undef(%pref);
foreach $pref_name ('北海道','青森県','岩手県','宮城県','秋田県','山形県','福島県',
'茨城県','栃木県','群馬県','埼玉県','千葉県','東京都','神奈川県','新潟県','富山県',
'石川県','福井県','山梨県','長野県','岐阜県','静岡県','愛知県','三重県','滋賀県',
'京都府','大阪府','兵庫県','奈良県','和歌山県','鳥取県','島根県','岡山県','広島県'
,'山口県','徳島県','香川県','愛媛県','高知県','福岡県','佐賀県','長崎県','熊本県'
,'大分県','宮崎県','鹿児島県','沖縄県') {
$pref{$pref_name} = $i++;
}
@LINES = map {$_->[0]}
sort {$pref{$a->[18]} <=> $pref{$b->[18]}}
map {[$_, split /,/]} @LINES;
}
0473nobodyさん02/03/13 10:29ID:auK7WJtB
こんにちは、フォームのデータってブラウザでリロードされた時にクリアされずに
残ってますよね。
掲示板作ってるんですが書きこみ後リロードすると二重投稿になっちゃうんですよ。
どうやって回避するんでしょうか?
0474nobodyさん02/03/13 10:36ID:???
>473
1:投稿内容を直前のものと比較して、一致したら書き込み拒否する。
2:書き込み後Locationで別のページ(そのBBSでも問題なし)に飛ばす。
047547302/03/13 10:46ID:auK7WJtB
>474
ありがとうございます。
1:は考えたんですがプログラム的にカッコよくないかと思ったので・・・
2:でやってみます。
助かりました。
0476nobodyさん02/03/13 10:50ID:???
>475
ただし、2の場合、投稿ボタン2度押しには対応できないという事を忘れずに。
1ならそれも防いでくれるけどね。
047747302/03/13 11:06ID:???
>476
ええ!?そうなんですか?じゃあやっぱり1でやりますね。
どうせソースなんか僕しかみませんしね。
あ、でも、連続して削除する時のチェックボックスなんかは
間違いでなく一致しちゃうこともありますよね。
そこらへんの実践的なテクニックって皆さんどうやって習得されてるんでしょうか?
Perlは独学の方も多いと思いますが・・・
(ちなみに僕は元COBOLプログラマです)
0478nobodyさん02/03/13 13:28ID:???
初心者です。
レンタル掲示板を自分でやろうとすると、
どうすればいいのでしょうか?
プログラムは1個で、設定ファイルを顧客分つくるのでしょうか?
また、自分が借りているティーカップでは、
アドレスの拡張子がhtml になっています。
これ、なんでhtml なんでしょうか?
レンタルの仕組みと関係あるんでしょうか?
0479nobodyさん02/03/13 13:38ID:???
>478
もっと基本的なところから勉強しないと問題外。
具体的にはHTMLタグとかから。
0480nobodyさん02/03/13 13:43ID:???
レンタルしているところでも
中には >>478 みたいなのがいるのかもしれないのか。。。

あな、おそろしや。。。
0481nobodyさん02/03/13 15:11ID:???
>>478
スクリプト買ってきた方がいいと思うよ。
そのレベルから、安定して動かせるスクリプト作れるまで結構かかると思う。
0482nobodyさん02/03/13 15:16ID:nYyCnnqM
質問です。Perlです。

http://www.hoge.com/cgi-bin/foo.cgi
というCGIに対して、
http://www.hoge.com/cgi-bin/foo.cgi?http://www.bar.com/aaa/bbb.txt
という風にURLを渡して、
bbb.txtの内容を読みこんであれこれ処理したいんですが、
bbb.txtの内容を読みこむにはどうやればいいんですか?
何かモジュールを使うんでしょうか。
0483nobodyさん02/03/13 15:18ID:???
>482
>>426
048448202/03/13 15:22ID:???
>>483
うわ、直前に既出でしたか…。ドウモスミマセン…。(;´Д`)
048548202/03/13 15:33ID:???
>>483
LWPってどうやって使うんですか?
0486nobodyさん02/03/13 15:38ID:???
>485
検索サイトって知ってる?
048746002/03/13 16:14ID:???
>461 >462
ありがとう。
「バッファリングの防止」というものは知っていたんですが具体的に何をするものかがさっぱりでして・・・。なるほど。

例えは悪いですが,普段はコンパイラが(print構文を)食べて,ある程度たまってからウンコ(出力)するんですね。
しかし$_ = 1;を指定しておくと食べながらウンコするわけか。
そうかそうか。
0488nobodyさん02/03/13 16:52ID:???
例えに>>487の人柄が表れているな。嗚呼嫌だ嫌だ…。
0489レンタル掲示板02/03/13 16:57ID:???
掲示板はあるとして、
それをレンタルする仕組みが知りたいんですが・・・

なんで、htmlかも知りたい。
0490nobodyさん02/03/13 17:03ID:???
>489
まずはcgiのソースを読んで意味が理解できるようになれ。
そうすれば両方の答えが自然に出てくる。
perlの書き方も知らない人間には教えられないって。
数字を知らない人間に算数を教える事は出来ないだろう?
>>1-10くらいにはいいリンクも揃ってるんだしがんばって勉強してくれ。
0491レンタル掲示板02/03/13 17:10ID:???
で、なんでhtmlなの。
0492nobodyさん02/03/13 17:17ID:???
>491
HTMLソース見ろ。
0493レンタル掲示板02/03/13 17:29ID:???
ティーカップの掲示板は、
4桁の数字がIDになっています。
ということは、
そのID専用のスクリプトを
ひとり1個ずつ
サーバーに置いているということでしょうか?
0494nobodyさん02/03/13 18:48ID:???
春ですねぇ
0495nobodyさん02/03/13 18:48ID:???
そろそろいいだろ?

>>493
スレ違い。他でやってください。
0496レンタル掲示板02/03/13 19:55ID:???
レンタルのつくり方とか
書いてあるページとかあるのかな?
0497レンタル掲示板02/03/13 20:01ID:???
Perl でできるものなのかな?
0498449..45002/03/13 20:42ID:???
>>464
あ、ごめん。たしかにそうなりますね(^^;;
あと100点満点どうこうは、>>449のsprintfで%03d(3桁)
にしてるためだったのですが、>>450で訂正したようにすると、
その制限は無くなりますです。
0499春chu駆除係02/03/13 20:51ID:???
>>491
Hyper Text Markup Language だから、ふつー拡張子は .html だろ。
あんたは普段 .html じゃない拡張子でhtmlファイルを保存してんのか!?
0500nobodyさん02/03/13 20:58ID:???
>>496-497
Perlを勉強すればで、結構簡単にできますよ。
ちなみに「レンタル掲示板の作り方」は他スレでよろしく。
0501nobodyさん02/03/13 21:00ID:???
>>499
MS-DOSは8.3形式。
あらゆるOSとの互換性を考慮するなら拡張子をhtmとしても何ら問題ではない。

それか、あんた世の中にはWindowsしか動いてないとか?w
だから平気でファイル名に%20(スペース)入れるバカが出てくるんだな。
050246002/03/13 21:05ID:???
>499
おれもマジレスしようかと思ってたがやめといてよかった。
ヒマな厨房が無理やり揚げ足とりのワナを張ってる気がしたんだよ。
0503真%20駆除係02/03/13 21:39ID:???
>>502
なる。

>>501
すまん、その通りだ。
世の中にはWindowsしか動いて無いと思っていたよ・・・
050446002/03/13 21:46ID:???
他スレにも「Main」と「main」でわめいて常連追い出した厨房いたね。
ただでさえ人の少ないWebProg板なのにJAPUや_GUNZIPなんかも揚げ足取られてどんどん出ていった・・・。
0505nobodyさん02/03/13 21:46ID:???
>>503
いやいや、そんな謙虚にならずに。こちらも結構賭でしたから、あの煽り。
0506あゆ02/03/13 21:47ID:???
>>504
あゆスレのことじゃないよね?
050750302/03/13 21:53ID:???
>>501
あ、ごめん。間違って名前に%20(スペース)入れちまった・・・
今出先なので、ssh経由でw3mで書き込んでるので許してくれ。
0508nobodyさん02/03/13 21:55ID:???
>>507
徹底抗戦の構え・・・か。
050947002/03/13 21:56ID:???
>>471
すいません、難しくて理解できないんです。申し訳
ありませんが、もう少し易しくご教示いただければ
幸いです。よろしくお願いします。

>>472
ありがとうございます。その通りやってみましたが、
ソートされずにそのまま出力されてしまいました。
0510nobodyさん02/03/13 21:56ID:???
揚げ足取りをしていいのならこの文章を張っておこう

> HTML文書の拡張子は通常 .html なのですが、Windows 3.1など古いシステムでは拡張子に3文字までしか使用できなかったため、
> Windows系では未だに .html の代わりに .htm と記述するケースが多いようです。
> HTML文書の擴張子は不定です。仕樣書のどこにも「HTML文書の擴張子は*.htm/*.htmlでなければならない」等とは書かれてゐません。例へば、cgiの吐出すHTML文書に擴張子は附いてゐません。それでもcgiの吐く文書は立派なHTML文書です。
> サーヴァからhttp應答ヘッダにContent-type:text/htmlを附けられて送信された文書は皆HTML文書です。
> 擴張子が*.htmlの文書を「HTML文書」と看做すのは、
> 擴張子で文書の種類を判斷するWindows(や、Windowsの使用に合はせて擴張子でも文書の種類を判斷するMac)だけです。
051146002/03/13 22:02ID:???
>507
ぷっ,その書き込みでおれが一番救われた(笑
0512nobodyさん02/03/13 22:03ID:???
どこぞでMainを指摘した厨房だが
>>504
Mainが誤りだと指摘されたのがそんなに悔しかったのか?
大文字小文字を識別する言語なら当然だろうが。
それとも、まさか指摘するべきじゃなかったと言いたいのか?

0513nobodyさん02/03/13 22:04ID:???
知 識 だ け で 大 人 げ な い 厨 房 の 宴 の 開 催 だ !
051446002/03/13 22:09ID:???
昔からこの板には空気が読めない厨房が存在するって書いただけ。
Mainとmainが黒と白以上に違うもんなのは十分承知。

ちなみに勘違いしてるようだが,おれは最近そのスレ見つけたんだよ。
書き込みすらしたことない。
0515nobodyさん02/03/13 22:14ID:???
>>513
厨房はそもそも大人じゃないやん(ビシッ)
0516レンタル掲示板02/03/13 22:33ID:???
で、結局のところ、
どういう仕組みなの?
細かいところはどーでもいいので、大きな部分が知りたい。
0517nobodyさん02/03/13 22:37ID:???
KENTのMBSProのお試し版の中身でも見りゃいいだろ
もう出てくんなよ
0518レンタル掲示板02/03/13 22:42ID:???
>>517
ありがとう。
最初から素直に教えろよな。ヴォケ。
0519春chu駆除係02/03/13 22:47ID:???
>>518
すまん。
052046002/03/13 22:50ID:???
>518
ごめんよ。
0521nobodyさん02/03/13 23:14ID:???
ヽ(´ー`)ノ
0522nobodyさん02/03/13 23:19ID:???
サブルーチンについて教えて下さい。
通常、私は
&hoge;のような形でサブルーチンを使っているのですが、
&hoge("section1","section2");
のような引数をかっこに入れた使い方を見たことがあります。
取り立ててその使い方がわからなくても使えてはいるのですが、
もしよろしければ、これの意味を教えて下さいませ。
0523nobodyさん02/03/13 23:24ID:???
>>522
引数て・・・ちゃんとお手持ちの参考書は読みましたか?
0524nobodyさん02/03/13 23:33ID:???
>>523
読んでいません。
普通、なにかの処理のなかで
&sub_routin 呼び出せば、そこまでのグローバル変数と$_がそのまま使えますので、
それ以上の使い方をしたことがないのです。
ですから、よく、というか、全く理解していないのが現状です。
人の作ったCGIを、自分の好みのデザインに変えるくらいの作業しかわからないのですが
このあたり、どういう意味なのか理解したいなとは思っています。
お願いします。
0525nobodyさん02/03/13 23:35ID:???
>>524
一度Perlの入門書を購入して読まれた方がいいです。
0526春chu予防係02/03/14 00:47ID:???
>>524
&sub_routine('hoge','pau');
で呼び出すと、
sub sub_routine {
($a,$b) = @_;
...
}
とすることで、$a,$bに引数を受け取れます。
グローバル変数で受け渡しすると、どの変数をどこで書き換えたか
管理するのがめんどうになってくるので、引数で渡したほうが
べんりですよ。あとからそのサブルーチンを使いまわすときも
効果大です。

perlは、他人のソースから学ぶのが非常に困難なトリッキーな
言語だと思いますので、入門書等の平易なソースを見ながら
勉強したほうが楽だと思います。

ちなみに私は、一度書いた自分のソースでさえ、あとから見ると
なにをやってるのか、その記述にどんな必然性があるのか、
わからなくなることがしょっちゅうです。
052752602/03/14 00:51ID:???
>>524
すまぬ。
($a,$b) = @_;
↓
local($a,$b) = @_;
に訂正です。

余計な疑問が沸かないように省略したら、逆にグローバル変数と
変わらなくなってしまった・・・アフォだオレ
0528nobodyさん02/03/14 00:53ID:???
$answer = &plus(5,10); # 5と10をサブルーチンplusに渡して、結果を$answerに返す
print $answer; # 15

sub plus {
my ($x,$y) = @_; # @_は&plus(ここ)にあったものを渡す 今回は@_ = [5,10]
my $xy = $x + $y;
return $xy; # 返す
}

本読まないで言語習おうなんて甘いと思うけどね
0529nobodyさん02/03/14 01:17ID:???
$answer = &plus(5,10);
print $answer;

sub plus {
return $_[0] + $_[1];
}

俺ならこうしちゃうけど、一度変数に格納した方がいいのかね?
0530 02/03/14 01:23ID:???
Perl5の時代に、何故にlocal?
0531nobodyさん02/03/14 01:39ID:???
KENT信者だから。
0532nobodyさん02/03/14 01:57ID:???
@_ = [5,10] ってなんだよ(恥

>>529
あとから見るときの為に分かりやすい名前つけておいた方がいいとか読んだから
俺は変数に入れてるけど、使う人の好みだよね。
053352602/03/14 02:07ID:???
>>530
すまぬ。いつものくせで
local($a,$_) = @_;
とか書くもので。

みんな、関数の中で $_ つかうときどうしてるのー?
0534nobodyさん02/03/14 02:08ID:???
>>533
sub hoge
{
local $_;
...
}

先頭付近でlocal宣言してます。
0535nobodyさん02/03/14 02:09ID:???
>>524
つまり皆はグローバル変数だらけにしないって事だね。
0536nobodyさん02/03/14 02:13ID:???
>533
漏れの場合、

&hoge($_);

sub hoge{
 $temp = $_[0];
}

とかにしちまう。
0537nobodyさん02/03/14 02:17ID:???
>>488
アヤシイ性格判断してる暇があったら、$| を $_ と書いちゃってることを
一言指摘してやりゃーいいのにさ。
0538nobodyさん02/03/14 02:52ID:???
ttp://www.futomi.com/ の解説ってどうなの?
クッキーの解説でも「パスが省略されると、アクセスしたリソース(HTML、CGI)のパスがセットされます。」とか本当にあってる?
とほほではそのスクリプトのフォルダ全部にパスかかるって書いてたと思うんだけど・・・
参考にしても大丈夫かな?
0539nobodyさん02/03/14 06:55ID:???
すいません、すごく初歩的な質問で恐縮なんですが、こういうときに
正規表現で前方一致させるにはどうしたらいいんでしょう?

$i = 0;
undef(%color);
foreach $name ('田中', '鈴木', '佐藤') {
$color{$name} = $i++;
}

田中角栄でも真紀子でも0を、鈴木一郎でも宗男でも1を、という具合に
定義したいんです。よろしくお願いします。
054053302/03/14 07:41ID:???
>>534
なるー。
0541488じゃないけど02/03/14 07:47ID:???
>>537
やべ。実はこっそり>>487はうまいこと言うなぁと思ってていたので、
そこには気づかなかったよ・・・
0542nobodyさん02/03/14 07:59ID:???
>>539
意図を理解するまでちょっとかかったぞ・・・

(ここに>>539のソース)
$in = <>;
undef $result;
while( ($name,$col) = each %color) {
$result = $col,last if $in =~ /^$name/;
}

て感じでどうかね。
0543nobodyさん02/03/14 08:56ID:???
>>542さん
すみません、私の説明不足でした。

1,foo,田中角栄,bar
2,foo,鈴木一郎,bar
3,foo,田中真紀子,bar
4,foo,佐藤三郎,bar
5,foo,佐藤栄作,bar
6,foo,鈴木宗男,bar
   ・
   ・
以下続く

というようなファイルがありまして、必ず田中、'鈴木、佐藤の順に
並べ替えるにはどうしたいいかと試行錯誤しておりまして、以下の
ようになっているんです。

$i = 0;
undef(%color);
foreach $name ('田中', '鈴木', '佐藤') {
$color{$name} = $i++;
}
@LINES = map {$_->[0]}
sort {$color{$a->[3]} <=> $color{$b->[3]}}
map {[$_, split /,/]} @LINES;

>>542でいただいたソースを貼ってみましたがうまくいかないようです。
アドバイスいただければ幸いです。よろしくお願いします。
0544nobodyさん02/03/14 09:55ID:???
>>543
初心者なもんで粗野ですが、こんな感じでやってみました。
%name = ();
@lines = ();
$i = 0;
while ($line = <DATA>) {
push(@lines, $line);
$tmp = (split(/,/, $line))[2];
$name{$tmp} = $i;
++$i;
}

@permutation = qw(田中 鈴木 佐藤);

foreach $fam (@permutation){
foreach $full (keys %name) {
if (index($full, $fam) == 0) {
push(@result, $full);
}
}
}

foreach(0 .. $#result) {
print $lines[$name{$result[$_]}];
}

__END__
1,foo,田中角栄,bar
2,foo,鈴木一郎,bar
3,foo,田中真紀子,bar
4,foo,佐藤三郎,bar
5,foo,佐藤栄作,bar
6,foo,鈴木宗男,bar
054554302/03/14 10:16ID:???
>>544さん
早速ありがとうございます。申し訳ありませんが、どうやって>>543に
移せばいいのでしょうか?私、perl二日目でしてよくわからないんです。
お手数をおかけして申し訳ありませんが、どうかよろしくお願いします。
0546nobodyさん02/03/14 10:25ID:???
「>>543に移す」の意味がわからないのですが・・・
結果を@LINESに入れるなら、
print $lines[$name{$result[$_]}];
を、
push(@LINES, $lines[$name{$result[$_]}]);
で大丈夫だと思いますが。
0547オ02/03/14 10:36ID:???
はじめまして、いまソケットのお勉強をしているのですが
期待した結果が得られません。ご指導のほど宜しくお願い致します。

WEBサーバー:AN HTTP Daemon ver1.38

1、DOSプロンプトから実行。
2、”localhostに接続できません。”
3、(ToT) アウゥー

以下からソースです・・・
use Socket;

$hostname = 'localhost';
$port = getservbyname('http', 'tcp');
$proto = getprotobyname('tcp');

$iaddr = inet_aton($hostname) or die "$hostnameが見つかりません。\n";

$paddr = pack_sockaddr_in($port, $iaddr);

$socket_addr = pack_sockaddr_in($port, $iaddr);

socket(SOCKET, PF_INET, SOCK_STREAM, $proto) or die "ソケットを生成できません。\n";

connect(SOCKET, $paddr) or die "$hostnameに接続できません。\n";

select(SOCKET); $|=1; select(STDOUT);


print SOCKET "GET /index.html HTTP/1.0\r\n";
print SOCKET "\r\n";

while (<SOCKET>){
m/^\r\n$/ and last;
}

while (<SOCKET>){
print $_;
}
ここまでです・・・
0548nobodyさん02/03/14 11:05ID:???
裸のSocketは素人にはお勧めできない。
素直にLWPにしとけ。
どうしてもSocketを使いたいなら、せめてIO::Socketにしとけ。
■ このスレッドは過去ログ倉庫に格納されています