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

【Perl 】初心者コーナーPart8

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

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

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

参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://ebi.2ch.net/test/read.cgi/php/988809842/l50
CGIの質問はこちら【CGIだけど、なんか質問ある?part4】
http://ebi.2ch.net/test/read.cgi/php/1000804655/l50

過去ログ、その他の役立ち情報は>>2-10を見よう。
0554名無しさん@お腹いっぱい。01/12/02 23:38ID:???
アマゾンでプログラミングPerlが品切れになっています。
アマゾン逝ってよしですか?
0555名無しさん@お腹いっぱい。01/12/03 00:00ID:???
別にんなことで逝ってよしとは思わん。
一般から見れば、切らさんように随時チェックせないかん程の本じゃないし、
一二週間待っときゃ入荷されるだろ。
0556 01/12/03 05:56ID:???
12週間も待ってられん。
なんてあげ足とりの漏れは逝ってよしですか?
0557名無しさん@お腹いっぱい。01/12/03 09:14ID:???
別にんなことで逝ってよしとは思わん。
ただ 84日ぐらい待っとけ・・・とはさすがに思わん。
0558名無しさん@お腹いっぱい。01/12/03 13:42ID:???
phpでいう、count($a)
みたいな配列の要素の数を数える関数てありますでしょうか。
0559縞栗鼠(シマリス)の親方01/12/03 13:46ID:v6vCrfM9
中央高等学院の従業員「西部」が女子トイレに闖入し
汚物入れを物色して女子生徒の使用済みタンポン・ナプキン等を
個人的に収集しているというのは事実。
中央高等学院 http://chs-f.com/index.html 中央高等学院福岡校
http://www.chuo-school.ac/
0560名無しさん@お腹いっぱい。01/12/03 13:58ID:???
>>558

$count = $#hogehoge + 1; # @hogehoge の 要素数
0561javaむぎ茶01/12/03 14:19ID:???
>>558
$count = @hogehoge;
$count = scalar(@hogehoge);
0562名無しさん@お腹いっぱい。01/12/03 16:01ID:???
htmにフォームを作ってそこからcgiに飛ばしてフォームの結果を表示して
いるのですが、htmlのフォームにチェック項目が幾つかあって
全部にチェックが入っていないとcgiで変数が空かどうか調べて
$hogeがチェック入っていません。
というふうにしてcgiでメッセージを出しています。
それで当然htmlに戻るんですが、ブラウザで戻ると
前にチェックした項目が全部チェックがはずれてしまっています。
項目がたくさんあるのでこれを回避したいのですが。
仕様でinputにcheckedを入れていないのがいけないのですが。
0563名無しさん@お腹いっぱい。01/12/03 16:07ID:???
>>562

こっちだべ。

CGIだけど、なんか質問ある?part4
http://pc.2ch.net/test/read.cgi/php/1000804655/
0564>>56201/12/03 16:18ID:???
ブラウザの「戻る」なら普通リセットされないでしょ??

HTMLの段階でJavaScriptかなんか使って
フォーム入力のチェックしたら?

# 厳密にCGIの質問じゃないね
0565名無しさん@お腹いっぱい。01/12/03 17:39ID:???
わざわざ no-cache とかやって リセットされると嘆いてるに 1票
0566初めてのスクリプト01/12/03 18:15ID:4NX8xqaD
#!/usr/bin/perl -w

$check_word = $ARGV[0];
$check_file = $ARGV[1];

open(IN, "$check_file");
while ($line = <IN>) {

if ($line =~ $check_word) {
if ($line =~ /(\d+\.*\d+)\s*Mbps/ )
{
$ct++ ;
$speed += $1;
}

elsif ($line =~ /(\d+\.*\d+)\s*[kK]bps/ )
{
$ct++ ;
$tyousei = $1 / 1000;
$speed += $tyousei;
}

}
}
$avr = $speed / $ct;

