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
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になってましたし。
0263nobodyさん
03/05/21 05:21ID:???use warnings (-w)は別にいつも付けてる必要はないけど、
use strictでコードする癖をつけないと後で泣くよ。
0264nobodyさん
03/05/21 07:17ID:???0265nobodyさん
03/05/21 09:11ID:???ポピュラーな方法だぞ?
コーディングする、の方が言葉として変。
0266nobodyさん
03/05/21 09:38ID:???灰皿する。
机する。
本する。
ま、どーでもいいけど。
0271nobodyさん
03/05/21 11:21ID:???perlスレはもうやめたのか。
0272nobodyさん
03/05/21 11:29ID:???0273nobodyさん
03/05/21 12:47ID:???0274nobodyさん
03/05/21 15:39ID:???>$in{'mailbody'} =~ s/<id>/$id[$i]/ig;
>だと、
>$id[0]の値に置換されてしまいます。
正規表現では[ ]は意味を持ってしまうのでエスケープしないと
$in{'mailbody'} =~ s/<id>/$id\[$i\]/ig;
0276nobodyさん
03/05/21 16:50ID:???0277Perl/CGI
03/05/21 17:01ID:XtYsWXu+すいません、そういうことでしたか。
$fileiniが指定してるのは
初期設定ファイルのことで、admin.iniの形式にしてます。
んでそのファイルの中身は以前書いたものになってます。
レス遅くなってすいません。
0278動画直リン
03/05/21 17:08ID:JZ9K0e/X0279ど初心者
03/05/21 17:08ID:???私は すぐわかるPerl => 初めてのPerl以降詰まってます。
0280nobodyさん
03/05/21 17:46ID:???名前は忘れたけど、地球儀みたいな絵が書いてあるPerl/CGI入門書から入った。
すげー分かりやすく、それだけで、簡単な掲示板が作れるようになった。
↓
「CGIのための 実践入門Perl」
黄色い鍵の絵が書いてある本。
これも、かなり分かりやすい本だった。
俺のバイブル。
↓
「新Perlの国へようこそ」
サルが温泉つかってる絵がかかれてる。
上の2冊読んでたら、理解できるはず。
書いてる事は、ちょっと難しいが、リファレンスやらオブジェクトやら勉強できる。
↓
「ラクダ本」
全部なんて読んでない(w
この関数の詳しい動きが知りたい!
そんな時に開く本として置いてある。
最強の本だけど、いきなりすべてを知ろうとして読むと、
挫折するっぽい。
と、現在中級者のちょっと上レベルの俺が言いたい事は、
「Perlで作るCGI入門 基礎編」 この本は、読みにくく俺にとっては無駄遣いしたとしか思えない
・・・と。
0282210=(269)
03/05/21 17:58ID:???>>$in{'mailbody'} =~ s/<id>/$id[$i]/ig;
>>だと、
>>$id[0]の値に置換されてしまいます。
>正規表現では[ ]は意味を持ってしまうのでエスケープしないと
やっても、結果同じなんですけど・・・・
0283nobodyさん
03/05/21 17:59ID:zxc8lPDx地味でへたれっぽいけどすごくちゃんとした内容。
ラクダよりも、ちょっとしたリファレンスとしては便利。
0285ど初心者
03/05/21 18:10ID:???0286nobodyさん
03/05/21 18:31ID:???>>283のはすごく良い。
頭で覚えるより>>283のを一冊脇に置いて、
実際に簡単なスクリプト書いてみるのが一番覚えやすい。
こうしたいけどどうしたら良いんだろう?とか
「疑問→解決」が一番吸収しやすいしね。
0287nobodyさん
03/05/21 18:52ID:???「Effective Perl」
いい本だ
0288nobodyさん
03/05/21 19:21ID:???【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
0289ど初心者
03/05/21 20:57ID:???ありがとう御座います。凄く参考になりました。
これをきっかけにパールマスター(パールをマスターした人)を目指してみます。
有難う御座いました。
0290nobodyさん
03/05/21 20:59ID:???ひたすら既存のスクリプト改造で育ったかな。
本はポケットPerlリファレンス買った。
0293nobodyさん
03/05/21 21:09ID:???画面遷移図をUMLのステートチャート図で書いてるのって変ですかね?
0294nobodyさん
03/05/21 21:12ID:???俺はとほほさんとこのをプリントアウトして使ってる。
ちょっと調べたい時とかは、らくだ本みたいに大きくもないし便利。
0296295
03/05/21 21:56ID:???0297nobodyさん
03/05/21 21:58ID:???0299nobodyさん
03/05/21 23:03ID:???20ヘキサ引いて、複合化時は20ヘキサ足すってのを作ったんだけど
完全にデコードされないんです。最後の方が化けたり・・・どこが変か教えてくださいです。
CGIっぽいけど許してね
#!/usr/local/bin/perl
use CGI;
$q = new CGI;
print $q->header('text/html; charset=euc-jp');
if( $q->param ){
$n = $q->param('name');
print "en=",&encode($n);
print "<BR>";
print "de=",&decode($n);
}
print $q->start_form, $q->textfield(-name=>'name'), $q->submit, $q->end_form;
sub endecode{
my($name)=shift;
my($diff)=shift;
my(@w)=();
my(@w2)=();
@w = split(//,$name);
for(@w){
push(@w2,sprintf( "%c",ord($_)+$diff));
}
join("",@w2);
}
0300nobodyさん
03/05/21 23:04ID:???sub encode {
my($name)=shift;
&endecode($name,hex(0x20));
}
sub decode {
my($name)=shift;
&endecode($name,-hex(0x20));
}
0301nobodyさん
03/05/21 23:20ID:???飛ぶときと飛ばないときがある。なんで?そんなことってあるの?
調べたところ一部のサーバーではLocation禁止というところも
あるみたいだが、うちは飛ぶ。
でも飛ばないときもある…
0302nobodyさん
03/05/21 23:26ID:???PerlというよりCGIの質問だな。
ブラウザごとに飛ぶ飛ばないを調査して、どういう条件で飛ばなくなるかを
自分なりに調査した方がいいと思うぞ。
あとは出力されているヘッダがどうなってるかを調べてみるとか。
どちらにせよスレ違いだから、調査の上で適切なスレへ行きな。
0303nobodyさん
03/05/21 23:30ID:???調査はした。で、同じ条件・同じ方法で飛ばしてみようとしても
飛ぶときと飛ばないときがある…ますますわからない。
ありがとん。
0305山崎渉
03/05/22 01:55ID:???0306210=233=269
03/05/22 05:04ID:???それでOKていうのは、
$tmpid = $id[$i];
$in{'mailbody'} =~ s/<id>/$tmpid/ig;
でOKってことですか?
というか、それしか、やりようがないということなのでしょうか?
なんかキモイスクリプトだなーと思ったもので。
0307nobodyさん
03/05/22 06:23ID:???人に聞くより自分でアレコレ試した方が早いことも多いよ?
270じゃないが、
$in{'mailbody'} =~ s/<id>/$id[$i]/ig;
で、文法的にも何も問題ない。
置換前に
print "\$i=$i \$id[\$i]=$id[$i]\n";
と一行書いて、変数に何が入ってるか確認。
0308nobodyさん
03/05/22 10:15ID:???新種の山崎登場?
とりあえずage
0309210
03/05/22 10:43ID:???それやってみたら、ちゃんと出力されてるんですよね・・・
なのに、変換すると、以下の文章(メールですが)で、$id[0]、$name[0]、$email[$i]
が出力されてます。
おっしゃるとおり、もっと自分でアレコレ試してみたいんですが、
しかし、これ以上どこを試せばいいのか・・・?
なんか手がかりというかポインタでいいので、教えていただけませんか?
for ($i=0; $i<=$#email; $i++) {
#TODO:ここ動かないのでペンド中
#本文への差込
$in{'mailbody'} =~ s/<id>/$id[$i]/ig;
$in{'mailbody'} =~ s/<name>/$name[$i]/ig;
$in{'mailbody'} =~ s/<email>/$email[$i]/ig;
$in{'mailbody'} .= "\$i=$i \$id[\$i]=$id[$i]\n";
}
0310nobodyさん
03/05/22 11:37ID:???$i以外を使ってみろ!といってみるテスト。
for (0 .. $#email) { # など・・・
それでもだめならPerlのバージョンさらし+環境さらし。
0311310
03/05/22 11:40ID:???そりなら/igs;
0312307
03/05/22 12:40ID:???ひとつの $in{'mailbody'} に対して、@mail 要素数だけ置換繰り返すの?
置換した結果を置換して、それをまた置換した結果を置換…以下ループ(´Д`;)
まず間違いなくその辺に問題があるんじゃない?
>311
行頭や行末を使ったマッチングじゃないので /s は関係ないぽい。
0313nobodyさん
03/05/22 13:26ID:???CGI部分は端折って試したけど、普通に動作したよ。Shift_JISでだけど。
ちょっと見た感じ、print のとこで encodeにもdecodeにも同じ $n 渡してるけど、
decodeには encodeした文字を渡さないと意味ないんじゃない?
ただ両方表示してるだけというなら片方は化けて当然だよね。
それと、普通そういうのはCGIでテストしないで、まずコンソールでテストするよ。
たとえ最終的にCGIにしても。。問題が切り分けられないからね。
0314nobodyさん
03/05/22 20:02ID:???0316nobodyさん
03/05/22 20:58ID:???出た
0317nobodyさん
03/05/22 21:10ID:???あとちょっとで6になりそうなのに・・・
0318nobodyさん
03/05/22 21:23ID:???プロバが放置してるんだもんよ。
0319nobodyさん
03/05/22 21:49ID:???>>318を補足するならば、
・鯖管理者に技術がない
・鯖管理者に暇がない
・バージョンアップして、今動いているものに不具合が出ることを警戒している
などの理由によって放置されている。
0320nobodyさん
03/05/22 21:51ID:???0321nobodyさん
03/05/23 00:22ID:???結果と一緒に出力させたいんですが、
%ENVにも含まれてないそうで取得の仕方に困っています。
知ってる人がいたら教えて下さい。
0322nobodyさん
03/05/23 00:27ID:???0324nobodyさん
03/05/23 14:42ID:82gPpiu/open(INTXT, "http://aaa.co.jp/readme.txt");
みたいにreadme.txtファイルを開いて表示したいのですがうまくいきません
0325nobodyさん
03/05/23 14:46ID:???LWPで検索。
0326nobodyさん
03/05/23 14:47ID:???知らなかったら検索してください。
0328北村貴母緒
03/05/23 15:16ID:7vDvDVhJ見てください。何でも書いてね!
【2003年 クーポン屋】努力しない人は0円になります。
努力した人は年商3574万円!貴方は参加しますか?
私なら、参加します。
http://www.c-gmf.com/index1.htm
「クーポン屋」「アクセスが1日2000人ほどある人なら、1ヶ月274万円ほど
稼げるビジネスであります。」1日110円で宣伝できるサイトであります。
契約者は年間広告費:40,000円を当社に振込んでいただければ、OKであり
ます。そこで、紹介者として,貴方様専用のCGIフォームを用意しますので、
料金回収無し、ノルマ無し、HPにバナーを貼ればOKであります。パートナー
様の目標は1ヶ月300件ほど契約を成立していただければ,貴方様の口座に
274万円を振込しますので、頑張って営業をしてください。どんな人でも稼げ
ますので、1度でも良いので見てくださいね。
http://www.c-gmf.com/index1.htm
0330nobodyさん
03/05/23 16:21ID:???調べる以下のコードって、もっとスマートにかけませんか?
(あるいはそういう関数ってないでしょうか?)
$city = "tokyo";
foreach $value (@ArrayCity){
if ($value eq $value){
$Flag = 1;
last;
}
}
0332nobodyさん
03/05/23 16:49ID:???if(grep(/$city/,@ArrayCity)){ $Flag = 1; }
0333nobodyさん
03/05/23 17:29ID:???(わかりやすいようにチャンネルとテレビ局名を例にしてます)
@channel = (6,1,8,4,10)
@tvname = ('tbs','nhk','cx','ntv','asahi');
っていう配列があって、
これを、
@channelの要素の小さい順に、@tvnameの要素をソートすることって
どうすればできるのでしょう?
要は、
@new_tvname = ('nhk','ntv','tbs','cx','asahi');
を取得したいのですが。
0334nobodyさん
03/05/23 17:32ID:XGb65p6nキーをソートしたらいいのに・・・
0336333
03/05/23 19:55ID:???スパゲッティ状態で、連想配列に変換しようとしても、うまくいかず。。。
■ このスレッドは過去ログ倉庫に格納されています