Perl 初心者コーナー Part23
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/05/16 11:18ID:zDRBc/j4【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 10
http://pc2.2ch.net/test/read.cgi/php/1048686475/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
CGIに依存しないPerlの話題一般/Part2
http://pc2.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
過去ログやお勧めサイトは >>2-10
0083nobodyさん
03/05/18 00:08ID:???0084nobodyさん
03/05/18 00:10ID:aBq13e5f思ってます。
終点のtell(OUT)以下を削除する方法です。
0085nobodyさん
03/05/18 00:10ID:???@seed = (0 .. 99);
my %seed;
sub init{#初期化
for(0 .. $#seed){
$seed{$_} = $_;
}
}
sub select{#取り出し
my $num = $seed{int(rand(scalar(keys(%seed))))};
delete $seed{$num};
return($num);
}
&init;
$uniq_num = &select; #コレを繰り返しとな・・・
008685
03/05/18 00:12ID:???my %seed;
sub init{#初期化
for(0 .. $#seed){
$seed{$_} = $seed[$_];
}
}
0087nobodyさん
03/05/18 00:13ID:???0091nobodyさん
03/05/18 00:22ID:???http://www.rfs.jp/sitebuilder/perl/05/03.html#open
0094nobodyさん
03/05/18 00:29ID:???自作関数で、引数が不正の場合に、
Perlの文法チェックでエラーを出力させたいのですが、
方法がわかりません・・・
どうすれば文法チェック時に引数のチェックができ、エラーを出せますか?
0095nobodyさん
03/05/18 00:37ID:???@dat0 = @dat1 = ();
foreach(0 .. 999999){ $dat0[$_] = $_; }
foreach(0 .. 999999){ $dat1[$_] = splice(@dat0,rand($#dat0),1); }
ではだめ?
009885
03/05/18 01:05ID:???@seed = (0 .. 10);
sub select{#取り出し
my $key = int(rand(scalar(@seed)));
my $num = $seed[$key];
splice(@seed,$key,1);
return($num);
}
$data = &select;
0099nobodyさん
03/05/18 01:09ID:???なぜ、そんな巨大な配列を作るんだ?
コストがかかってしかたないと思うが・・・
普通にfor文でぶん回せば良いと思うのだが・・・
0100nobodyさん
03/05/18 01:28ID:???0101nobodyさん
03/05/18 01:43ID:wPiZL/S/http://accessplus.jp/staff/in.cgi?id=10645
http://www.39001.com/cgi-bin/cpc/gateway.cgi?id=neat
http://www.emzshop.com/goodstyle/
0102nobodyさん
03/05/18 01:53ID:???my @salts = ( "A".."Z", "a".."z", "0".."9", ".", "/" );
my $salt = $salts[int(rand(64))] . $salts[int(rand(64))];
$crypt = crypt($str, $salt);
こういうルーチンだと、暗号化文字列内に「_」は絶対含まれ
ないですよね?
0103nobodyさん
03/05/18 01:55ID:Qi8mxUK410kbのファイルをopenしてprintしてcloseするのは
どっちが処理に時間がかかるのでしょうか?
0104nobodyさん
03/05/18 01:59ID:???0105nobodyさん
03/05/18 03:23ID:???どんなルーチンかは関係なくcryptの戻り値に「_」が含まれることはない
そもそも、そのルーチンってsaltをランダムにしてるだけじゃないの
0109nobodyさん
03/05/18 07:34ID:K+Hh/k3Wすみません、質問です。
csvファイルの一番上から順に1レコード読み込んで、$idと$keycodeが等しければ
それぞれ変数に代入する、という検索の部分なのですが、$idが奇数、又は偶数だ
と(csvファイルのレコード数が奇数か偶数かによる)検索失敗しまいます。
尚、$data = <IN>;の部分は、手元の本だと$data = $_;になっています。これだと
全く代入されません。
csvファイルに問題は無いと思います。お願いします。
$match = 0;
open IN,"log.csv";
while((<IN>)and($match == 0)){
$data = <IN>;
chop $data;
($keycode) = split(/\,/,$data);
if($keycode == $id){
($keycode,$flg,$mailadd,$name,$title,$comment) = split(/\,/,$data);
$match = 1;
}
}
close IN;
0110nobodyさん
03/05/18 07:40ID:???0111nobodyさん
03/05/18 07:43ID:???0113nobodyさん
03/05/18 08:18ID:???これでどうだ? $id($keycode)は1バイトであるという前提。
ちなみに見つからない場合は$keycodeが未定義になる。
undef $keycode;
open(IN, "log.csv") or die;
while (<IN>) { chomp; /^$id/ and last }
($keycode, $flg, $mailadd, $name, $title, $comment) = split /,/ if $_;
close(IN);
0117nobodyさん
03/05/18 13:06ID:???どんな方法がありますか?
0118nobodyさん
03/05/18 13:24ID:???0120nobodyさん
03/05/18 14:23ID:???0121113
03/05/18 15:56ID:???その通りなんだが、splitを無理矢理1行で書きたかったんでああなった。
実行効率を考えたら、ループの外でやったほうがいいね。
添削サンクス
0122nobodyさん
03/05/18 16:06ID:???$count += ($com =~s/test//g);
このような方法しか思いつきません。
もっとスマートなやり方を教えて頂けないでしょうか?
0125nobodyさん
03/05/18 18:07ID:rnV9NZSQ0127nobodyさん
03/05/18 18:21ID:OtatQ8zkhttp://yahooo.s2.x-beat.com/linkvp/linkvp.html
0128nobodyさん
03/05/18 18:33ID:???http://www.din.or.jp/~ohzaki/regex.htm
http://www5a.biglobe.ne.jp/~n_rieko/perl/8.htm
0130nobodyさん
03/05/18 18:49ID:???置き換えを使わずにできるかと思ってました。
$count += ($com =~/test/g); とか・・・
レスして下さってありがとうございます。
0131nobodyさん
03/05/18 19:25ID:???こんな事してるんですがどうやら$URLが長いと途中でちょん切れるようです。
"11223344556677889900" → "11223344556677889"
解決できますか?
0133109
03/05/18 22:15ID:???>111
$data = <IN>; の部分のことでしょうか?
本では$data = $_;となっていますが、これだと全く代入されません。
自分で書き直しました。
マッチしてるかどうか調べる処理の前に余計に読み込んでいるから
交互に検索失敗・成功してしまうのでしょうか?
>113
ありがとうございます。試してみます。
尚、$keycode、$IDともに2桁以上の場合があります。
0135nobodyさん
03/05/18 23:00ID:???0136nobodyさん
03/05/18 23:07ID:???0137131
03/05/18 23:08ID:???の間違いでした、すみません。
$URLの文字数が59ぐらいまでは大丈夫なんですが、68になるとダメです。
0139nobodyさん
03/05/19 01:05ID:UimoOLmz@data = <FILE>;
unshift(@data,"$year年$mon月$day日(@youbi[$wdy]),$hour時$min分$sec秒\n","$referer\n","$host\n","$ENV{'REMOTE_ADDR'}\n","$ENV{'HTTP_USER_AGENT'}\n\n");
flock(FILE,2);
seek(FILE,0,0);
print(FILE "@data\n");
flock(FILE,8);
close(FILE);
こういうアクセスログをつかってるんですけど、
datファイルは最初の行以外に半角スペースができるのですが、なぜでしょう?
0140動画直リン
03/05/19 01:08ID:IEVyzYan0142nobodyさん
03/05/19 01:12ID:???>print(FILE "@data\n");
""の中でリストを展開すると、リストの各要素が" "(半角スペース)で区切られて
出力されるから。
print(FILE, @data); のようにすれば大丈夫なはず。
0143_
03/05/19 01:12ID:???http://togoshi.ginza.st/mona/mona05.html
http://www.togoshi.ginza.st/mona/
http://www.togoshi.ginza.st/mona/mona03.html
http://togoshi.ginza.st/mona/mona02.html
http://www.togoshi.ginza.st/mona/monaz08.html
http://togoshi.ginza.st/mona/mona06.html
http://www.togoshi.ginza.st/mona/mona10.html
http://togoshi.ginza.st/mona/mona04.html
http://www.togoshi.ginza.st/mona/mona07.html
http://togoshi.ginza.st/mona/mona01.html
http://www.togoshi.ginza.st/mona/mona09.html
0144nobodyさん
03/05/19 01:13ID:UimoOLmzえ?どういうことでしょうか?
0145142
03/05/19 01:13ID:???0146nobodyさん
03/05/19 01:14ID:UimoOLmzできました。ありがとうございました。
0147nobodyさん
03/05/19 10:32ID:/e0GDQuH&HtmlError($errormessage); #$errormessage自体はEUC
sub HtmlError($HtmlErrormessage){
my $HtmlErrormessage = $_[0];
&jcode::convert(*HtmlErrormessage, "sjis");
print $HtmlErrormessage;
exit;
}
#------------------------------------------------------------
が、なぜかEUCでブラウザに出力されてしまいます。
ずーっと見て悩んでたのですが、わかりません。
どこがいけないのでしょうか?
なお、下記はちゃんとSJISで出力されます。(あたりまえですが)
まさか、関数に文字を引き渡すことと、文字コードって関係あるんでしょうか?
(だとしても、ちゃんとprintする直前にsjisに変換してるし・・・)
&jcode::convert(*errormessage, "sjis");
print $errormessage;
0148nobodyさん
03/05/19 11:05ID:???>&jcode::convert(*HtmlErrormessage, "sjis");
レキシカル変数では型グロブは使えない
&jcode::convert(\$HtmlErrormessage, "sjis");
0151nobodyさん
03/05/19 11:48ID:???0152nobodyさん
03/05/19 12:18ID:???配布されてるCGIがそう書いてるのを真似してるのかもね。
で、ライブラリの書式が変わったのは理解できても、型グロブのほうは理解できないので
そのまんま。とりあえず動くからいいや、みたいな。
0155nobodyさん
03/05/19 12:26ID:???同じ条件式を何回もいろんなところで使っているのですが、
こういう条件式自体を変数みたいに?1箇所にまとめることって可能なのでしょうか?
0157nobodyさん
03/05/19 12:41ID:???$hoge = "doredore";
if (&matomere) {print "Ok!\n";}
sub matomere { return '$hoge =~ /ahodoredorebaka/' }
0158nobodyさん
03/05/19 12:59ID:???$hoge = "doredore";
if (&matomere) {print "Ok!\n";}
sub matomere {if ($hoge =~ /ahodoredorebaka/) {return 1;} else {return 0; }}
#if ($hoge =~ /ahodoredorebaka/) {print "OK!\n";}
0159nobodyさん
03/05/19 13:03ID:???日本語氏名 <[email protected]>
ってなっていることがありますよね。
ここからメールアドレス部([email protected])のみを正確に取り出したいのです。
この処理を行ってくれるperlモジュールをご存じの方いませんか?
0160nobodyさん
03/05/19 13:06ID:???$mailaddr=~s/(.+)</$1/;
0161nobodyさん
03/05/19 13:11ID:???$mailaddr=~s/.+<(.+?>/$1/;
0162nobodyさん
03/05/19 14:55ID:???なるべくロングに取得
0164nobodyさん
03/05/19 15:16ID:???our $hoge = "doredore";
if (eval matomere()) {print "Ok!\n";}
sub matomere { return '$hoge =~ /ahodoredorebaka/' }
(気持ち悪い)
>>158は冗長。
sub matomere {$hoge =~ /ahodoredorebaka/}
これでいい。
でも、こういう関数は一部でしか使わないだろうから、ローカル関数化する。
local *matomare = sub { $hoge =~ /ahodoredorebaka/ }
こうしましょう。
0165nobodyさん
03/05/19 15:17ID:???local *matomare = sub { $hoge =~ /ahodoredorebaka/ };
0166nobodyさん
03/05/19 15:26ID:???多分、、質問はそういう意味ではなくて、、むむむ、クロージャーか。
my $expr = sub {
my $hoge = shift;
return $hoge =~ /hogehoge/;
}
print 'TRUE' if $expr->('hogehogehoge');
こうしたいのか?
0167159
03/05/19 15:37ID:???ありがとうございます。でも機能しません。("<"が一つ取れるだけ)
>>161
ありがとうございます。でもシンタックスエラーです。
>>162
ありがとうございます。動きました。
0168nobodyさん
03/05/19 16:34ID:???超遅レスで申し訳ないが。。
その文字がエンコードされて送信されてくるかどうかは
実はクライアント(ブラウザ)に依存する罠・・・
昔携帯向けのサイトを作ったときハマッタ。
i-modeではエンコードされないのにJ-skyではエンコードされて来て
気が付くのに2晩かかったよ。
全てのクエリーストリングをデコードくぐらせるのが吉。。。
0170Perl/CGI
03/05/19 18:04ID:Ob4BWAW/本とかで調べてもあってるはずなのになんでおかしいのでしょうか。
open(INIFILE,"+<$fileini");
close(INIFILE);
ローカルでこの行が入ってるファイルをテストしてみたら、
Unterminated <> operator
というエラーがでてとまってしまうんです。
この行を含まなかったらぜんぜん問題なしなんですけど、この行で全部とまってしまってるんです。
このエラーはいったいどう対処したらいいのか、そしてどう改善すればいいのか教えていただけないでしょうか?
0172nobodyさん
03/05/19 20:06ID:???それはファイルを読み書き両方ができるようにオープンしているようだが、
ファイルハンドルから察するに読み込むだけでいいんではないか?
なら、
open ( IN, $file );
open ( IN, "<$file" );
のどちらかで済む話じゃないか?
まあ、フリーのスクリプトか自作かは知らんが、前後の状況がわからんからこれ以上はいえないが。
0174nobodyさん
03/05/19 20:26ID:???INFILEじゃなくてINIFILEだから書き換えたりもするんじゃない?
0175nobodyさん
03/05/19 20:30ID:???ttp://www.google.com/search?as_q=Perl+Unterminated+%3C%3E+operator+&num=100&hl=ja&ie=UTF-8&oe=UTF-8&btnG=Google+%E6%A4%9C%E7%B4%A2&as_epq=&as_oq=&as_eq=&lr=lang_ja&as_ft=i&as_filetype=&as_qdr=all&as_occt=any&as_dt=i&as_sitesearch=
その前の文で"の閉じ忘れとかないか?
0176nobodyさん
03/05/19 20:58ID:???$IPAD = $ENV{'REMOTE_ADDR'}
などとして得たアドレスを2進数に変換したいのです、ご指導お願いします。
例えばアクセスした人のアドレスが
202.213.37.74だった場合、
11001010110101010010010101001010
という風に変換させたいのですが、perlでスッキリかくには
どのようにすればいいのでしょうか?
お手すきな方、宜しくご指導お願いします。
0178nobodyさん
03/05/19 21:45ID:???参考に
http://www.mikeneko.ne.jp/~lab/perl/numerical_transform/
0179nobodyさん
03/05/19 21:54ID:???$bits = join('', map { unpack('B*', chr) } split(/\./, $IPAD) );
0180176
03/05/19 22:53ID:???ご指導ありがとうございます。
>>178のページを参考に自分でやって成功したのですが、
>>179さんの方がスッキリしてるので、こちらを使わせていただきます。
助かりました、ありがとうございます。
0181nobodyさん
03/05/20 05:07ID:???データは全てサーバーに保存させています。
で、ちょっと効率の良い処理が思いつかないので質問に来ました。
まず、
●武器などのデータはテキストでデータ保存した方が良いでしょうか?
●それとも、perl記述内で武器の効果や、強さ、金額などを直接定義したほうが良いでしょうか?
また、武器によって攻撃力が変わるわけですが、
●起動ごとに攻撃力を算出させた方が良いでしょうか?
●それとも算出された攻撃力はそのままテキストデータに保存してしまった方が良いでしょうか?
俺としては前者のほうが、バグが出にくく、管理もしやすいのですが負荷が多くかかりそうな気がします。
俺は、プログラム経験が浅いのでこの辺の判断がつきません。汗
経験の長い皆様にアドバイスを頂きたくてやってきました。
よろしくお願いします。
0182nobodyさん
03/05/20 05:32ID:???自分で思考錯誤して頑張ります。
■ このスレッドは過去ログ倉庫に格納されています