print "$ct 回 \n";
print "$avr Mbps\n";
056756601/12/03 18:16ID:4NX8xqaD
改行数が多すぎるといわれたので、2に分けました。

スピードテストのサイトのデータを perlで処理するスクリプトを作ってみました。何とか動いているので、感激しているのですが、brush upするために諸先輩のご意見をお聞かせください。

測定回数と平均スピードを表示するものです。
測定サイトは、 http://speed.on.arena.ne.jp/  http://www.broadland.jp/  の2カ所。データは、2種類です。
TARGET home.att.ne.jp
DATE Sun Dec 2 06:25:37 UTC+0900 2001
TIME 4.627 sec
YOU 5432 Kbps

測定サイト http://speed.on.arena.ne.jp/ v2.0.7
測定時刻 2001/12/02 10:54:22
回線種類/線路長 ADSL/-km
キャリア/プロバイダ ACCA 8Mbps/so-net
ホスト1 WebArena(NTTPC) 4.52Mbps(2244kB,4.0秒)
ホスト2 at-link(C&W IDC) 5.3Mbps(2244kB,3.5秒)
推定最大スループット 5.3Mbps(665kB/s)
コメント ACCA 8Mbpsとしてはかなり速いです!おめでとうございます。(1/5)

これで、このように表示されます。
26 回
3.61423076923077 Mbps

課題 小数点以下を第2位くらい、あるいは、任意の桁で表示する。
独学の初心者です。よろしくお願いします。
0568名無しさん@お腹いっぱい。01/12/03 19:17ID:???
取り合えずここを見てみれ
http://www.din.or.jp/~ohzaki/perl.htm
056956601/12/03 20:01ID:???
>568
ありがとうございます。
とりあえず、sprintf を使うことにしました。

