Perl 初心者コーナー Part22
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/04/15 10:15ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 10
http://pc2.2ch.net/test/read.cgi/php/1048686475/
参考書籍の話題は、【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
過去ログやお勧めサイトは >>2-10
0718nobodyさん
03/05/09 00:44ID:???0719nobodyさん
03/05/09 00:45ID:???0720nobodyさん
03/05/09 00:47ID:???0721720
03/05/09 00:48ID:???0722nobodyさん
03/05/09 00:49ID:???0723706
03/05/09 01:04ID:???そこで俺がやりたい事を具体的に書こうと思います。
現在RPGを作ってます。
【@並び替えたリスト = sort {ルーチン} @リスト;】
「リスト」には、戦闘参加メンバーが順番に入ってます。
「並び替えたリスト」は、「リスト」のメンバーを素早さ順にしたいわけです。
ただ、各々の「素早さ」を取得するのが少々めんどうで、素早さが入っている変数名がダイレクトに分からないのです。
${"メンバーデータ$リスト[0]"}{'素早さ'};
こーゆー感じで書いた場合、メンバー一人分の素早さを取り出す事が出来ます。
「リスト」の中には何人いるか分かりませんが、全て戦闘参加メンバーです。
で、もし五人だった場合、
${"メンバーデータ$リスト[0]"}{'素早さ'}から${"メンバーデータ$リスト[4]"}{'素早さ'}
までの「リスト」(全メンバー)を素早さ順に「並び替えたリスト」にしたいのです。
こんな一見単純そうな事で俺の脳はパニックです。汗
ただ、どう書くのか記述自体を教えてもらうよりも、「$a」と「$b」に何が入るのか教えてくれたほうが嬉しいです。
今後のコトもありますので…。
もし、sort関数を使わないで、自作でループの記述があればそれを教えて下さったら、とてもありがたいです。
多少処理が重くても「$a」と「$b」のような理解出来ない(俺には)変数が登場するより安心できますから…。
考えたあげくにこんな説明ですみません。
0724動画直リン
03/05/09 01:10ID:X5KsRuJ+0726nobodyさん
03/05/09 01:33ID:???何がやりたいのかいまいちわからないのだが・・・
@member = ('mona','giko','morara');
%speed = (mona=>15,giko=>100,morara=>3,hoge=>50);
@resalt = sort{$speed{$a} <=> $speed{$b}} @member;
foreach $val(@resalt){
print($val."=".$speed{$val}."\n");
}
こんな感じで
morara=3
mona=15
giko=100
が出力されるが・・・
もしもハッシュに入っている分全部なら @memberじゃなくて keys %speed
とかね・・
0727nobodyさん
03/05/09 01:35ID:???変数名わからないってなんだ?
$speed{ID}
$money{ID}
とかなら楽だろ?
0728nobodyさん
03/05/09 01:43ID:???漏れならこうするっていうのを書いておくよ・・・
%money %hp %speed 用意してまぁ実際には何があるかはしらんが3つだけ
gikoのデータは
$money{giko},$hp{giko},$speed{giko}に代入
戦闘時のメンバーは @member に格納する
残りは726に書いたとおり
@memberじゃなくて keys %hp; にでもすれば
すべての要素がソートされる
0729nobodyさん
03/05/09 01:49ID:???@list = ("mona", "giko", "morara");
%menberdata_mona = (... "speed" => 80, ...);
%menberdata_giko = (..."speed" => 255, ...);
%menberdata_morara = (..."speed" => 50, ...);
@list_by_speed = @listを、素早さにしたがってソートして返す処理; #A
# 得たいもの→ @list_by_speed = ("giko", "mona", "morara");
Aの処理を知りたい。
0730nobodyさん
03/05/09 01:52ID:???というかさ 変数名が増えたり減ったりするのって気持ち悪くない?
ある状況では$gikogikoが宣言されてある状況ではそれが$monamonaになったりするの
って
use strict使ってればそんなのは弾くと思うんだが・・・
0731706
03/05/09 01:58ID:???少しづつ$aと$bが分かってきました。
>>726さんの記述はとっても分かりやすかったです。
>$speed{$a}
この時$aと$bには、引数のリストの中身が自動で順番に代入されているのですね?
で、ルーチンが何回もループされて全部を比べるまで「-1」「0」「1」をはじき出してると…。
正直、かなりすっきりしました。
しかし、変数名がダイレクトに分からないときはどうしたら良いでしょうか?
@素早さ順リスト = ${"メンバーデータ$リスト[$a]"}{'素早さ'} <=> ${"メンバーデータ$リスト[$b]"}{'素早さ'}}@リスト;
これだと明らかに間違いです。
($aと$bの部分には「@リスト」の値ではなく、数字が入るため)
と言うか、しつこく聞きまくって迷惑かけたのであとは自分で調べたいと思います。
ホントありがとうございました。感謝。
0732726
03/05/09 02:03ID:???わからない時はどうするって?
だからわかるようにコーディングするだけなんだけどさ・・・
730が言う様に メンバーが増えるごとにハッシュが増えたりするって言うのは
激しく使いにくいと思うんだが・・・
%menberdata_giko をあえて定義する必要があるのか?
あるのなら
%menberdata_giko=(name=>$name{giko},speed=>speed{giko},money=>money{giko});
こんな風にすればいいんじゃないの?
0733706
03/05/09 02:05ID:???の記述をかなり書き間違えたので訂正しておきます。
@素早さ順リスト = ${"メンバーデータ$リスト[$a]"}{'素早さ'} <=> ${"メンバーデータ$リスト[$b]"}{'素早さ'}}@リスト;
これは、
@素早さ順リスト = sort{${"メンバーデータ$リスト[$a]"}{'素早さ'} <=> ${"メンバーデータ$リスト[$b]"}{'素早さ'}} @リスト;
こうでした。汗
0735706
03/05/09 02:12ID:???そうです、激しく使いにくいです。汗
前回もRPGを作ったんですが、それは1対1の戦闘しかないので超楽でした。
今回は、多数対多数の戦闘をやろうと思って適当に書き始めたのですが、想像以上に複雑になってしまって。汗
適当に考えながら書いてるウチになんとかなるだろ、って軽いノリで始めたのが大失敗でした。。。
ご指摘の通り、全部書きなおすかもしれません…。
なお、たくさんのレスをいただいていますが、現在頭がフル回転でまともに返事返せてなくてすみません。
時間をかけてしっかり考えていきます。
プログラム経験が長くないので明日までパニクってる状態が続くかもしれません。
俺の中でこんな感じに作った経験が全くないので…。
0736706
03/05/09 02:26ID:???>というかさ 変数名が増えたり減ったりするのって気持ち悪くない?
なるほど…。ほとんどperlしかまともにやった事ないのでそうゆう感覚を知らなかったです。
宣言とか全く気にしたコトないし…。汗
勉強になります。
sortを自分の中で納得出来てきたので、そろそろ記述を考えたり書いたりします。
落ちようかと思います。
ホントありがとうございました。たっぷり迷惑かけてすみませんでした。
0737nobodyさん
03/05/09 06:17ID:???0738nobodyさん
03/05/09 07:06ID:???そうしてる。
0739なまら名無し
03/05/09 08:47ID:D4ewNm9iをつくってるんですが、エラーは一切でず、ファイルには何も書き込ま
れてない状況になってます。datのパーミッションも775、755、666、
644、どれにしても結果は同じです。ロックもはずしてみましたが、
だめです。以下に引用をのせます。
$test = "aho";
open(WRITE,">test.dat") || &error('write_file_open_error');
print WRITE $test;
close(WRITE);
入力用のフォームタグ関係も各情報源から調べ、そこのところは問題
ないはずですが。ちなみにサーバー側のエラーログもみましたが、エラ
ーは一切でません。cgiも普通に動作し、ただ書き込みが反映されず、
datに何も書き込まれない状況です。
0741動画直リン
03/05/09 09:10ID:X5KsRuJ+0743nobodyさん
03/05/09 13:19ID:???どうしてハッシュはハッシュっていう名前なんですか?
0744nobodyさん
03/05/09 13:27ID:???ttp://dictionary.goo.ne.jp/search.php?MT=hash&kind=&mode=0&ej.x=35&ej.y=1
0745nobodyさん
03/05/09 14:49ID:???全然答えになってないし。
意味的には「切り刻む」というのが一番近い。
レコードに対するインデックスがランダムに並ぶように
内容に対して一意に決まる数、というのが元の意味。
0747743
03/05/09 15:28ID:???えっと、上の説明で考えてみたんですけど、
$変数が いっこの変数
@配列が ちゃんと並べてある変数の集まり(数字ラベルつき)
%ハッシュが ぐちょぐちょに並んだ変数の集まり(名前ラベルつき)
こんな感じでいいんでしょうか? 変数や配列みたく、日本語の
名前がついてればわかりやすいのになーと思いました。
0749nobodyさん
03/05/09 15:40ID:???0750nobodyさん
03/05/09 15:54ID:???そうなんだ。じゃあコレとかは誤訳なのかな。
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perldata.html
駱駝本 (改訂版) でも「ハッシュ == 連想配列」という訳し方してるけど。
0752nobodyさん
03/05/09 16:45ID:???実際にperlを作るとして、連想配列をどう実現するか。
キーとなる文字列とそれと対になる値を、
発生した順に片端から並べていって、
参照する必要が生じたら端から調べるのかというと、
そんな時間のかかる事はしない。
で、キーをハッシュで数値に変換して、その数値で管理する。
だから、foreachで舐めると登録したのと全然関係ない順番で
出てくるっしょ。
そのバラバラに刻まれ加減が、ハッシュ。
0753nobodyさん
03/05/09 17:22ID:VvqPULTq0754nobodyさん
03/05/09 17:48ID:???http://www.google.com/search?num=100&hl=ja&inlang=ja&ie=Shift_JIS&safe=off&c2coff=1&q=Perl+%83t%83@%83C%83%8B%83e%83X%83g%89%89%8EZ%8Eq+stat%8A%D6%90%94&lr=lang_ja
0755nobodyさん
03/05/09 18:17ID:???まあ、厨にはどうでもいいだろうが・・・
awkやperl4までの多次元配列は、\034を添え字とするハッシュで
実現されていた。
多次元配列(順番の添え字を持ったリスト)をハッシュと言うか?
ハッシュと言うのは、連想配列を実装するアルゴリズムだ。Cでも
何でも使えるアルゴリズムね。つまり、ハッシュ>連想配列。
分かったか。
らくだ本3版でもハッシュを連想配列と訳して、連想配列を索引から引くと、
「後生だから、ハッシュを参照してください。」だって。まあ、いいさ。
0756nobodyさん
03/05/09 18:22ID:???foreach (@BBB) {
処理;
}
}
とやりたいのですが、$_はどっちのが参照されるんでしょう?
0757nobodyさん
03/05/09 18:25ID:???どれも本来の言葉の意味とは違う使われ方をしている。
しかし、どれも間違った使い方でも意味は通じる。
正確な言葉を使うのは大事だが、意味を伝える方がもっと大事。
らくだ本でも連想配列って書いてるなら、それでいいじゃないかと思うけどね。
ハッシュってのがどういうアルゴリズムなのかはちょっと気になるが、スレ違いだな。
0758nobodyさん
03/05/09 18:27ID:???my $i = 0;
{
my $i = 1;
{
my $i = 2;
print $i;
}
}
さーて、表示される数字は、いーくつだ?
0760nobodyさん
03/05/09 18:29ID:2QKJbZwPありがとうございます。
-Mを使うことが分かって、
$datfolder = './DAT';
$date = -M $datfolder;
print "Content-type:text/html\n\n";
print $date;
と、しました。出力結果が
0.787731481481481
と出たのですが、これは何を表してるんでしょうか?
「内容が最後に変更されてからの日数」っていうのはわかるんですが、どれが日で、どれが時間なのかがわかりません。
0761nobodyさん
03/05/09 18:30ID:???foreach my $j (@BBB) {
処理;
}
}
わかりにくかったらこうするといい。
0763nobodyさん
03/05/09 18:31ID:???日数だろ。
0.78日。
てか、リンク先の一番上のページの一番下の方まで見たか?
0764nobodyさん
03/05/09 18:42ID:cYWQsRLcフレームを使っていないpage1.phpというページから、送信ボタンで
page2.phpと言うフレームで2分割されたページへ飛びます。
page2.phplはupper.phpとlower.phpに分割されています。
<form method ="POST" action=page2.php>と記述していますが、
これですとフレーム内のupper.phpで値を受け取れません。
どうすれば良いでしょう。
page2.phpからupper.phpにまた値を渡すのかな?
よろしくお願いします。
0768nobodyさん
03/05/09 19:01ID:???よろしい。
では、次の質問どうぞ。
---------------------------------------------------------
いらっしゃーい、Perlのコーディングで困ってる人のスレです。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
0769nobodyさん
03/05/09 19:08ID:???一行目→要素の一番目 という風にしたいです。
0770bloom
03/05/09 19:10ID:X5KsRuJ+0771_
03/05/09 19:11ID:???川o・-・)ノ <先生!こんなのがありました!
http://www.yoshiwara.susukino.com/hankaku/hankaku07.html
http://yoshiwara.susukino.com/hankaku/hankaku08.html
http://www.yoshiwara.susukino.com/hankaku/hankaku10.html
http://yoshiwara.susukino.com/hankaku/hankaku07.html
http://www.yoshiwara.susukino.com/hankaku/hankaku03.html
http://yoshiwara.susukino.com/hankaku/hankaku05.html
http://www.yoshiwara.susukino.com/hankaku/hankaku01.html
http://yoshiwara.susukino.com/hankaku/hankaku06.html
http://www.yoshiwara.susukino.com/hankaku/hankaku04.html
http://www.yamazaki.90.kg/hankaku/hankaku09.html
0772nobodyさん
03/05/09 19:12ID:???split
0775764
03/05/09 19:31ID:cYWQsRLcこの際、このままご慈悲深いPerlスレの皆様におすがりします。
>ページへのジャンプとデータの送信先は無関係。
とのことですが、formのaction=のところのアドレスが
ジャンプ先=送信先では無いのですか?
何卒よろしくお願い申し上げます。
0777760
03/05/09 19:43ID:VvqPULTq最後まで見ました。
stat関数でしたほうがイイということでしょうか?
$datfolder = './dat';
@fileinfo = stat ($datfolder);
print "Content-type:text/html\n\n";
foreach (@fileinfo) {
print "$_<BR>";
}
こうしたところ、[ 9 ]の最終変更時間の値が0になってしまいます。
フォルダは指定できないんでしょうか?
0778nobodyさん
03/05/09 19:44ID:???http://www.w3.org/でも見たら幸せになれるかもね。
0781nobodyさん
03/05/09 21:22ID:???2ちゃんねるは回答者が質問者に答えるのが真のプロジェクトです。
真実を求めるとか、どっちが便利とか、使いやすいとか議論するとろくでもない結果になります。
0783nobodyさん
03/05/09 21:47ID:???0784783
03/05/09 21:50ID:???○'2ch'だけ敬意を払って半角にすた。
まぁ語源はともかく、いまやハッシュはハッシュなんだからそれでいいんじゃない?
0787nobodyさん
03/05/09 23:00ID:???systemだと重そうだし、単純にwhileで回してifする以外に効率がいい方法ないですか?
0788nobodyさん
03/05/09 23:08ID:akCR/KC1readdirってのは、どういう働きなんでしょう?
0789bloom
03/05/09 23:10ID:X5KsRuJ+0790nobodyさん
03/05/09 23:16ID:???コマンドって言うなよ・・・
@dir_value = readdir DIR;
とか
@dir_value = glob("*.*");
readdirぐらいは自分で調べれ
0793nobodyさん
03/05/09 23:46ID:???ファイルハンドルじゃなくディレクトリハンドル
と誰もいないうちに訂正しておこう
|Д´)ノ んじゃ
0794nobodyさん
03/05/09 23:57ID:???0795nobodyさん
03/05/10 00:17ID:hCO3mC8T一番早く検索できる方法って有りますか?
郵便番号から住所を検索したいんだけど、
やっぱり1行ずつ調べるしかないのかな?
0796nobodyさん
03/05/10 00:24ID:???データベース使え。
って言うか、普通のファイルでも工夫次第で検索早くなると思うけどねぇ〜・・・。
一つのファイルに10万行もあるからいけない。
最初の三桁づつのファイルに分けるとか・・・。
いろいろあるだろ。
0800nobodyさん
03/05/10 00:58ID:???指定したディレクトリ及び拡張子から該当するファイル名とファイルサイズを取得したいのですが、
ファイル名取得はうまくいくものの、サイズがすべて0になってしまいます。
どこをどう変えたらサイズ取得できるでしょうか?ご指摘お願いします。
##以下ソース
$wdir="C:/hoge"; #対象となるディレクトリ
$sita=".txt"; #対象となるファイルの拡張子
opendir(DIR, $wdir);
while ($file = readdir(DIR)) {
if ($file =~/$sita$/) {
($fsize) = (stat($file))[7];
printf("%s%3dByte\n", $file, $fsize);
}
}
closedir(DIR);
##以上ソース
0801nobodyさん
03/05/10 01:03ID:???なんじゃ?
0803nobodyさん
03/05/10 01:07ID:???欲しいのがファイルサイズだけなら、stat より
ファイルテスト演算子 -s をオススメする。
$fsize = -s $file;
0805nobodyさん
03/05/10 01:48ID:???ありがとうございます。readdir(DIR)した時点でDIRが作業ディレクトリになると勘違いしてました。
>>803
ファイルテスト演算子…こんな便利なものがあったんだ。
やっぱりstat関数より実行効率いいのかな?ググって勉強してきます。
ありがとうございました。
0806760
03/05/10 02:54ID:UeZ9FyDL0807bloom
03/05/10 03:10ID:9fodVbL50808nobodyさん
03/05/10 04:01ID:ceT3ViFL<input ytpe=text name=par rows=1 size=4>で、4桁の数値を入力して渡します。
パーミッションなので(0775など)
それで、CGIで、&ReadParse(*in)で変数に置き換えます$par
そして、
chmod $par, a.txt
とすると、363とかなっちゃいます。
これは、テキストエリアからは数字はこないので、charとして認識されてるんですかね?
0811nobodyさん
03/05/10 06:46ID:???0812nobodyさん
03/05/10 07:24ID:???別のテーブルに移動させる事って出来ますか?
Aテーブルのレコード取得→Bテーブルに同じものを作成→Aテーブルのを削除
今はそうやってるんですけど…。
0813nobodyさん
03/05/10 07:24ID:???oct($par)
0815nobodyさん
03/05/10 11:38ID:???foreach my $D (@tottano){
if ($D eq $maeno[$C]) { $C++; next; } #両方ともあったら次
$E = 1; $H = 0;
foreach my $G (@maeno){ #他の位置にあるかチェック
if ($G eq $D) { $E = 0; $C = $H; $C++; last; } #他の位置にあったら$Cをその次へ
$H++;
}
if ($E) { $F.= $D; $F.= "\n"; }
}
同じようにソートされた@maenoと@tottanoを比較して、
@tottanoにあって@maenoにない→$Fに追加
@maenoにあって@tottanoにない→何もしない
としたいんですが、上のようにすると
@maenoにあって@tottanoにない時が一つでもある場合、
$Fに@tottanoの内容が全て入ってしまうんです。
上のはどこがいけないのか、根本的に間違っているのか、教えてください。
0816250
03/05/10 12:45ID:???見にくいソースなので自己流の書き方にしてみたけど、検証きぼん・・・
foreach my $key (@tottano){
foreach my $list (@maeno){
if($key eq $list){
undef $key;
last;
}
}
if(!undef $key){
$F = $key . "\n";
}
}
■ このスレッドは過去ログ倉庫に格納されています