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
0672nobodyさん
03/05/08 12:38ID:???0674nobodyさん
03/05/08 12:49ID:???行末と言っているが、改行を削除し忘れてたりしてないか?
0675nobodyさん
03/05/08 12:50ID:???$line = $_;
$line =~ s/(.+)$//;
print "$line\n";
0677nobodyさん
03/05/08 13:03ID:???では、なぜ、s/(.+)$//;はまっちするんでしょうか。
>>674
chompやchopもやりましたし、文字コードもsjisとeucで
試しましたが、だめです。
>>675
>>673に挙げたテストデータでやってみれば分かりますが、
これでは、マッチしません。それに、うまくいったとしても
(.+)では、最初の括弧からマッチしてしまいます。
>>675
すべて削除してやってます。
「ローカル」って?CGIじゃないです。
0678nobodyさん
03/05/08 13:07ID:???s/(.*)(.*?)\s.?$/$1/;
print;
}
__DATA__
木立(こだち)のなかに(夏目弱石)
山の上の芋粥(いもがゆ)(芥川蛇の介)
0679nobodyさん
03/05/08 13:15ID:???私の環境ではsjisにしても、eucにしてもだめです。
$ perl test1.pl
木立(こだち)のなかに(夏目弱石)
山の上の芋粥(いもがゆ)(芥川蛇の介)
$ perl test1.pl |nkf -s
木立(こだち)のなかに(夏目弱石)
山の上の芋粥(いもがゆ)(芥川蛇の介)
なぜでしょうか。
0682nobodyさん
03/05/08 13:36ID:???>>675では、
木立
山の上の芋粥
となるでしょう。
これがあなたの期待なのですね。求められているのは、
木立(こだち)のなかに
山の上の芋粥(いもがゆ)
ですよ。
0684nobodyさん
03/05/08 13:50ID:???もう逝っちゃったかな?
jcode::tr(\$_, '()', '()');
s/\([^\(\)]+\)\n$/\n/;
jcode::tr(\$_, '()', '()');
print;
0685nobodyさん
03/05/08 14:05ID:???私の環境ではダメでしたか。
っていうか、その「私の環境」を書けよ・・・
最低、OSは何で、Perlのバージョンはいくつくらいは書けるだろ・・・
俺は>>678のソースで正常に動いた。
>>679の環境がおかしいんじゃねーのか?
0686nobodyさん
03/05/08 14:35ID:???ありがとうです。全角括弧を半角括弧に変えるのならエディタでもできる
のですが、全部Perlでやりたいと。
>>685
私の環境は、cygwin+perl,v5.6.1 built for cygwin-multiです。
>>678のソースは、動くことは動きますが何度やっても求めるものが
出てきません。
0687nobodyさん
03/05/08 15:15ID:???ニコラ・テスラのパクりだろ。( ゚Д゚)
http://plaza16.mbn.or.jp/~satchel/
0688nobodyさん
03/05/08 17:33ID:???0689nobodyさん
03/05/08 19:18ID:???Berryという画像巡回のやつばかりで面白くないんで
Berryからのアクセスを弾く方法を探しています
なんかいい方法ないでしょうか?
imgboard.cgi使っています
0690nobodyさん
03/05/08 19:23ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
0692nobodyさん
03/05/08 21:05ID:???こちとら負荷かけないようにまったりアクセスしてるんだが、
それでも禁止するならしやがれ、というスタンスですな
0693nobodyさん
03/05/08 21:33ID:???0694nobodyさん
03/05/08 21:39ID:???0695nobodyさん
03/05/08 21:41ID:BuFtD7dz0697nobodyさん
03/05/08 22:18ID:???0698nobodyさん
03/05/08 22:52ID:???if(opendir(DIR,"./DAT"))
$dir = @dir = <DIR>;
closedir(DIR);
}else{
print("opendir error");
}
@dirにはファイルが配列で
$dirにはその個数が入ると思うけど・・・
>>695
perlにもgrobあったのか 今知ったわ
こっちのほうがよさそうね
$dir = @dir = glob("./DAT/*");
0699nobodyさん
03/05/08 22:53ID:???0700698
03/05/08 22:56ID:???.と..が入るから
$dirから2引いた数がファイル数ね。
0701nobodyさん
03/05/08 23:03ID:w+g/ULrK前から思ってたのですが、
「Perl」と「URL」
それぞれ何と読むのが正確ですか?
0702nobodyさん
03/05/08 23:08ID:???0705nobodyさん
03/05/08 23:29ID:TaEzP3Hcもう少しでDIがURLだったな
0706nobodyさん
03/05/08 23:46ID:???perlのソートを使おうとしているんですが、微妙に意味が分からない事になりました。
sort {$a <=> $b} @aaa;
数字を並べる時、この書きかたが一般的だと思うのですが、
$aと$bってなんでしょう。
「イツのまに、なにが代入されたのでしょうか?」←これが質問1。
で、実際のソートは、返ってくる数字「-1」「0」「1」の三種類によってsortが返すリストの順番だと思ったのですが、
「それは正解ですか?」←質問2
もし、正解ならば「-1」「0」「1」の三種類が発生する形式ならば可能ですか?
それとも、必ず「$a」「$b」を使うような形式にする必要がありますか?←質問3
詰まる所、$aと$bの中身がよく分からないので、sort自体がよく分からない物になってしまってます。
m(__)m
0707nobodyさん
03/05/09 00:01ID:FPjkEDjh0708nobodyさん
03/05/09 00:02ID:???そうなってるからとしか説明しようないだろうな。
$aと$bは単純に比較する物
本当は関数を別に書いて、そこに登場する
0709Dream ☆
03/05/09 00:04ID:???そうなってるからとしか説明しようないだろうな。
$aと$bは単純に比較する物
本当は関数を別に書いて、そこに登場しる
0710706
03/05/09 00:25ID:???う〜ん。
回答ありがたいのですが、サッパリ分からないです…汗。
>>706の三つの質問の回答を待つと同時に、もう一つ質問させてもらいます。
とあるサイトで調べた所、
>このサブルーチンはソートすべきリスト中の要素2個を渡され、
>何回も繰り返し呼び出され、完全にソートされるまで繰り返す
と、上記のようにかいてありました。
sort {ルーチン} @リスト;
これは「@リスト」が並び替えて返ってくる値であり、
その順番を決めるのが「ルーチン」の部分だと思っています。
で、上に「ソートすべきリスト中の要素2個を渡され」
と書いてありますが、これが$aと$bだとにらんでいます。
この時、$aと$bの内容を自動ではなく、任意で決めることはできないのでしょうか?
いや、任意で決めたいと思っているのですが、そんな必要はないのかな?
0711nobodyさん
03/05/09 00:28ID:???何を言いたいかよくわからんな。
>この時、$aと$bの内容を自動ではなく、任意で決めることはできないのでしょうか?
sort {$aaa[$a] <=> $aaa[$b]} (0 .. $#aaa);
こういう事か?
0713nobodyさん
03/05/09 00:32ID:???の前に$a,$bを使ってるからほかの変数使いたいって事か?
0714nobodyさん
03/05/09 00:37ID:WPk5KKvTで、$ENV{'TZ'}="JST-9"をやると日本時間で計算してくれたので安心してたのですが、
ある日プログラムに“use Time::local”を宣言したら、どうも$ENV{'TZ'}が無効に
されてしまうようで、localtimeで返される値がまた米国時間になってしまいました。
プログラム中のそこかしこでTZにJST-9やGMT-9、Japanを指示してもダメです。
これは、こういうものなのでしょうか。それとも鯖ごとの設定によるものなのでしょうか。
なにか対策はありますか?
gmtimeにシコシコと9時間分の数字を足すしかないのでしょうか…。
0715nobodyさん
03/05/09 00:40ID:???http://www.parkcity.ne.jp/~chaichan/src/perl07.htm
0716706
03/05/09 00:41ID:???今から、書く事を分かりやすいようキッチリと頭の中で整理して、
ゆっくり書きたいと思いますのでちょっと時間がたってから書きこみ直します。
御迷惑かけてすみません。
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+■ このスレッドは過去ログ倉庫に格納されています