後は、時間帯別、日別の平均スピードに挑戦します。
0570名無しさん@お腹いっぱい。01/12/03 20:08ID:???
良く読んでないが、それだけの目的なら
printf(".2f",$avr);
本持って無いなら
`printf` `format` `perl` 辺りで検索してくれ
0571名無しさん@お腹いっぱい。01/12/03 20:09ID:???
あ遅かった (死
0572バックスペースとのマッチ01/12/03 20:37ID:sBy63GlF
当方かなりPerl初心者です。よろしくお願いします。

コマンドライン入出力ファイルから、特定コマンドの出力を取り出そうとしています。
(幸いな事に、ファイルにマルチバイト文字は含まれていません。)
コマンド入力の際に、「ミスタッチ→バックスペースで修正」と打たれていた場合に対応しようとし、以下の様に考えました。

1.バックスペースは直前の文字と相殺する。
2.バックスペースがある限り、1.を繰り返す。

以上を実現するため、以下の様なコードを書きました。(デバッグ用のprintも併せて記します。)

while($line =~ m/.[\b]/) {$line =~ s/.[\b]//; print "さば$lineさば\n";}
print "いわし$lineいわし\n";

以下、疑問点です。
疑問点1:
バックスペースが入っている行をこの処理に入れても、さばprintが出ません。
正規表現は合っているでしょうか?(「らくだ本」を見ても、私の頭ではいまいち解りませんでした。)

疑問点2:
いわしprintですが、バックスペースは単なるホワイトスペースとして出力されている様です。
(print出力をファイルへリダイレクトしてみましたが、明らかにホワイトスペースでした。)
私はやろうとしている事が果たしてできるのでしょうか??

蛇足ですが、当方の作業環境のperlバージョンは

This is perl, version 5.005_03 built for sun4-solaris

Copyright 1987-1999, Larry Wall

でした。
0573名無しさん@お腹いっぱい。 01/12/03 22:46ID:???
全く意味が分からんが、その「コマンドライン入出力ファイル」なる
物にはユーザのキーログがそのまま入ってるって訳?
だったらansiの表でも見ながらパーサ書くのが王道じゃ無いの?
→←とか押されたらどうするんでしょ
057457201/12/03 23:14ID:+1gWR50Y
>>573様
舌足らずな説明、すいませんです。
「コマンドライン入出力ファイル」とは、

telnet somehost | tee /tmp/log.txt

と打った時の/tmp/log.txt内容をご想像下さい。
バックスペース入力がファイルに残るのは見ているのですが、
カーソルキー入力がファイルに残り、それが入った文字列が有効なコマンド名となるのは試していませんです・・・すいません・・・
例えば、
p ^[[A s -a
みたいな感じになるのでしょうか?(でもこの場合、有効な入力にはならない気が・・・)
0575名無しさん@お腹いっぱい。01/12/03 23:28ID:wka85RYE
レンタルHTMLって何よ?
ソースがおかしいって言ったら突然CGIを語るなら
LINUX勉強しろって言われてPHP、SQLの勉強してはどうだろうか?
と罵倒され、レンタルHTMLって知らないのかと言われたんだが…
0576名無しさん@お腹いっぱい。01/12/03 23:45ID:???
ここ人少ないのか(;´Д`)
他のところで聞いてくるYO!
057754801/12/04 20:46ID:???
>>550
なるなる、やはりこの方法がいいようですね。
あの後いろいろやってみて同じ方法にたどり着きました。
0578名無しさん@お腹いっぱい。01/12/05 01:13ID:9ARk5xac
test
0579名無しさん@お腹いっぱい。01/12/05 17:18ID:rTg+WPeh
Windows環境の人、Perlスクリプトはどこに保管してます?
c:\perlの中? c:\scrとかかな? c:\pl?

スタンダードってありますか?
0580名無しさん@お腹いっぱい。01/12/05 17:58ID:my6OaWYN
起動用のバッチファイルといっしょにc:\home\bin に放り込んでいる
0581名無しさん@お腹いっぱい。01/12/05 19:34ID:???
大体書き捨て以外は用途別に別けて溜め込んでるD:\comp_lang\perl\〜〜って感じ
#何でスクリーンセーバだろ? とかちょっと悩んだ w
0582名無しさん@お腹いっぱい。01/12/05 19:34ID:Lvfs0GBW
すごーく基本的なことをきいているとおもうのですが、
foreach文で、

foreach(@line){
($_使って処理)
}

というようなことをしたいのですが、たとえば、配列@lineのが30個の要素
を持っていたとして、11番目から20番目まで処理したいとかいうとき
foreach文でそんなことは可能なのでしょうか?それとももっといい方法
があるのでしょうか?
私の少ない知識では、

for (my $i = 10; $i < 20; $i++){
($line[$i]を使って処理)
}

という幼稚な方法しか思いつかないのですが...。
ご教授お願いいたします。
0583_gunzip01/12/05 19:44ID:???
foreach (10 .. 19) {
    print $line[$_], "\n";
}
などなど。
0584名無しさん@お腹いっぱい。01/12/05 20:12ID:???
>582
foreach(@line[10 .. 19]){
処理
}
0585名無しさん@お腹いっぱい。01/12/05 23:42ID:???
>>579
うちは c:\home\pl
058657201/12/06 02:54ID:1atXp7qL
すいませんでした。
私の質問に回答をいただけないのは、きっと私の質問そのものに欠陥があったためなのでしょう。
という訳で、消えますが、その前に基本的な質問を発したくございます。

今回の様な極めて初歩的な質問(バックスペースにマッチするサンプルでOKです。)は、どのスレッドで質問すればいいのでしょう?
今回の様な、WebProgramingとは関係ない質問は、どの板で質問すればいいのでしょう?
やっぱり私は、シェル操作そのものに関して無知と思われます(カーソル移動で入力コマンド文字列を変更する技に関して、あまりよく知りません。)が、根本的に知識不足ですね。
書けば書く程鬱・・・Perlはおろか、コマンドラインでキーを打つのすら禁じられた気分であります・・・だって私は、愚者ですから・・・
失礼しました・・・
0587デフォルトの名無しさん 01/12/06 03:12ID:???
別に無視してた訳じゃ無いと思うけど、あんまり興味有る人が居ないんじゃない?
上にも書いてるけど、キーログの類なら正直Packetstormとかに行って
KEYLOGってすればワラワラ出てくる筈だから、その辺でも見てみれば
マッチングだけなら m/\b/ でいいんだけど、個人的には文字列の解釈(コマンドの引き数とかね)は
正規表現でゴチャゴチャするより、
while(substr(***))って感じで1byteづつ切り分ける方が結構簡単だったりする
漠然としてるけどこんなところ。あんまり質問を見てないけど (^^;
0588名無しさん@お腹いっぱい。01/12/06 06:24ID:???
「すぐわかるPerl」のサンプル掲示板を作ってみようと
そのままのperl文を写して掲示板を作成したのですが
まったく機能しません。。(コメントが書き込まれない)
たぶん記述は何回も確認したので間違えてないと思うのですが
よろしければアドバイス願います。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−
#!/usr/bin/perl
print "Content-type:text/html\n\n";
read(STDIN, $str, $ENV{"CONTENT_LENGTH"});
@parts=split('&',$str);
foreach(@parts){
($variable,$value)=split("=");
$value=~ tr/+/ /;
$value=~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
$value=~ s/\r\n/\n/g;
$value=~ s/\r/\n/g;
$cgi{$variable}=$value;
}

$formfile="../chatform.html";
$name = $cgi{"name"};
$memo = $cgi{"memo"};
0589長いので改行は省きました01/12/06 06:25ID:???
print <<EOF;
<META HTTP-EQUIV="Refresh" CONTENT="0;URL=http://************/chatform.html">
<body bgcolor=silver text=navy>
wait for a second...<P>
EOF
open(FILE, "$formfile");
@oldform = <FILE>;
close(FILE);
$li = undef;
foreach(@oldform){
if(/^<LI>/){
@body=(@body, $_);
$li = 1;
}elsif($li){
@foot = (@foot, $_);
}else{
@head = (@head, $_);
}
}
open(FILE, ">$formfile");
select FILE;
print @head;
print @body;
print <<EOF;
<LI>$name: $memo
EOF
print @foot;
close(FILE);
0590名無しさん@お腹いっぱい。01/12/06 06:55ID:???
ネタかと思ったらマジで有りやがんの →すぐわかるPerl
記述に間違いが無くてこれなら、こんな本捨てちまえ (いやマジで
つーか全然すぐ分かって無いし
愚痴だけじゃアレだから、openした時は返り値を見れ
open(FH,"hoge")||&Error("Can't open $!");
とか
if(!open(FH,"hoge")){&Error("Can't open $!");}
として
sub Error{print "Content-type: text/html\n\n$_[0]"}
後はひたすらprint分並べて変数の中確認しろ
なるべく小さく、ファイル操作するなら、まずファイルに一文字書き込み
から。
0591名無しさん@お腹いっぱい。01/12/06 07:01ID:???
つーか初心者本歌ってるのにバグ鳥の仕方書いてないのかよ (´д`;)
0592名無しさん@お腹いっぱい。01/12/06 07:24ID:???
まあねえ、、これがどの辺に書いてるかによるかも(笑 >>589
とりあえず何となく合ってる風味だからHTML間違えてるとかファイル開いてないとかじゃないの
上からどんどんprintして見ていけば?
0593説明01/12/06 07:39ID:???
もし「〜〜日で出来る」とかの初歩本買うなら、簡単なデバッグの仕方位
書いてるものを選ぼう。
いきなりCGI書かせてCarpやKcatchの説明も無しと言うのは作者が精神分裂症か
サディストかのどちらかです :3=) Byバカボンのパパ
0594名無しさん@お腹いっぱい。01/12/06 07:39ID:???
>>588
殆どそのまんま588をコピペしたけど書き込まれたよ。
chatform.htmlが存在しないか、投稿フォームがオカシイんじゃ?
0595名無しさん@お腹いっぱい。01/12/06 07:59ID:???
すぐわかるの掲示板は、設計自体がへん。
0596名無しさん@お腹いっぱい。01/12/06 08:24ID:???
>>572,586
これ(↓)試したらどうなります?

$_ = "a\bb\bc\n";
print;
s/[\b]//g;
print;
059758201/12/06 09:02ID:YsGQWh0f
>>583 >>584

どうもありがとうございました。
なるほど、こんな風に記述できるのですね。
早速やってみます。
0598名無しさん@お腹いっぱい。01/12/06 09:09ID:???
僕も半年ほど前に『すぐわかるPerl』買ったんだけど、それを終えたあとすぐにオライリーの
『初めてのPerl』やったら、『すぐわかるPerl』を買ったことをすぐに後悔した。
0599名無しさん@お腹いっぱい。01/12/06 10:04ID:???
>>590-598
参項書籍スレッドの方では結構評判いいのにね。

よかったら、その辺のこと、
http://pc.2ch.net/test/read.cgi/php/988809842/
に書いといてくれない?
サマリーに入るかもしれないし。
0600名無しさん@お腹いっぱい。01/12/06 11:26ID:???
「すぐわかるPerl」やるよりも、「初めてのPerl」やるほうが
100倍良いのは明らかだとは思う。
ただ、ホントにプログラムくむのが初めての人だったら、
一冊目が「初めてのPerl」というのはキツいかもしれない。

そういう場合のみ意味があると思う>すぐわかるPerl

# 大体、「すぐ分かるPerl」の著者は、本の中で「初めてのPerl」
を推薦してるし。
0601名無しさん@お腹いっぱい。01/12/06 14:32ID:ixzePiV3
2chネラ用のアプロダ作成中ですが(あやしいのパクリだけど)
ファイルを保存するルーチソってこれで問題ないですかね?

open(FILE, ">$file_dir\/$_[0]\.$$");
binmode(FILE);

binmode(STDIN);
while(<STDIN>) {
if ( $_ =~ /^$endline/ && $endline =~ /^--/ ){
last;
} elsif ( /^--/ ) {
$endline = $_;
} elsif ( /^Content\-Type\:\s*(.*)/i ) {
$file_type = $1;
} elsif ( /^\r\n/ ) {
next;
} elsif ( /^Content-Disposition: form-data/i ) {
next;
} else {
s/\r\n//g;
print DB $_;
}
}
close(FILE);
060260101/12/06 15:39ID:???
ダメだ、メッセージが上手く受け取れネーや。。。

cgilib使ったほうがいいのかな
0603ウンコー01/12/06 15:43ID:8ybpM+Zd
これでもよんでがんばれ。
http://www.puchiwara.com/hacking/

それでもむりなら
裏ニュース。
060457201/12/06 19:27ID:wL0DoiFw
>>587様,596様、ありがとうございます。回線切って首吊って氏ななくて良かった・・・
懲りずに書き込みます。

>>596様のスクリプトですが、私の環境で実行したところ、
c
abc
と出ました。期待値通りの出力です。
以上から考えますと、バックスペース入力は、ファイル内では
\b以外の文字コードとして存在している、という事になります。
viでファイルを開くと「^H」(カーソル移動はこれで一文字分の移動をし、^とHから成る訳ではありません。)と見えるこの文字が何であるのか、
もう少し調べてみます。
それでは。
0605588&58901/12/06 20:07ID:???
みなさん、どうもです。ヤパーリ本がおかしいんですかね..。
当方、初心者なもんで「これでやっと掲示板作成か!」って段階に
来ていたのにできないもんですから、鬱になってました。。

>>594
投稿フォームも全部記述通りに書いたのですが
やっぱり無理でした。。

とりあえず590さんのを見てもう一度考えてみます
0606名無しさん@お腹いっぱい。01/12/06 23:27ID:dTMUXoew
�@ if(100 <= $total < 200)

�A if((100 <= $total) and ($total < 200))

こういう条件式は�@のようにいっぺんに聞いてはいけないのでしょうか。
SQL文は�@のやり方でいけたんですけれど。
0607名無しさん@お腹いっぱい。01/12/06 23:42ID:???
htmlからcgiへフォーム送信しています。
htmlでmethodはpostです。
それで渡す値を色々試したいのでurlに?hoge=引数の形で
試すのですがうまく渡りません。
単にurlに引数を渡す場合でもhtmlのmethodをgetに変えなきゃいけないんでしょうか。
0608名無しさん@お腹いっぱい。01/12/06 23:50ID:???
やってみればスグに分かる。
0609名無しさん@お腹いっぱい。01/12/07 01:34ID:???
cgi-libとかってクエリでキーが複数あった場合
"\0"をセパレートとしてるけど、これって値事態に
"\0"があったら意味ないよね?
それとも\0ってなにか特殊なの?
061060901/12/07 01:37ID:???
s/値事態/値自体/;
0611名無しさん@お腹いっぱい。01/12/07 01:42ID:We0Nr7br
初心者ということで教えてください。
perlで処理をすべて1ファイルで記述して
100KBくらいになったCGIは
やっぱり重いですか。
分割したほうがいいですか?
0612名無しさん@お腹いっぱい。01/12/07 02:09ID:???
>>611

分割したって同じじゃない?
0613名無しさん@お腹いっぱい。01/12/07 02:13ID:???
>>611
>初心者ということで教えてください。
これを書いてしまったことにより無視されるに50円。
0614名無しさん@お腹いっぱい。01/12/07 02:13ID:???
>609
&で切っても&が有ったら意味ない、=で切っても=が有ったら意味ない
普通は&や=より\0使ったリクエストのが少ないだろ
>610
100KBくらいのCGIを書ける頃には分かるから気にすんなw
0615名無しさん@お腹いっぱい。01/12/07 02:24ID:???
>>606
>�@if(100 <= $total < 200)
>SQL文は�@のやり方でいけたんですけれど。
いけないって。DBは何?
SQLなら WHERE $total <= 100 AND $total < 200 って書かないとエラーになるYO!
0616名無しさん@お腹いっぱい。01/12/07 02:26ID:???
>>615
WHERE $total >= 100 AND $total < 200
0617名無しさん@お腹いっぱい。01/12/07 08:27ID:???
>>604
c
abc
となるなら、端末の設定も問題ないと思います。
また、vi上で^Hと表示され、^とHから成る(カーソルが2カラム分動く)のなら、
その文字はBackSpace(Ascii Code: 0x8)です。

>>596のみのスクリプトを端末ではなくリダイレクトでファイル出力し、その
結果をviで見たら、
a^Hb^Hc
abc
となりますか? od -cxの出力結果でも確認できます。
もし、^Hや\bが正しく出力されているのであれば、問題はスクリプトの別の部
分にあると疑ったほうがよいでしょう。

ちなみに WinNT + ActivePerl v5.6.1で、>>572のコードの先頭に
$line = "a\bb\bc";
を追加した結果をファイルに落として覗くと、
以下の通り期待した結果となります:

さばb^Hcさば
さばcさば
いわしcいわし
0618名無しさん@お腹いっぱい。01/12/07 10:57ID:yYR0Ii3K
windows2000で使えるパールソフトはないのでしょうか?
0619名無しさん@お腹いっぱい。01/12/07 12:08ID:???
>>3の上から3番目
0620名無しさん@お腹いっぱい。01/12/07 12:17ID:???
パールソフト
0621名無しさん@お腹いっぱい。01/12/07 12:19ID:???
パールライス
062261901/12/07 14:43ID:???
ああ、突っ込みたくてうずうずしていたのに・・・
062361101/12/07 15:44ID:???
>>612
例えば
Perlで書いた掲示板プログラムをみると
管理用.cgiとbbs.cgiというように
分けてあるものと、
管理用も、bbs用も1ファイルで全て記述してある
ものを見かけるので、
実行速度とか関係あるのか、どちらが良いのでしょう?
.cgiは毎回毎回ロードされるのですか?

>>613
>初心者ということで教えてください。
私のような初心者が質問していいスレッドだと
思ったのですよ。無視しないで教えてくれ〜。
0624名無しさん@お腹いっぱい。01/12/07 15:56ID:???
もし指定したディレクトリが存在しなければ、そのディレクトリをつくれ!
って言う書式を教えてください
0625名無しさん@お腹いっぱい。01/12/07 16:05ID:???
>>624
if (ディレクトリが存在しない) {
ディレクトリをつくれ!
}
0626名無しさん@お腹いっぱい。01/12/07 16:09ID:???
なるへそさんくす

[[解決]]
0627名無しさん@お腹いっぱい。01/12/07 18:24ID:???
質問です。

$tensu{'田中'} = 100;
$tensu{'鈴木'} = 90;
$tensu{'佐藤'} = 100;

といったデータをsortした場合、田中と佐藤のどっちが先に来るかというのは
法則があるのでしょうか?
いつも同じ結果になるので法則があるのだとは思うのですが、その法則とは
どのような法則になっているのでしょうか?
もしご存知の方がいたら教えていただけると助かります。
よろしくお願いします。
0628名無しさん@お腹いっぱい。01/12/07 18:33ID:???
最初に定義した順だ
0629名無しさん@お腹いっぱい。01/12/07 18:43ID:???
本当ですか?
0630名無しさん@お腹いっぱい。01/12/07 18:44ID:???
>628
定義した順という事は上の例で言えば田中、鈴木、佐藤の順という事ですか?

print "Content-type: text/plain\n\n";
$tensu{'田中'} = 100;
$tensu{'鈴木'} = 100;
$tensu{'佐藤'} = 100;
$tensu{'山本'} = 100;
$tensu{'木村'} = 100;
foreach(sort{$tensu{$a} <=> $tensu{$b}} keys %tensu){
print $_."\n";
}

↑この例で試した場合、
↓のような順で表示されたのですが・・・。
木村
鈴木
山本
佐藤
田中
0631名無しさん@お腹いっぱい。01/12/07 19:17ID:???
文字列のソートはcmpだよ、<=>だと比較対象がisnumberじゃない時に
スルーされる(筈)だからソートは行われない
print "$_\n" for sort{$a cmp $b}qw(cat rabit dog monkey mona);
日本語をソートしたいならJperlを使おう
0632名無しさん@お腹いっぱい。01/12/07 19:34ID:???
>631
いえ、数字ソートした場合の同値の並び順の法則を聞きたいのですが・・・。
0633名無しさん@お腹いっぱい。 :01/12/07 19:55ID:???
だから行われないっつってんのに :-(
print "$_\n" for sort{$a <=> $b}qw(鈴木 山本 田中 木村);
鈴木
山本
田中
木村

で、何でおかしな並べ替えが行われてるかと言うとkeysを通すからですが
この時keysが返す値の並びは***不定***なので
何から出てくるかは完全に***予測出来ません***
0634名無しさん@お腹いっぱい。01/12/07 19:59ID:???
何故かと言うとハッシュテーブルから一致した物をどんどん引き抜いてるだけなので。
これが気に入らないならハッシュ法を調べて、値を返す前にソートする様に
keysを改造して下さい :-)
0635名無しさん@お腹いっぱい。01/12/07 20:17ID:???
>633-634
つまりハッシュテーブル内での記録状態に依存されるという事ですね。
こちら側からはその記録状態を把握できないから法則性を見出す事は出来ないと。
その返答で十分です。
ありがとうございました。
0636JAPU@はにゃ〜ん ◆JAPUTeX. 01/12/07 20:59ID:???
use Tie::IxHash;
tie %moemoe, "Tie::IxHash";

すれば keys %moemoe で "定義した" 順番に返ってくるにょ。
http://search.cpan.org/search?dist=Tie-IxHash
0637名無しさん@お腹いっぱい。01/12/07 21:00ID:???
>>611,623
たいして変わらん。
まず読みやすく書け。
管理がしやすくなるなら分割しろ。
初心者だから〜という考えは捨てろ。
0638名無しさん@お腹いっぱい。01/12/07 21:07ID:???
初心者が自分を初心者と思わないほうが怖いぞ(w
0639名無しさん@お腹いっぱい。01/12/07 23:53ID:???
>>638 そういう意味じゃないだろ
0640名無しさん@お腹いっぱい。01/12/07 23:59ID:XnpIIJ1Q
ActivePerl 、win2000で使えません
0641名無しさん@お腹いっぱい。01/12/08 00:09ID:???
使えていますが何か?
0642名無しさん@お腹いっぱい。01/12/08 00:10ID:???
http://www.activestate.com/Products/Download/Get.plex?id=ActivePerl
使えるの?
0643名無しさん@お腹いっぱい。01/12/08 00:16ID:???
>>642
ちゃんと英語読め
0644名無しさん@お腹いっぱい。01/12/08 00:18ID:???
>642
それはシステムの要求項目だ、特に無しって事だから気にすんな
nextに進んでmsiかzipを落せ
0645名無しさん@お腹いっぱい。01/12/08 00:23ID:9GPXgj8m
馬鹿な質問すいませんでした。親切なレスありがとうございます。
0646名無しさん@お腹いっぱい。01/12/08 05:13ID:LmrHjtAG
#!/usr/local/bin/perl
sub func (\%);
{
my %hash = ( key => 'VALUE' );
func(%hash);# <--(先頭に & 記号無しの呼び出し)
}
sub func (\%) {
my $ref = shift;
print $ref->{key}, "\n";# VALUE
}

誰か、サブルーチンを呼ぶ時に &func(%hash); と
した途端、期待通り動かなくなる理由をオシエレ。

一週間悩んだ挙句、このスレの 100-200 あたりを読んで
解決はしたけど、やっぱ理解しないと気持ち悪いのヨ。
0647名無しさん@お腹いっぱい。01/12/08 05:40ID:D6XloJOW
プロトタイプは & を使わない呼び出しのみに作用するように
出来てるから、つまり仕様。ってことじゃダメ?
064864601/12/08 05:53ID:LmrHjtAG
>>647
あ、非常によくわかりましたです。
今までは、将来の組み込み関数やファイルハンドルと
重ならないように、全てのサブルーチンにつけてましたが
先頭で宣言しとけば、もし重なった時にはエラーが(多分)
出ますものね。ありがとうございました。

ちなみに文体は変わりましたが本物の 646 です。わらい。
0649名無しさん@お腹いっぱい。01/12/08 06:24ID:???
>636
専用のモジュールもあるんですね。
ありがとうございます。
0650名無しさん@お腹いっぱい。01/12/08 09:44ID:txIFSrN6
あの、質問です。
本当に初心者なんです。
FFFTPでCGIを転送するときのしくみ
でいい参考資料ありませんか?(汗)
ログありすぎて探したのですが
わかりません。。
0651名無しさん@お腹いっぱい。01/12/08 09:52ID:???
>>650
質問の意味が全然わかりません。
とりあえずもうちょっと勉強した方がいいような気はする。
http://tohoho.wakusei.ne.jp/www.htm
0652名無しさん@お腹いっぱい。01/12/08 09:57ID:???
>>650
RFC959
065365001/12/08 10:40ID:c8d0pxqG
ああ、スイマセンでした。。
日本語も勉強した方がいいみたいです、私。
CGIのアップロードの仕方がわかんないんですが。
0654名無しさん@お腹いっぱい。01/12/08 11:02ID:???
>653
http://www.google.com/search?num=100&hl=ja&q=FFFTP+CGI+%83A%83b%83v%83%8D%81%5B%83h&lr=
お好きなページをどうぞ。
■ このスレッドは過去ログ倉庫に格納されています