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

Perl 初心者コーナー Part23

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/05/16 11:18ID:zDRBc/j4
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

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
0161nobodyさん03/05/19 13:11ID:???
うまく行かない場合はうまく行かないと言え。
$mailaddr=~s/.+<(.+?>/$1/;
0162nobodyさん03/05/19 14:55ID:???
($address) = $str =~ /<(.+)>/;
なるべくロングに取得
0163nobodyさん03/05/19 15:03ID:???
>>132
そのような方法があるとは思いつきませんでした・・・
ありがとうございます!
0164nobodyさん03/05/19 15:16ID:???
>>157の方法だと、

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');

こうしたいのか?
016715903/05/19 15:37ID:???
>>160
ありがとうございます。でも機能しません。("<"が一つ取れるだけ)

>>161
ありがとうございます。でもシンタックスエラーです。

>>162
ありがとうございます。動きました。

0168nobodyさん03/05/19 16:34ID:???
>>75

超遅レスで申し訳ないが。。
その文字がエンコードされて送信されてくるかどうかは
実はクライアント(ブラウザ)に依存する罠・・・

昔携帯向けのサイトを作ったときハマッタ。
i-modeではエンコードされないのにJ-skyではエンコードされて来て
気が付くのに2晩かかったよ。

全てのクエリーストリングをデコードくぐらせるのが吉。。。
016913103/05/19 16:36ID:???
>>137はやはり無理なのでしょうか。
0170Perl/CGI03/05/19 18:04ID:Ob4BWAW/
CGIで、ファイルに書き込みしたいのに、どうしてもこのopen行が原因でエラーになります。
本とかで調べてもあってるはずなのになんでおかしいのでしょうか。

open(INIFILE,"+<$fileini");
close(INIFILE);
ローカルでこの行が入ってるファイルをテストしてみたら、
Unterminated <> operator
というエラーがでてとまってしまうんです。
この行を含まなかったらぜんぜん問題なしなんですけど、この行で全部とまってしまってるんです。
このエラーはいったいどう対処したらいいのか、そしてどう改善すればいいのか教えていただけないでしょうか?
0171nobodyさん03/05/19 19:58ID:???
>>169
おまえな、それが一体どこがPerlの質問なんだよ。
いい加減気付けよ。
0172nobodyさん03/05/19 20:06ID:???
>>170
それはファイルを読み書き両方ができるようにオープンしているようだが、
ファイルハンドルから察するに読み込むだけでいいんではないか?

なら、
open ( IN, $file );
open ( IN, "<$file" );
のどちらかで済む話じゃないか?

まあ、フリーのスクリプトか自作かは知らんが、前後の状況がわからんからこれ以上はいえないが。
017313103/05/19 20:24ID:???
>>171
すいませんでした・・・
0174nobodyさん03/05/19 20:26ID:???
>172
INFILEじゃなくてINIFILEだから書き換えたりもするんじゃない?
0175nobodyさん03/05/19 20:30ID:???
>170
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でスッキリかくには
どのようにすればいいのでしょうか?

お手すきな方、宜しくご指導お願いします。

0177nobodyさん03/05/19 21:36ID:???
>>176
$num="202";
$bits = unpack "B8", chr($num); # $bits=11001010
0178nobodyさん03/05/19 21:45ID:???
>>176
参考に
http://www.mikeneko.ne.jp/~lab/perl/numerical_transform/
0179nobodyさん03/05/19 21:54ID:???
>>176
$bits = join('', map { unpack('B*', chr) } split(/\./, $IPAD) );
018017603/05/19 22:53ID:???
>>177-179
ご指導ありがとうございます。

>>178のページを参考に自分でやって成功したのですが、
>>179さんの方がスッキリしてるので、こちらを使わせていただきます。
助かりました、ありがとうございます。
0181nobodyさん03/05/20 05:07ID:???
現在perlでRPG作ってます。CGIで相手端末は携帯です。
データは全てサーバーに保存させています。

で、ちょっと効率の良い処理が思いつかないので質問に来ました。
まず、
●武器などのデータはテキストでデータ保存した方が良いでしょうか?
●それとも、perl記述内で武器の効果や、強さ、金額などを直接定義したほうが良いでしょうか?

また、武器によって攻撃力が変わるわけですが、
●起動ごとに攻撃力を算出させた方が良いでしょうか?
●それとも算出された攻撃力はそのままテキストデータに保存してしまった方が良いでしょうか?
俺としては前者のほうが、バグが出にくく、管理もしやすいのですが負荷が多くかかりそうな気がします。

俺は、プログラム経験が浅いのでこの辺の判断がつきません。汗
経験の長い皆様にアドバイスを頂きたくてやってきました。
よろしくお願いします。
0182nobodyさん03/05/20 05:32ID:???
う〜ん、やっぱこんな一部的なコト書いても誰も答えられないよね。汗
自分で思考錯誤して頑張ります。
0183nobodyさん03/05/20 05:57ID:???
>>181-182
つーか、思いっきりスレ違い。

ここはPerlスレだ。CGIの質問は他でやれ。
0184nobodyさん03/05/20 06:01ID:???
use strict;

使うと変数の局所化が出来るようなのでつが
局所化するとパフォ-マンス的にはどうなんでそ?

あと、一般的に配付されてるスクリプトで
use strict;
使ってる物を見た事が無いのですが普通は使わない物なんでつか?
0185nobodyさん03/05/20 06:10ID:???
>>183
このスレでいいだろ?アルゴリズムの問題なんだから。
CGIだからどーだって事にはならない。GUIだろうとほとんど同じ。

>>184
取り敢えず、厳格な書きかたが出来る。
局所化は、strictとは直接関係ない。
myだと、呼び出されるまで展開されないから軽い。
myはどのパッケージの名前空間にも属さない。

>>181
処理の規模にもよるが、データはテキストのほうが望ましい。
装備している武器などはそのまま保存すると共に、
攻撃力などは武器が変更された時にいっしょに変えてしまえば?
少々めんどうか?この方法は。
まぁ、どんな処理なのか分からんからなんとも言えん。
0186nobodyさん03/05/20 06:11ID:???
>>184
> 使うと変数の局所化が出来るようなのでつが

できません。

> 使ってる物を見た事が無いのですが

strictモジュールはコードの検査を行うものなので、リリース時にはコメントアウトするか消す人が多いだろうね。
無 駄 だ か ら
0187nobodyさん03/05/20 06:38ID:???
>>183
個人が持つ物じゃなくて全体に存在してるアイテムって言うのか、そうゆうのは記述内で定義するのが正解だよ。
もし、一つ一つ個性のある、複雑な効果のあるアイテムとかなら絶対に記述内で定義する必要がある。
たんに「値段」と「攻撃力」みたいな感じのデータのみだったら、テキストでデータを書き出しても良いかもしれない。
0188nobodyさん03/05/20 08:52ID:???
>181
ネトゲ板のCGIブラウザゲースレの奴か?

>●武器などのデータはテキストでデータ保存した方が良いでしょうか?
>●それとも、perl記述内で武器の効果や、強さ、金額などを直接定義したほうが良いでしょうか?
数による。
10や20なら中に記述した方がいいだろうが、1000や2000ならテキストデータにした方がいい。
数が多い場合は、テキストを分割する事で検索速度を速めよう。
例えば武器なら、1000の全武器>とある武器データ、と検索させるより、200の武器データ>とある武器データ、
と検索させる方が鯖に優しいのはわかるな?

>●起動ごとに攻撃力を算出させた方が良いでしょうか?
>●それとも算出された攻撃力はそのままテキストデータに保存してしまった方が良いでしょうか?
計算の度合いによる。
足し算の1回2回なら計算させた方がいい。
逆に剰余算や平方根を多用するようなら、保存させた方がいいかもしれない。
これらも計算の頻度やその処理の重さによる。
攻撃力を外部に保存させる場合、ローカルに攻撃力再計算用のスクリプトを作っておくといい。
バグが出た時に、データを一時DLしてから再計算してULし直せるように。
そうすればメンテ性も上がる。

つたないながらもCGIゲー経験者として。
018918103/05/20 09:52ID:???
思ったよりたくさん返事が…。ありがとうございます。

>>188さん
>ネトゲ板のCGIブラウザゲースレの奴か?
違うと思います。俺はム板とこの板にしか出現しません。

>1000の全武器>とある武器データ、と検索させるより、200の武器データ>とある武器データ、
>と検索させる方が鯖に優しいのはわかるな?
槍なら槍、剣なら剣と、種類ごとにデータを分けてしまえと言う事ですね?

>足し算の1回2回なら計算させた方がいい。
はい、単純な足し算です。
ですから。起動ごとに計算させる事にします。
そのほうがバグや計算ミスもなく簡単に管理出来そうです。

>攻撃力を外部に保存させる場合、ローカルに攻撃力再計算用のスクリプトを作っておくといい。
>バグが出た時に、データを一時DLしてから再計算してULし直せるように。
ちょっと意味が分からなかったのですがこれは公開後、利用者のデータにバグが出た場合、
こちら側がデータを手動で直しやすいように。と言う意味でしょうか?

もう一つ質問なのですが、
>>187さんが細かいデータをテキストで保存するのはキツイとご指摘下さいました。
確かに「アイテム」や「魔法」などは一つ一つ違った働きをして、仕様出来る場所も違います。
武器や防具の場合はけっこう単純なのですが…。
>>188さんなら、これらをどこで定義しますでしょうか?
やはりテキストに書きますか?

ちなみに、終わった話(処理)ですがモンスターデータは全てテキストに書き出しました。
一行一モンスターの形式で書いたのですが、一行の文字数が300文字以上になって超見にくくなってしまいました。
0190nobodyさん03/05/20 10:06ID:???
>189
>違うと思います。俺はム板とこの板にしか出現しません。
違うのか、スマン。
ttp://game3.2ch.net/test/read.cgi/netgame/1031450575/115-
ちょうどここで似たような話題があったので勘違いした。
気を悪くしたなら許してくれ。

>こちら側がデータを手動で直しやすいように。と言う意味でしょうか?
大まかに言えばその通りだな。
ただ、本当に手動で100人以上のデータを修正していたら日が暮れるだろ?
それを自動でやってくれるスクリプトをローカル用に組んでおくと後で楽だよと。

>>>188さんなら、これらをどこで定義しますでしょうか?
>やはりテキストに書きますか?
繰り返しになるが、数による。
1000や2000のデータを内部で定義するとメモリを無駄に消費するからな。
俺ならアイテムや魔法のデータをテキストから読み出して、キャラデータと一緒に保存する。
アイテムが1000あっても、キャラクターが持つアイテムはおそらく50もないだろう。
そうすれば普段は50しか読み出しを行なわずに済む。
1000のアイテムを検索するのは、アイテム購入とか、新規でアイテム入手する時だけになるわけだ。
敵からアイテムを拾う場合は、敵データにアイテムデータも一緒に入れる。
あんたのやり方の場合はそれは向かないかもしれないけどね。
結局、システムごとにやり方なんか違うものだと思うぞ。
毎回必ず1000のアイテムを読み込む必要のあるシステムなら、それこそ内部に記述した方がいい。
019118103/05/20 10:40ID:???
>>190
なるほど!
大変参考になりました。
>アイテムが1000あっても、キャラクターが持つアイテムはおそらく50もないだろう。
まさにその通りです。

そこで思いついたのですがアイテムや魔法のIDや名前などの簡単に部分はテキストで保存し、
効果は以下のように定義しようと思いました。

#アイテム使用時のルーチン
sub item_001{
my ($item) = q['アイテム使用処理'];
eval "$item";
}
非常に大雑把な感じですが、処理はこんなイメージで進めていこうと思います。
大変参考になる話をありがとうございました。
0192nobodyさん03/05/20 10:41ID:???
ロックの問題があるから、どうにもテキストファイルを使うのは躊躇してしまう。
データベースの方が鯖に優しくはないが安全だよなあ。
0193nobodyさん03/05/20 10:43ID:???
楽したいだけだろ
019418103/05/20 10:51ID:???
全体のデータ(モンスター集)などは、書きかえられる事がないので安全です。
個人のデータは個人で使っているので、他者と書き込みがかぶる事はありません。

それと、処理全体には一応実行ロックをかけ、
さらに同一人物は5秒以内の連打アクセスが出来ないようほどこしてあります。
(テスト中はジャマなので解除してますけど)
0195nobodyさん03/05/20 13:17ID:???
ネットゲームの意味が全くねーな。
0196nobodyさん03/05/20 14:21ID:???
フォームからIDを入れさせて、
入力したIDがあらかじめ用意されたIDと一致してるかどうかで
表示する画面を分岐させたいのですが

現状は、
IDをテキストファイルに
10000
10001
10002
 ・
 ・
という形で入れておいて
ループでIDファイルの一行と入力したIDが一致するか否かで
処理しています
処理が遅いので別の手段をとりたいのですが、
何かいい方法はありませんでしょうか?

IDは8桁のランダムな数字列で、
テストはID5000件と10000件でやりました
0197nobodyさん03/05/20 14:26ID:???
>>196
ID"だけ"で良いのならば。
ID名でファイルを作成し、ファイルが存在するか否かで処理。
何万件も処理するならDBを利用すべきでしょう。
019818103/05/20 14:27ID:???
8桁でしたら、8個のファイルに分けてしまったらどうでしょう?
0199nobodyさん03/05/20 14:29ID:???
名前消すの忘れてた。
>>しかも197さんのが効率良いし。
0200nobodyさん03/05/20 14:32ID:wO+tQvft
すみません、初心者の質問答えてやってください。
Perlによる普通の掲示板でログの先頭行のタイトルだけを
取るにはどういう構文にすればいいんでしょうか?
0201nobodyさん03/05/20 14:34ID:???
>>200
マルチは許せんな。初心者だとしてもだ。
0202nobodyさん03/05/20 14:38ID:???
>>201
向こうが板違いだと気づいたんでこちらに書き込んだんです。
向こうには謝っておきました。
マルチになってすみません;
0203nobodyさん03/05/20 14:43ID:???
この板のどっかのスレでも見たような気がしかも数回・・・。

まぁいいや。
HTMLの話です。それ。がんばってHTMLしてください。
※これ以上質問を繰り返さない事。板違いです。
0204nobodyさん03/05/20 14:43ID:???
なるほど、ファイルで処理するというのは思いつきませんでした
でも5000とかファイルが生成されるのは
何かひっかかるものが…
ちょっとテストしてみてDB使うかどうか考えます

8個ファイル作るというのもシンプルでいいかもしれないですね
これもやってみますです

早いレスどうもです
0205204=19603/05/20 14:44ID:???
引用NOもレス番も忘れた…

>>204
>>197->>198宛です
0206nobodyさん03/05/20 14:46ID:???
あ、間違えたごめん。HTMLの話じゃなかったね。
先頭行だけ取る時は
<ファイルハンドル>
って感じで取得すると一行だけ取れるよ。
020719803/05/20 14:50ID:???
またやらかした。汗
ファイル8個って意味分からん数字だった。汗
今日は大ボケ連続です。ここら辺でボケてるの全部俺です。

10個にしよう。10個。
一番左の桁が[0-9]で10個。
桁数とファイル数はいっしょにしたらダメだこりゃ。ごめんなさい。
0208bloom03/05/20 15:08ID:vZIU7+LM
http://homepage.mac.com/ayaya16/
0209nobodyさん03/05/20 15:23ID:???
後述の関数で、どうも、Toにはメールが送られてるのですが、Ccにはメールが送られないもので、
困ってます。でも、なんもこの関数自体には、問題ない・・・ですよね?
3時間いろいろやってもわからなかったもので・・・。
(もちろん、$MyCcや$MyBccへと変数は引き渡してますつもりなんですが・・・)
sub send_email{
my ($MyPathSendmail,$MyFrom,$MyTo,$MyCc, $MyBcc, $MyError, $MySubject,$MyMailbody) = @_;
#件名を、JIS&MIME-Base64化
&jcode::convert(\$MySubject,'jis');
$Subject = &mimeencode($MySubject);
#メール本文を7bitJISに変換する
&jcode::convert(\$MyMailbody,'jis');
open(MAIL,"| $MyPathSendmail -t");
print MAIL "From: $MyFrom\n";
print MAIL "To: $MyTo\n";
print MAIL "Cc: $MyCc\n" if ($MyCc);
print MAIL "Bcc: $MyBcc\n" if ($MyBcc);

print MAIL "Errors-To: $MyError\n" if ($MyError);
print MAIL "Return-Path: $MyError\n" if ($MyError);
print MAIL "Sender: $MyError\n" if ($MyError);

print MAIL "Subject: $MySubject\n";
print MAIL "Content-Transfer-Encoding: 7bit\n";
print MAIL "Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n\n";
print MAIL $MyMailbody;
close MAIL;
}
0210nobodyさん03/05/20 16:15ID:???
$tmpid = $id[$i];
$in{'mailbody'} =~ s/<id>/$tmpid/ig;

だとちゃんと置換されるのに、、

$in{'mailbody'} =~ s/<id>/$id[$i]/ig;
だと、

$id[0]の値に置換されてしまいます。
これは、どのように改善すればいいのでしょうか?

まだまだ、変数に対する理解が不十分なのでその辺だとは思うのですが、
調べてもわかりませんでした。
0211nobodyさん03/05/20 18:34ID:???
>>210
よくわかりませんが、修飾子にeを加えてみてはいかがでしょう?
(適当な発言です)


ええと、質問にまいりました。
検索しても出てこなかったのですが、指定したサブルーチンが存在するかどうか確かめる方法はありますか?
存在しないルーチンに飛ぶとエラーになってしまうので、存在するかどうか確かめてから飛びたいのです。
(こちらが指定したサブルーチン名は変数のため、目視では解決できません)
0212nobodyさん03/05/20 18:47ID:???
flock関数を使うと、変数$!に "Bad file descriptor" がセットされて
しまいます。処理的には問題なくできてるんですが、気になります。
flockの直後にこのメッセージがセットされているようです。
以下に環境とコードを書いておきます。

OS: FreeBSD 4.6-2
Perl: version 5.005_03 built for i386-freebsd

open(LOCK, $file) or &error("open error $file", 1);
flock(LOCK, 5) or &error("flock failed", 1);
$! and print "$!\n";
seek(LOCK, 0, 0);
while (<LOCK>){
    print $_;
}
close(LOCK);
0213bloom03/05/20 19:08ID:vZIU7+LM
http://homepage.mac.com/ayaya16/
0214nobodyさん03/05/20 19:46ID:???
>>211
シンボルテーブルを見るか eval でトラップ
0215Perl/CGI03/05/20 20:05ID:nlGr4tqO
>>170です
フォームで入力したデータをそのままCGIで読めるようにファイルに書き込もうと思ってるんです。
これがそのサブルーチン全部です。
sub formset {
# フォームデータ取得
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
} else {
$query="$ENV{'QUERY_STRING'};
}
# フォームデータ復元
foreach $pair (split(/&/, $query)) {
($key, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%[0-9a-fA-F][0-9a-fA-F]/chr(hex($1))/eg;
$foem{$key} = $value;
}

# ファイル出力
open(INIFILE,"+<$fileini");
#flock(INIFILE, 2);

seek(INIFILE,0,0);
foreach $key (sort keys %form) {
print INIFILE "\$$key=\"$form{$key}\"\;\n";
}

# ファイルを閉じてロックを解除する
close(INIFILE);
#flock(INIFILE, 8);
}
0216Perl/CGI03/05/20 20:06ID:nlGr4tqO
問題の部分は

# ファイル出力
open(INIFILE,"+<$fileini");

# ファイルをロックする
#flock(INIFILE, 2);

seek(INIFILE,0,0);
foreach $key (sort keys %form) {
print INIFILE "\$$key=\"$form{$key}\"\;\n";
}

# ファイルを閉じてロックを解除する
close(INIFILE);
#flock(INIFILE, 8);

何ですけど、ご存知のようにopen行で
Unterminated <> operator
エラーがでてとまります。
ご指導、指摘お願いします。
解決策も教えてください。
0217nobodyさん03/05/20 20:07ID:???
$fileiniの中身は?
021821003/05/20 20:11ID:???
>>211
>よくわかりませんが、修飾子にeを加えてみてはいかがでしょう?
結果は同じでした(泣)
0219Perl/CGI03/05/20 20:17ID:nlGr4tqO
>>217
一応$fileiniのなかは
$access="http://www.……";(URLは省略させていただきました。)
に、最初っからしています。
0220nobodyさん03/05/20 20:24ID:???
>219
httpでファイル指定はできません。
0221Perl/CGI03/05/20 20:32ID:nlGr4tqO
>220
いや、これはリンクです。
リンク先のアドレスです。
0222nobodyさん03/05/20 20:35ID:???
>221
じゃあ、
print $fileini;
としたら何が表示されるんだよ。
0223Perl/CGI03/05/20 20:57ID:nlGr4tqO
>222
CGIで読み出してそのまま使えるようにしてあるので
$access="http://www.……";
というふうにしてます。
0224nobodyさん03/05/20 21:00ID:???
>223
つまりお前さんは
open(INIFILE,"+<$access="http://www.……"; ");
こうなる事を期待してるのか?

俺が聞いてるのは、「$fileiniで指定された先のファイルの中身」ではなくて、
「$fileiniの中身」なんだが日本語わかる?
0225動画直リン03/05/20 21:08ID:vZIU7+LM
http://homepage.mac.com/hitomi18/
0226nobodyさん03/05/20 21:15ID:ITOFryED
ちょいと質問なんだが、
今、アクセス解析つかっているんですが、
ログファイルには
日時<>リファ<>ホスト<>IP<>エージェント
日時<>リファ<>ホスト<>IP<>エージェント
日時<>リファ<>ホスト<>IP<>エージェント
          ・
          ・
          ・
          ・

ってなってるんですが、こういう風に複数行ある場合は、読み出して一覧を出力したいんですが・・
具体的に

------------------------------←水平線
アクセス時 : 日時
リファラー  : リファ
ホスト名   : ホスト
IPアドレス  : IP
ユーザーエージェント : エージェント
------------------------------

アクセス時 : 日時
リファラー  : リファ
ホスト名   : ホスト
IPアドレス  : IP
ユーザーエージェント : エージェント
------------------------------

みたいにしたいんですが・・・・
一行なら<>で区切ってスライスできるそうなんですが、複数行となるとサッパリです。。
何かいい方法ないでしょうか?
0227nobodyさん03/05/20 21:19ID:???
>>226
> 一行なら<>で区切ってスライスできるそうなんですが、複数行となるとサッパリです。。
> 何かいい方法ないでしょうか?
一行ずつ処理すればよいのではないかい?
真相は分からんが。
0228nobodyさん03/05/20 21:21ID:ITOFryED
>>227
一行ずつ処理ですか・・・
えと、読み込んでforeachにまわすとか?ですか?
すんません、リファレンス1冊買って勉強します。。
ネットでは情報が少ないですよね
0229nobodyさん 03/05/20 21:45ID:???
>>211
無名のサブルーチンを作って、undefかどうかってのは駄目なんだろうな・・・
0230nobodyさん03/05/20 21:54ID:OOsiMZA+
$idnum = substr($REMOTE_ADDR, 8);
$idcrypt = substr(crypt($idnum * $idnum, substr($date, 8, 2)), -8);
って2ch互換ID?
とテストしてみる
0231nobodyさん03/05/20 22:05ID:???
IDって統一性はないし、いらないなと思いました。
0232nobodyさん03/05/20 22:26ID:???
>>226
複数行って意味が分からないが、普通に

my $format = <<'EOM';
------------------------------
アクセス時 : %s
リファラー  : %s
ホスト名   : %s
IPアドレス  : %s
ユーザーエージェント : %s
EOM

while (<LOG>) {
print sprintf($format, split /<>/);
}

とかじゃ駄目なの?
023321003/05/20 22:47ID:???
>>210
手元の本みたら、
変数はスカラ変数と配列変数しか使えませんとかいてありますた。

ということは、一番スマートなやりかたは、>>210とするしかないのでしょうか?
023413903/05/20 23:14ID:iNE6jQJj
open(FILE, $name);
@data = <FILE>;
で、ファイル読み込む(txtやcgiソース)
そして、編集できるように、
テキストエリアに出力
print "<textarea>@data</textarea>\n";
↑けっこう略

すると、@dataが""で囲まれている?ので、2行目以降の先頭に空白ができます。
この場合はどうすればいいですか?
0235nobodyさん03/05/20 23:26ID:???
文字列を暗号化しようと思って、いろいろ探してたら、VisualBasicで
1バイトを20ヘキサ引いて、複合化時は20ヘキサ足すってのが
あったのだけど、これをPerlで出来ますか?

VBは、こうなってた
For i = 1 To Len(strBase)
  If LenByte(Mid$(strBase, i, 1)) = 1 Then ''1バイト
Put #iFNo, N, Asc(Mid$(strBase, i, 1)) - &H20
Else ''2バイト
Put #iFNo, N, &HFF
N = N + 1
strTemp = Hex$(Asc(Mid$(strBase, i, 1)))
Put #iFNo, N, CByte("&H" & left$(strTemp, 2)) - &H20
N = N + 1
Put #iFNo, N, CByte("&H" & right$(strTemp, 2)) - &H20
End If
N = N + 1
Next

0236nobodyさん03/05/20 23:32ID:???
>>234
open(FILE, $name);
print "<textarea>";
while ( <FILE> ) {
print;
}
print "</textarea>";

023713903/05/21 00:00ID:DxtaiKT1
>>236
おぉ。。できました。ありがとうございます
0238nobodyさん03/05/21 00:04ID:???
初々しくて良い
0239nobodyさん03/05/21 00:04ID:???
>>234
普通に
print "<textarea>", @data, "</textarea>\n";

または
$" = '';
print "<textarea>@data</textarea>\n";

特殊変数 $" の値を変更することで、ダブルクォート文字列内で
配列を展開するときのセパレーター(要素間に挟み込まれる文字
デフォルトは半角スペース)を好きな文字に変更できる。
覚えておいて損はないよ。
0240_03/05/21 00:05ID:???
( ´Д`)/< 先生!!こんなのが有りますた。
http://togoshi.ginza.st/2ch/2ch05.html
http://www.togoshi.ginza.st/2ch/
http://www.togoshi.ginza.st/2ch/2ch03.html
http://togoshi.ginza.st/2ch/2ch02.html
http://www.togoshi.ginza.st/2ch/2ch08.html
http://togoshi.ginza.st/2ch/2ch06.html
http://www.togoshi.ginza.st/2ch/2ch10.html
http://togoshi.ginza.st/2ch/2ch04.html
http://www.togoshi.ginza.st/2ch/2ch07.html
http://togoshi.ginza.st/2ch/2ch01.html
http://www.togoshi.ginza.st/2ch/2ch09.html
0241nobodyさん03/05/21 00:54ID:???
>>209
レスがないってことは、この関数の部分はとくに問題ないってことなんでしょうか?
024213903/05/21 01:10ID:DxtaiKT1
>>239
それためになります。
ありがとうございます
0243nobodyさん03/05/21 01:12ID:???
欲しい情報を見つけることが出来なかったので、
ご存じの方がいましたら教えていただきたいのですが。

perlスクリプト中のperl呼び出し時に起動オプション[-w]を付けて書いています。
そうしても処理結果自体は欲しい結果が得られるのですが、
警告文として、以下のものが出力されます。

警告文
Use of uninitialized value in string eq at test.cgi line 10.
Use of uninitialized value in string eq at test.cgi line 52.

該当スクリプト記述
10 : if ($ENV{'REQUEST_METHOD'} eq "POST") {
52 : if ($form{'key'} eq '')

http://www.att.or.jp/perl/man/perldiag.1.html
ここの情報で未定義値を初期化しないで使用しているという
原因までは解ったのですが、if文のeqに対してどう初期化を
行えば良いのか、解決策を探すことができませんでした。

この問題の解決方法をどなかたご教授下さい。
0244nobodyさん03/05/21 01:14ID:???
>>243
10 : if ($::ENV{'REQUEST_METHOD'} eq "POST") {
52 : if ($::form{'key'} eq '')

こうしてみたらどうよ?
024524303/05/21 01:16ID:???
追記
警告文には他にも以下のものがありました。
Use of uninitialized value in split at ./test.cgi line 15.
Use of uninitialized value in join or string at ./test.cgi line 103.

split とか join と関数が指摘されているようですが、
これらの関数を使用する前に初期化が必要なんでしょうか?
0246nobodyさん03/05/21 01:18ID:???
>>245
面倒くさい。
できるだけまとめて、ソース晒す事できないのか?
0247nobodyさん03/05/21 01:18ID:???
>>241
> open(MAIL,"| $MyPathSendmail -t");
を、
open(MAIL,">&STDOUT");
にしてひとまず標準出力に吐き出して確認してみたら?
あと「sendmail -t」を調べてみる。
024824303/05/21 01:20ID:???
>>244
ご指摘の通りに変更してみましたが、結果変わらずでした。
警告文のあるeqではなく、そこで扱っている変数に問題があるんでしょうか?
024924303/05/21 01:21ID:???
>>246
すみません。部分抜き出して、試せるソースを用意してみます。
0250nobodyさん03/05/21 01:22ID:???
>>248
ちなみに、-w付けなかったら動くのか?
025124303/05/21 01:33ID:???
部分抜きだしで、こんな感じです。
この状態だけでも警告文は同じく出ました。
よろしくお願いします。

>>250
-wを付けても結果は同くじ得られるのですが、
警告文が出ている以上、何かしらスクリプトの
書き方が間違っているものだと思いまして、
その原因を突き止めておきたいのです。

#!/usr/bin/perl -w

(%form) = &get_form('sjis');

if ($::form{'key'} eq '') { print 'A key is not found.'; }

sub get_form {
local($charset) = @_;
if ($charset eq '') { $charset = 'euc'; }
if ($::ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $form_data, $ENV{'CONTENT_LENGTH'});
} else {
$form_data = $ENV{'QUERY_STRING'};
}
続く
025224303/05/21 01:34ID:???
改行数で怒られたので分割ですみません。

続き
(@key_value) = split(/\&/, $form_data);
foreach (@key_value) {
($key, $value) = split(/=/, $_);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
&jcode::convert(\$value, $charset);
$FORM{$key} = $value;
}
return (%FORM);
}
0253nobodyさん03/05/21 01:46ID:???
>>251-252

気にたった点。
  >(%form) = &get_form('sjis');
  (%form)の()を外した方がよさそう。

  >local($charset) = @_;
  特別な意味がない限りmyを使う事を推奨されてたと思う。
  myの方が早いし。

  >return (%FORM);
  これも()を外した方がよさそう。


・・・力になれなかったかも・・・
スマソ



0254nobodyさん03/05/21 01:48ID:???
あ、ちなみに、上記ソースで俺の環境(Win2k、Perl5.8)では、文法エラーも何も出なかった。
0255nobodyさん03/05/21 01:52ID:???
>>243
結論から言えば、何も問題ない。
-w を付けて尚かつ一切の警告を受けたくないということなら
疲れるだけだから止めた方がいいよ。

ちなみに -w をつけると

・一度しか使われない識別子
・値をセットせずに参照されるスカラー変数
・サブルーチンの再定義
・未定義のファイルハンドルの参照
・読み出し専用でオープンしたファイルハンドルへの書き込み
・数値以外を数値として扱った場合
・配列をスカラーとして扱った場合
・深さが100以上のサブルーチンの再帰呼び出し
・その他いろいろ

に該当する時、警告されます。
変数を初期化なしで使うなんてperlでは当たり前のことでも
イチャモンつけて欲しいなら別だけど、普通はデバッグ時に
意図しないで上記のことをしていないか診断したいときにだけ使います。
025624303/05/21 01:55ID:???
>>253
ご指摘ありがとうございます。
なるほど、これから気を付けて行きたいと思います。

こちらの環境はRedhat8.0/Perl5.8なのですが、
perlのバージョンは同じようですし。うむぅ。

実行出来ない訳ではないので、黙殺しても良い部分だとは思うのですが。

どうもありがとうございました。
0257nobodyさん03/05/21 01:56ID:???
>>251-252
その警告の行以外に原因があるようだな

$charsetにlocalをつけておきながら$form_dataや@key_valueを
そのまま使っているし、全体を見ないとなんとも言えないな
025824303/05/21 02:05ID:???
>>255
な、なるほど(汗
perlを始めたばかりで、初めのうちから正しい書き方を
身につけようとか思っていたのですが、どうやらそれが
良いことばかりでは無いようですね。

素直に黙殺します。

これからは-wはデバッグ時のみ実行する事にします。

ご指摘いただきました方々、色々とありがとうございました。

>>257
おっしゃる通りです。
警告文が該当している箇所を急いで抜き出したものでしたので。
変数とかの扱いをちゃんと書いて、最終的にもう一度確認して行きたいと思います。

0259nobodyさん 03/05/21 02:08ID:???
$charset自体は指定してるの?
026024303/05/21 02:24ID:???
>>259
抜き出したスクリプトでも(勿論、元スクリプトでも)
&get_form('sjis');
とサブルーチンに値を渡しているので、平気だと思います。
実際に元の方の出力はsjisになってましたし。
■ このスレッドは過去ログ倉庫に格納されています