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
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:???自分で思考錯誤して頑張ります。
0184nobodyさん
03/05/20 06:01ID:???使うと変数の局所化が出来るようなのでつが
局所化するとパフォ-マンス的にはどうなんでそ?
あと、一般的に配付されてるスクリプトで
use strict;
使ってる物を見た事が無いのですが普通は使わない物なんでつか?
0185nobodyさん
03/05/20 06:10ID:???このスレでいいだろ?アルゴリズムの問題なんだから。
CGIだからどーだって事にはならない。GUIだろうとほとんど同じ。
>>184
取り敢えず、厳格な書きかたが出来る。
局所化は、strictとは直接関係ない。
myだと、呼び出されるまで展開されないから軽い。
myはどのパッケージの名前空間にも属さない。
>>181
処理の規模にもよるが、データはテキストのほうが望ましい。
装備している武器などはそのまま保存すると共に、
攻撃力などは武器が変更された時にいっしょに変えてしまえば?
少々めんどうか?この方法は。
まぁ、どんな処理なのか分からんからなんとも言えん。
0186nobodyさん
03/05/20 06:11ID:???> 使うと変数の局所化が出来るようなのでつが
できません。
> 使ってる物を見た事が無いのですが
strictモジュールはコードの検査を行うものなので、リリース時にはコメントアウトするか消す人が多いだろうね。
無 駄 だ か ら
0187nobodyさん
03/05/20 06:38ID:???個人が持つ物じゃなくて全体に存在してるアイテムって言うのか、そうゆうのは記述内で定義するのが正解だよ。
もし、一つ一つ個性のある、複雑な効果のあるアイテムとかなら絶対に記述内で定義する必要がある。
たんに「値段」と「攻撃力」みたいな感じのデータのみだったら、テキストでデータを書き出しても良いかもしれない。
0188nobodyさん
03/05/20 08:52ID:???ネトゲ板のCGIブラウザゲースレの奴か?
>●武器などのデータはテキストでデータ保存した方が良いでしょうか?
>●それとも、perl記述内で武器の効果や、強さ、金額などを直接定義したほうが良いでしょうか?
数による。
10や20なら中に記述した方がいいだろうが、1000や2000ならテキストデータにした方がいい。
数が多い場合は、テキストを分割する事で検索速度を速めよう。
例えば武器なら、1000の全武器>とある武器データ、と検索させるより、200の武器データ>とある武器データ、
と検索させる方が鯖に優しいのはわかるな?
>●起動ごとに攻撃力を算出させた方が良いでしょうか?
>●それとも算出された攻撃力はそのままテキストデータに保存してしまった方が良いでしょうか?
計算の度合いによる。
足し算の1回2回なら計算させた方がいい。
逆に剰余算や平方根を多用するようなら、保存させた方がいいかもしれない。
これらも計算の頻度やその処理の重さによる。
攻撃力を外部に保存させる場合、ローカルに攻撃力再計算用のスクリプトを作っておくといい。
バグが出た時に、データを一時DLしてから再計算してULし直せるように。
そうすればメンテ性も上がる。
つたないながらもCGIゲー経験者として。
0189181
03/05/20 09:52ID:???>>188さん
>ネトゲ板のCGIブラウザゲースレの奴か?
違うと思います。俺はム板とこの板にしか出現しません。
>1000の全武器>とある武器データ、と検索させるより、200の武器データ>とある武器データ、
>と検索させる方が鯖に優しいのはわかるな?
槍なら槍、剣なら剣と、種類ごとにデータを分けてしまえと言う事ですね?
>足し算の1回2回なら計算させた方がいい。
はい、単純な足し算です。
ですから。起動ごとに計算させる事にします。
そのほうがバグや計算ミスもなく簡単に管理出来そうです。
>攻撃力を外部に保存させる場合、ローカルに攻撃力再計算用のスクリプトを作っておくといい。
>バグが出た時に、データを一時DLしてから再計算してULし直せるように。
ちょっと意味が分からなかったのですがこれは公開後、利用者のデータにバグが出た場合、
こちら側がデータを手動で直しやすいように。と言う意味でしょうか?
もう一つ質問なのですが、
>>187さんが細かいデータをテキストで保存するのはキツイとご指摘下さいました。
確かに「アイテム」や「魔法」などは一つ一つ違った働きをして、仕様出来る場所も違います。
武器や防具の場合はけっこう単純なのですが…。
>>188さんなら、これらをどこで定義しますでしょうか?
やはりテキストに書きますか?
ちなみに、終わった話(処理)ですがモンスターデータは全てテキストに書き出しました。
一行一モンスターの形式で書いたのですが、一行の文字数が300文字以上になって超見にくくなってしまいました。
0190nobodyさん
03/05/20 10:06ID:???>違うと思います。俺はム板とこの板にしか出現しません。
違うのか、スマン。
ttp://game3.2ch.net/test/read.cgi/netgame/1031450575/115-
ちょうどここで似たような話題があったので勘違いした。
気を悪くしたなら許してくれ。
>こちら側がデータを手動で直しやすいように。と言う意味でしょうか?
大まかに言えばその通りだな。
ただ、本当に手動で100人以上のデータを修正していたら日が暮れるだろ?
それを自動でやってくれるスクリプトをローカル用に組んでおくと後で楽だよと。
>>>188さんなら、これらをどこで定義しますでしょうか?
>やはりテキストに書きますか?
繰り返しになるが、数による。
1000や2000のデータを内部で定義するとメモリを無駄に消費するからな。
俺ならアイテムや魔法のデータをテキストから読み出して、キャラデータと一緒に保存する。
アイテムが1000あっても、キャラクターが持つアイテムはおそらく50もないだろう。
そうすれば普段は50しか読み出しを行なわずに済む。
1000のアイテムを検索するのは、アイテム購入とか、新規でアイテム入手する時だけになるわけだ。
敵からアイテムを拾う場合は、敵データにアイテムデータも一緒に入れる。
あんたのやり方の場合はそれは向かないかもしれないけどね。
結局、システムごとにやり方なんか違うものだと思うぞ。
毎回必ず1000のアイテムを読み込む必要のあるシステムなら、それこそ内部に記述した方がいい。
0191181
03/05/20 10:40ID:???なるほど!
大変参考になりました。
>アイテムが1000あっても、キャラクターが持つアイテムはおそらく50もないだろう。
まさにその通りです。
そこで思いついたのですがアイテムや魔法のIDや名前などの簡単に部分はテキストで保存し、
効果は以下のように定義しようと思いました。
#アイテム使用時のルーチン
sub item_001{
my ($item) = q['アイテム使用処理'];
eval "$item";
}
非常に大雑把な感じですが、処理はこんなイメージで進めていこうと思います。
大変参考になる話をありがとうございました。
0192nobodyさん
03/05/20 10:41ID:???データベースの方が鯖に優しくはないが安全だよなあ。
0193nobodyさん
03/05/20 10:43ID:???0194181
03/05/20 10:51ID:???個人のデータは個人で使っているので、他者と書き込みがかぶる事はありません。
それと、処理全体には一応実行ロックをかけ、
さらに同一人物は5秒以内の連打アクセスが出来ないようほどこしてあります。
(テスト中はジャマなので解除してますけど)
0195nobodyさん
03/05/20 13:17ID:???0196nobodyさん
03/05/20 14:21ID:???入力したIDがあらかじめ用意されたIDと一致してるかどうかで
表示する画面を分岐させたいのですが
現状は、
IDをテキストファイルに
10000
10001
10002
・
・
という形で入れておいて
ループでIDファイルの一行と入力したIDが一致するか否かで
処理しています
処理が遅いので別の手段をとりたいのですが、
何かいい方法はありませんでしょうか?
IDは8桁のランダムな数字列で、
テストはID5000件と10000件でやりました
0197nobodyさん
03/05/20 14:26ID:???ID"だけ"で良いのならば。
ID名でファイルを作成し、ファイルが存在するか否かで処理。
何万件も処理するならDBを利用すべきでしょう。
0198181
03/05/20 14:27ID:???0199nobodyさん
03/05/20 14:29ID:???>>しかも197さんのが効率良いし。
0200nobodyさん
03/05/20 14:32ID:wO+tQvftPerlによる普通の掲示板でログの先頭行のタイトルだけを
取るにはどういう構文にすればいいんでしょうか?
0203nobodyさん
03/05/20 14:43ID:???まぁいいや。
HTMLの話です。それ。がんばってHTMLしてください。
※これ以上質問を繰り返さない事。板違いです。
0204nobodyさん
03/05/20 14:43ID:???でも5000とかファイルが生成されるのは
何かひっかかるものが…
ちょっとテストしてみてDB使うかどうか考えます
8個ファイル作るというのもシンプルでいいかもしれないですね
これもやってみますです
早いレスどうもです
0206nobodyさん
03/05/20 14:46ID:???先頭行だけ取る時は
<ファイルハンドル>
って感じで取得すると一行だけ取れるよ。
0207198
03/05/20 14:50ID:???ファイル8個って意味分からん数字だった。汗
今日は大ボケ連続です。ここら辺でボケてるの全部俺です。
10個にしよう。10個。
一番左の桁が[0-9]で10個。
桁数とファイル数はいっしょにしたらダメだこりゃ。ごめんなさい。
0208bloom
03/05/20 15:08ID:vZIU7+LM0209nobodyさん
03/05/20 15:23ID:???困ってます。でも、なんもこの関数自体には、問題ない・・・ですよね?
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:???$in{'mailbody'} =~ s/<id>/$tmpid/ig;
だとちゃんと置換されるのに、、
$in{'mailbody'} =~ s/<id>/$id[$i]/ig;
だと、
$id[0]の値に置換されてしまいます。
これは、どのように改善すればいいのでしょうか?
まだまだ、変数に対する理解が不十分なのでその辺だとは思うのですが、
調べてもわかりませんでした。
0211nobodyさん
03/05/20 18:34ID:???よくわかりませんが、修飾子にeを加えてみてはいかがでしょう?
(適当な発言です)
ええと、質問にまいりました。
検索しても出てこなかったのですが、指定したサブルーチンが存在するかどうか確かめる方法はありますか?
存在しないルーチンに飛ぶとエラーになってしまうので、存在するかどうか確かめてから飛びたいのです。
(こちらが指定したサブルーチン名は変数のため、目視では解決できません)
0212nobodyさん
03/05/20 18:47ID:???しまいます。処理的には問題なくできてるんですが、気になります。
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);
0213bloom
03/05/20 19:08ID:vZIU7+LM0215Perl/CGI
03/05/20 20:05ID:nlGr4tqOフォームで入力したデータをそのまま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/CGI
03/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:???0219Perl/CGI
03/05/20 20:17ID:nlGr4tqO一応$fileiniのなかは
$access="http://www.……";(URLは省略させていただきました。)
に、最初っからしています。
0220nobodyさん
03/05/20 20:24ID:???httpでファイル指定はできません。
0221Perl/CGI
03/05/20 20:32ID:nlGr4tqOいや、これはリンクです。
リンク先のアドレスです。
0222nobodyさん
03/05/20 20:35ID:???じゃあ、
print $fileini;
としたら何が表示されるんだよ。
0223Perl/CGI
03/05/20 20:57ID:nlGr4tqOCGIで読み出してそのまま使えるようにしてあるので
$access="http://www.……";
というふうにしてます。
0224nobodyさん
03/05/20 21:00ID:???つまりお前さんは
open(INIFILE,"+<$access="http://www.……"; ");
こうなる事を期待してるのか?
俺が聞いてるのは、「$fileiniで指定された先のファイルの中身」ではなくて、
「$fileiniの中身」なんだが日本語わかる?
0225動画直リン
03/05/20 21:08ID:vZIU7+LM0226nobodyさん
03/05/20 21:15ID:ITOFryED今、アクセス解析つかっているんですが、
ログファイルには
日時<>リファ<>ホスト<>IP<>エージェント
日時<>リファ<>ホスト<>IP<>エージェント
日時<>リファ<>ホスト<>IP<>エージェント
・
・
・
・
ってなってるんですが、こういう風に複数行ある場合は、読み出して一覧を出力したいんですが・・
具体的に
------------------------------←水平線
アクセス時 : 日時
リファラー : リファ
ホスト名 : ホスト
IPアドレス : IP
ユーザーエージェント : エージェント
------------------------------
アクセス時 : 日時
リファラー : リファ
ホスト名 : ホスト
IPアドレス : IP
ユーザーエージェント : エージェント
------------------------------
みたいにしたいんですが・・・・
一行なら<>で区切ってスライスできるそうなんですが、複数行となるとサッパリです。。
何かいい方法ないでしょうか?
0227nobodyさん
03/05/20 21:19ID:???> 一行なら<>で区切ってスライスできるそうなんですが、複数行となるとサッパリです。。
> 何かいい方法ないでしょうか?
一行ずつ処理すればよいのではないかい?
真相は分からんが。
0228nobodyさん
03/05/20 21:21ID:ITOFryED一行ずつ処理ですか・・・
えと、読み込んでforeachにまわすとか?ですか?
すんません、リファレンス1冊買って勉強します。。
ネットでは情報が少ないですよね
0230nobodyさん
03/05/20 21:54ID:OOsiMZA+$idcrypt = substr(crypt($idnum * $idnum, substr($date, 8, 2)), -8);
って2ch互換ID?
とテストしてみる
0231nobodyさん
03/05/20 22:05ID:???0232nobodyさん
03/05/20 22:26ID:???複数行って意味が分からないが、普通に
my $format = <<'EOM';
------------------------------
アクセス時 : %s
リファラー : %s
ホスト名 : %s
IPアドレス : %s
ユーザーエージェント : %s
EOM
while (<LOG>) {
print sprintf($format, split /<>/);
}
とかじゃ駄目なの?
0233210
03/05/20 22:47ID:???手元の本みたら、
変数はスカラ変数と配列変数しか使えませんとかいてありますた。
ということは、一番スマートなやりかたは、>>210とするしかないのでしょうか?
0234139
03/05/20 23:14ID:iNE6jQJj@data = <FILE>;
で、ファイル読み込む(txtやcgiソース)
そして、編集できるように、
テキストエリアに出力
print "<textarea>@data</textarea>\n";
↑けっこう略
すると、@dataが""で囲まれている?ので、2行目以降の先頭に空白ができます。
この場合はどうすればいいですか?
0235nobodyさん
03/05/20 23:26ID:???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:???open(FILE, $name);
print "<textarea>";
while ( <FILE> ) {
print;
}
print "</textarea>";
0237139
03/05/21 00:00ID:DxtaiKT1おぉ。。できました。ありがとうございます
0238nobodyさん
03/05/21 00:04ID:???0239nobodyさん
03/05/21 00:04ID:???普通に
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
0242139
03/05/21 01:10ID:DxtaiKT1それためになります。
ありがとうございます
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:???10 : if ($::ENV{'REQUEST_METHOD'} eq "POST") {
52 : if ($::form{'key'} eq '')
こうしてみたらどうよ?
0245243
03/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 と関数が指摘されているようですが、
これらの関数を使用する前に初期化が必要なんでしょうか?
0247nobodyさん
03/05/21 01:18ID:???> open(MAIL,"| $MyPathSendmail -t");
を、
open(MAIL,">&STDOUT");
にしてひとまず標準出力に吐き出して確認してみたら?
あと「sendmail -t」を調べてみる。
0251243
03/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'};
}
続く
0252243
03/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:???気にたった点。
>(%form) = &get_form('sjis');
(%form)の()を外した方がよさそう。
>local($charset) = @_;
特別な意味がない限りmyを使う事を推奨されてたと思う。
myの方が早いし。
>return (%FORM);
これも()を外した方がよさそう。
・・・力になれなかったかも・・・
スマソ
0254nobodyさん
03/05/21 01:48ID:???0255nobodyさん
03/05/21 01:52ID:???結論から言えば、何も問題ない。
-w を付けて尚かつ一切の警告を受けたくないということなら
疲れるだけだから止めた方がいいよ。
ちなみに -w をつけると
・一度しか使われない識別子
・値をセットせずに参照されるスカラー変数
・サブルーチンの再定義
・未定義のファイルハンドルの参照
・読み出し専用でオープンしたファイルハンドルへの書き込み
・数値以外を数値として扱った場合
・配列をスカラーとして扱った場合
・深さが100以上のサブルーチンの再帰呼び出し
・その他いろいろ
に該当する時、警告されます。
変数を初期化なしで使うなんてperlでは当たり前のことでも
イチャモンつけて欲しいなら別だけど、普通はデバッグ時に
意図しないで上記のことをしていないか診断したいときにだけ使います。
0256243
03/05/21 01:55ID:???ご指摘ありがとうございます。
なるほど、これから気を付けて行きたいと思います。
こちらの環境はRedhat8.0/Perl5.8なのですが、
perlのバージョンは同じようですし。うむぅ。
実行出来ない訳ではないので、黙殺しても良い部分だとは思うのですが。
どうもありがとうございました。
0257nobodyさん
03/05/21 01:56ID:???その警告の行以外に原因があるようだな
$charsetにlocalをつけておきながら$form_dataや@key_valueを
そのまま使っているし、全体を見ないとなんとも言えないな
0258243
03/05/21 02:05ID:???な、なるほど(汗
perlを始めたばかりで、初めのうちから正しい書き方を
身につけようとか思っていたのですが、どうやらそれが
良いことばかりでは無いようですね。
素直に黙殺します。
これからは-wはデバッグ時のみ実行する事にします。
ご指摘いただきました方々、色々とありがとうございました。
>>257
おっしゃる通りです。
警告文が該当している箇所を急いで抜き出したものでしたので。
変数とかの扱いをちゃんと書いて、最終的にもう一度確認して行きたいと思います。
0259nobodyさん
03/05/21 02:08ID:???0260243
03/05/21 02:24ID:???抜き出したスクリプトでも(勿論、元スクリプトでも)
&get_form('sjis');
とサブルーチンに値を渡しているので、平気だと思います。
実際に元の方の出力はsjisになってましたし。
■ このスレッドは過去ログ倉庫に格納されています