トップページphp
984コメント309KB

【Perl】初心者コーナーPart11

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/03/27 12:53ID:wAXxxOxP
 
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。

参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://pc.2ch.net/test/read.cgi/php/988809842/
CGIの質問はこちら【CGIだけどなんか質問ある Pert 5.01 】
http://pc.2ch.net/test/read.cgi/php/1015127347/l50
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/

過去ログ、その他の役立ち情報は>>2-10を見よう。
0713nobodyさん02/04/19 13:12ID:1w9waxQZ
プロ野球オールスター人気投票!マツリだワショーイ!
http://choco.2ch.net/test/read.cgi/news/1019188835/
0714nobodyさん02/04/19 14:18ID:???
>>712
何故一度ログインすればその後はName/Pass無しでもログインしているとみなされるのか。
それを考えろ。
まぁHTTP-Headersでも見てみなさいってこった。
071571202/04/19 14:56ID:???
>>714
レスありがとうございます。
HTTP-Headersですか・・・探してみます。
071671202/04/19 18:51ID:???
>>714
すみません・・・・
HTTP-Headers自体がよくわかりませんでした・・・
もう1つヒントが欲しいです。お願いします。
0717nobodyさん02/04/19 19:37ID:???
>>716
LWPのドキュメントを調べなされ。
071871202/04/19 19:52ID:???
>>717
HTTP::Headersというやつでしょうか?
なんとなく調べるべきことがわかりました。
ありがとうございます!

ところで・・・
調べるのは調べるんですが、そもそも私が
やろうとしてることは可能なことなんですかね?(汗
0719nobodyさん02/04/19 20:05ID:sPCEXxH7
前回は、適切な助言をありがとうございました。

さて、今回はCGI RESCUEにてダウンロードした「マルチパート対応
フォームメール」(form2mail.cgi)を使っています。
その中の機能でファイルをアップロードしてメールに添付する事が
できるのですが、画像ファイルを添付した所、メールで受信して
画像を見ると画像が一部壊れてしまっています。(上部は大丈夫
だけど、下部にいくにつれて緑色になってたりノイズが入ったり
して化けてしまいます)
どうしたら、画像が壊れずに送れるのでしょうか?
0720nobodyさん02/04/19 20:08ID:???
>>718
HTTPのヘッダが関係あるかどうかは分からんよ。
>何故一度ログインすればその後はName/Pass無しでもログインしているとみなされるのか。
察するに、これがCookieで実現されている可能性があると俺は考えたわけだ。
これが正解なら、取得したヘッダを調べりゃ分かる。
072168902/04/19 20:41ID:???
>>707
よく分からない漏れって逝ってよしでしょうか。
072268902/04/19 20:44ID:???
>>721
分かった。
0723nobodyさん02/04/19 21:28ID:???
>>719
binmodeとか
072471202/04/20 00:02ID:???
>>720
なるほど。
たしかにヘッダ(これがヘッダなのかな、と自分が想像するもの)
の一番下の行に、クッキーな文字列がありました。
数字の羅列ではありましたが。
0725nobodyさん02/04/20 00:08ID:???
>>724
その数字の羅列を解析する必要はない。少なくとも、自ら解析コードを書く必要は無い。
要は自作のUserAgentが「Cookieを理解するUserAgentが行って然るべき返信」をすればいいのだから。
0726nobodyさん02/04/20 01:42ID:gkcEnfWM
print "今日からperlの勉強をはじめました。よろしく";
0727nobodyさん02/04/20 01:47ID:???
delete $_1017201229{'726:nobodyさん'};
0728687,70602/04/20 05:02ID:???
>>708
あう?オレの負け?
オレが負けたレスってどれ〜〜〜!?
0729nobodyさん02/04/20 05:25ID:???
cgi-lib.plやjcode.plって旧バージョンだと
何か不具合でもあるのでしょうか?
古い方がバイト数少ないので
その分サーバ負荷が軽減されるのでは?と思い
質問しました。
0730nobodyさん02/04/20 05:35ID:???
>729
バージョンアップというのは機能を追加、強化したりバグを修正したりするものだから
最新バージョンのほうがよいと思う。
そっちのほうで負荷軽減するならスクリプトのほうで軽減する努力した方がいいとおもう
0731nobodyさん02/04/20 05:41ID:???
数十、数百バイトの違いでクリティカルに負荷が変化するようなシステム
使ってるのか?それならPerlが起動しただけでヤバイな。
C言語の経験がないような人ってのは、変な事に気を遣うね。
そんなこと気にする暇があったら自分のコードを見直した方がいいと思うよ。

073272902/04/20 06:14ID:???
>>730-731
了解しました。
ありがとうございました。
0733nobodyさん02/04/20 07:28ID:???
print <<SEX;
cgi-lib.plやjcode.plって使う必要無いような気がするんだが
SEX
0734nobodyさん02/04/20 07:39ID:???
timeファンクションで秒の部分を出力しないようになんて
可能ですか?
可能であればどうやればいいですか?
0735nobodyさん02/04/20 07:56ID:???
>>734

time()って秒数を返してくるんだから秒の部分を出力しないって
なんのこっちゃ・・・

それともこういうこと?

use Time::Local;
## 本当の時間が12時0分52秒だったら12時0分0秒に変換
my $secs = timelocal( 0, (localtime( time() )[1..5] );
0736nobodyさん02/04/20 10:23ID:???
>>734
もしくは、分単位で出したいなら
int(time/60)
0737nobodyさん02/04/20 10:47ID:???
>>736を秒単位にするなら
60 * int time / 60
073873402/04/20 11:22ID:???
>735-736
ネタニ マジレス オバカサン
0739nobodyさん02/04/20 11:28ID:???
>>737
int(time)に60をかけて60で割る。
CPUがかわいそうだぞ。そんな非生産的な計算。
0740nobodyさん71902/04/20 11:44ID:f9E3OCx3
>>723さん、ありがとうございます。

はい。binmodeを3ヶ所に入れてみたのですが変りませんでした。
---------------------1
sub sendmail {

if (!open(OUT,"| $nkf -j | $sendmail -t")) { &error('Error'); }
#ADD--->start
binmode(BIN);
#ADD--->end
$host = $ENV{'REMOTE_HOST'};
---------------------2
sub send_mix {


if (open(UU,"$UUENCODE $tmp$filenum $filename |")) {
#ADD--->start
binmode(BIN);
#ADD--->end
@UUFILE = <UU>;
---------------------3
sub writebin {


if (!open(BIN,"> $tmp$filenum")) { &error('Error','アップロードファイルの一時ファイルが作成できません.<br>','テンポラリーフォルダのパーミッションを確認してください.'); }
#ADD--->start
binmode(BIN);
#ADD--->end
print BIN $FILEDATA[$file];
---------------------
0741nobodyさん71902/04/20 11:45ID:f9E3OCx3
また、サーバー上にアップロードした一時ファイルを消さない様に
残すようにしてその画像を確認した所、
---------------------1
sub send_mix {


print OUT @UUFILE;
}
#DEL--->start
#if (-e "$tmp$filenum") { unlink("$tmp$filenum"); }
#DEL--->end
}

print OUT "--$bound\-\-\n";
---------------------
サーバーにアップされた時点では画像は崩れていませんでした。
なので、メール送信した時に崩れてしまっているのかな?と
考えています。
※ちなみに、サーバーOSはUNIXです。
074273602/04/20 12:00ID:???
>>738
お前、うんこ。
0743nobodyさん02/04/20 12:14ID:???
>>741
テキストモードで転送したんじゃないの?
0744nobodyさん02/04/20 12:22ID:???
>739は優先順位を理解していないアフォ
0745preference02/04/20 13:10ID:???
あるCGIで確認キーを発行しようとしたら、こう出た。
原因わかる?
Unrecognized character \202 at ./fmail.cgi line 7. Content-type:text/html Unrecognized character \202 at ./fmail.cgi line 7. Content-type:text/html Unrecognized character \202 at ./fmail.cgi line 7.
0746nobodyさん02/04/20 13:19ID:???
> binmode(BIN)
ナンデスカコレハ
0747nobodyさん02/04/20 13:20ID:???
>>745
ソースのエラーごときでよばんでくれるか?
しかもソース隠匿。
0748preference02/04/20 13:35ID:???
ソース
sub obtiby{local($mailhost,$mailhostip);&sbfzwj(0);if(&mxomee == 1){&hzyfwg('SEND MAIL',<<_F);<p>すでに指定したメールアドレスにメールを送っています。</p>
<p>メールの中に書いてある確認キーを入力してから、もう一度送信してください。</p>
<p>誤って紛失してしまった場合は次の日まで待っていただき、もう一度再発行を受けて下さい。
$fd
_F
exit(0);}
eval{$SIG{ALRM}=sub{die"(Time Out)\n"};alarm 20 if($^O!~/Win/i);&tpkfcs($mail, $sysopmail);alarm 0 if($^O!~/Win/i);};
if($@ ne '' || $?){&hzyfwg('SEND MAIL',"<p>メールサーバエラー $@</p>");}else{&hzyfwg('SEND MAIL',<<_F);<p>確認キー発行申\請を受け付けました。</p>
0749nobodyさん02/04/20 13:49ID:???
>>745
原因はエラー表示そのままで、
「fmail.cgiの7行目にへんな文字(8進で202=16進で82)が混じってる」
からなんだけど、fmail.cgiの1〜7行めまでを見せてくれないとわからない。
>>748の一行目って、fmail.cgiの1行目なの?
0750nobodyさん02/04/20 13:50ID:???

すげーソースだな。正直、こんなに電波がゆんゆん逝ってるソースは久しぶりに見た。
0751nobodyさん02/04/20 13:50ID:???
>Unrecognized character \202 at ./fmail.cgi line 7.
7行目に日本語混ざってんだろ、どうせ。ヴォケ。糞。
075271202/04/20 14:38ID:???
>>725
わかったような、わからないような・・・・・です。
「LWP::UserAgentを使えばよい」ということですね。やってみます!
>その数字の羅列を解析する必要はない。
>少なくとも、自ら解析コードを書く必要は無い。
>要は自作のUserAgentが
>「Cookieを理解するUserAgentが行って然るべき返信」をすればいいのだから。
0753nobodyさん02/04/20 14:51ID:???
>電波がゆんゆん逝ってる

電波の擬音語って「ゆんゆん」なのか。

いやどーでも良いんだけど
0754nobodyさん02/04/20 14:54ID:???
>alarm

綴り変
0755nobodyさん02/04/20 14:54ID:FTp8XsfB
Perl の勉強スタイルってどうしてますか?
漏れはActive Perl をWindows2000にインストールして、メモ帳とかの普通のテキストエディタでソース書いて、a.plとかで保存して、DOSプロンプト立ち上げて
perl a.pl
とかやってますけど、CPad みたいに効率のいい勉強環境ないですか?
0756nobodyさん02/04/20 15:16ID:???
>>755
漏れはmuleをパッケージでFreeBSDに入れて、mule -nwで起動してから
セーブ、サスペンド、.M-p[RET],fg
ってやってる。
0757nobodyさん02/04/20 15:32ID:???
>効率のいい勉強環境ないですか?
こういう人は、何を与えても効率よく使えない人。
0758nobodyさん02/04/20 16:23ID:???
>>755
漏れはCPadてものを知らないのだが
MacPerl(自前コンソールとエディタ内蔵
winならCopal
簡単な構文チェックにいいよ
0759nobodyさん02/04/20 16:26ID:sMz1eiXo
@array = qw[1 1 1];
@array1 = qw[2 2 2];
@array2 = qw[3 3 3];
出力
1 2 3
1 2 3
1 2 3
の様に各配列の要素を順番に一つずつ表示させる上手い方法は無いでしょうか?
0760nobodyさん02/04/20 16:36ID:???
>>759
>>475
0761nobodyさん02/04/20 16:37ID:???
760羽虫して
0762nobodyさん02/04/20 16:40ID:FTp8XsfB
Copal インストして使ってみました。
すごくいいです。ありがとうございます。
0763nobodyさん02/04/20 18:03ID:sMz1eiXo
foreach(0..3){        #←これ
foreach(a..c){
 print $_;
}
}
この場合1度目の0..3は2度目のforeach文中では何て言う変数に
格納されてるんですか?
0764nobodyさん02/04/20 18:47ID:???
for(0..3){
print 'LOOP1 = ' . $_ . "\n";
for(a..c){
print 'LOOP2 = ' . $_ . "\n";
}
print 'LOOP1 = ' . $_ . " (゚Д゚;)\n\n";
}
0765nobodyさん02/04/20 18:48ID:???
>>763
漏れの知識では、外側の$_は内側のループから参照でけない。
0766nobodyさん02/04/20 19:21ID:FTp8XsfB
chompってどういう意味なの?
chopにmが増えただけなの?
なんでmが付け加えられたの?
0767nobodyさん02/04/20 19:34ID:???
改行だけchop
0768nobodyさん02/04/20 19:41ID:FTp8XsfB
それだったらchopnとかになりそうだけど、なぜmが選ばれたのか、そしてなぜoとpの間に挿入されたのかがわかりません。
0769nobodyさん02/04/20 19:47ID:???
そういうことに疑問を持たない方が賢くなれますよ
0770nobodyさん02/04/20 20:02ID:???
ちょむぷ
0771nobodyさん02/04/20 20:17ID:???
>>768 語呂が悪いからだろ。
0772nobodyさん02/04/20 20:19ID:???
何故nなのか小一時間(以下略

\nのnだとか言ったらアホとしか思えない。
0773nobodyさん02/04/20 20:59ID:???
>>766
chomp
[動詞]. (むしゃむしゃ)かむ.
0774nobodyさん02/04/20 21:04ID:FTp8XsfB
>>773
おお、ようやく理解できました。
0775nobodyさん71902/04/21 00:56ID:86gzo8Ag
>743さん、私もそう考えてネットで調べてみた結果、binmodeを使って
バイナリモードにしてみると良いというのを見かけましたので、これを
追加してみたのですが上手くいきませんでした。

>746さん、もしかして「binmode(BIN)」のパラメータの指定が間違って
いますか?ネットで調べて「binmode(STDOUT)」や「binmode($filenum)」
に変更してみたのですが状況は変りませんでした。
しかもよく調べてみると、binmodeはサーバーOSがWindows系の場合の
対応でUNIXでは必要ないとの事らしいので、この対応は意味が無いのかな?
と考えています。

そこで、はじめは自分のHTMLに組み込んで使っていたので、サンプルの
HTMLとCGIをほぼそのまま(変更したのは、環境パスと送信先メールアドレス
と戻り先URLぐらい)の状態でサーバーにアップロードしてから実行しても
あいかわらず画像が崩れてしまい、状況は変りませんでした。
何か他に疑う所はありますでしょうか?
0776nobodyさん02/04/21 00:58ID:???
>>775
まずbinmode()についての理解を深めなさい。
動作の解らない関数をコードに入れるなんてナンセンス。
予備知識としてUNIXとDOSのテキストファイル形式の違いも勉強するとなお良し。
0777キリ番厨02/04/21 02:06ID:???
スリーセブンオメ>俺
0778nobodyさん02/04/21 02:20ID:???
>>775
どっかのUp板にそのIスクリプトUpしてくれると、なにかわかるかも。
0779nobodyさん02/04/21 02:27ID:???
>778
おせっかい野郎登場ってか?
078077802/04/21 02:36ID:???
>>779
すまん、そのとーりだ。Upしなくていいよ>>775
0781nobodyさん02/04/21 02:55ID:???
>>780
煽りにマジレスしなくても…。
0782nobodyさん02/04/21 04:34ID:5EokjXuO
>781
煽りにマジフォローしなくても…。
0783nobodyさん02/04/21 05:35ID:???
(´-`).。oO(煽り厨の >>779 = >>782 [ID:5EokjXuO] はCGIスレでも大活躍だね・・・・)
0784nobodyさん02/04/21 08:39ID:1/Tdsylw
質問です。
配列@a=("hoge1","hoge2","hoge3"〜)で@aの要素として存在する文字列に関して
連想配列%flagを$flag{'hoge1'}=1
というふうにしたいのです。
foreach $_ (@a) {$flag[$_] = 1;}
とするとflagは全部1になってしまいます。
どのようにすればうまく行きますか?
0785nobodyさん02/04/21 09:02ID:zdYHTsmZ
>>784
ちょっと変えて
$n=1;
for ( @a ) { $flag[$_] = $n; $n++; }
とかどうでしょう。
0786nobodyさん02/04/21 09:50ID:???
>>785
ありがとうございます。$flag[$_]=1の間違いですか?
どちらにしても上手くいかないようです。
0787nobodyさん02/04/21 10:00ID:???
>784
おまえがどうしたいのかわからないよ。
hoge2の時は?hoge3の時は?
0788nobodyさん02/04/21 10:10ID:???
>>784
全部1でOKなんじゃないの?
それとも出現回数をカウントしたいわけ?
078978402/04/21 10:19ID:???
@aに文字列があるかどうかを調べたいんです。
hoge2がなければ$flag['hoge2']が1になって欲しくないんです。
よろしくお願いします。
079078402/04/21 10:20ID:???
ああ、そうか。書き方が悪かったです。
@aが可変なんです。
0791nobodyさん02/04/21 10:33ID:???
%flag = ();
for (@a) {$flag[$_] = 1;}
こうしたいのか? これじゃ無ければ手に負えん、後は任せたぞ>>793
0792nobodyさん02/04/21 10:38ID:???
for $_ (@a){ $flag{$_} = 1 } じゃダメなの ?
あるかないかは、if defined $flag{...} でわかると思うけど...。
# 何故、連想配列なのに $flag['hoge2'] とか書くの ?
0793nobodyさん02/04/21 10:39ID:???
そりゃ1かどうかの問題じゃなくてハッシュにキーが
存在するかを調べればいいことだろ。
で、おまえがなぜこの程度のことを出来ないのかがわからない。
079478402/04/21 11:18ID:???
すみません。単純に連想配列の表現に{}とするところを
[]としていたせいだったっぽいです。792さんに指摘されて気づきました。
大変お騒がせしました。
ところでみなさんforeachって書かないんですね。
0795nobodyさん02/04/21 13:11ID:???
>794
人の自由さ。foreachとforはほぼ同じだし
0796nobodyさん02/04/21 13:20ID:???
ほぼ、どころか全く同じだったり。
0797やさしいお兄さん02/04/21 13:58ID:???
>784
こういうことでは?

@a=("hoge1","hoge2","hoge3");
@flag{@a}= (1) x @a;
for ( keys %flag ){
    print $_,": ",$flag{$_},"\n";
}
0798nobodyさん02/04/21 16:03ID:???
弐編=神 >>>>>>>>>> Dream★=上級者 >>>>>>>> やさしいお兄さん=中級者 >>>>> 初心者 >>>>>>> japu=異常性愛車 >> _gunzip=厨房
0799nobodyさん02/04/21 16:05ID:???
>>798
激しく同意
0800nobodyさん02/04/21 16:05ID:???
800げt
0801nobodyさん02/04/21 16:12ID:???
変数内のダブルクオーテーションは、どやって置換すればいいでしょうか?

前のページでテキストボックスから送られてきたデータの中に、 " が入ってると
処理がうまくいかないです。んで、置換しようと思ったのですが
$test =~ /"/\"/g;
とかやっても置換してくれません。お助けくだされ。
0802nobodyさん02/04/21 16:14ID:???
>801
具体的に問題となった処理を提示してください。
0803nobodyさん02/04/21 16:21ID:???
>801
何がどううまくいかないのか、さっぱりわかりません。
ついでに、
$test =~ /"/\"/g;
これはコンパイルエラーになります。
0804名無しさん@edlin02/04/21 16:27ID:???
>>801
$test =~ s/"/\\"/g;
でしょ?
0805nobodyさん02/04/21 16:30ID:???
弐編=神 >>>>>>>>>> Dream★=上級者 >>>>>>>> やさしいお兄さん=中級者 >>>>> 初心者 >>>>>>> japu=異常性愛車 >> _gunzip=厨房



0806nobodyさん02/04/21 16:35ID:???
弐編=神 >>>>>>>>>> Dream★=上級者 >>>>>>>> やさしいお兄さん=中級者 >>>>> 初心者 >>>>>>> japu=異常性愛車 >> _gunzip=厨房






0807nobodyさん02/04/21 16:41ID:???
弐編=神 >>>>>>>>>> Dream★=上級者 >>>>>>>> やさしいお兄さん=中級者 >>>>> 初心者 >>>>>>> japu=異常性愛車 >> _gunzip=厨房



















.
0808定型文02/04/21 16:41ID:???
Dream★必死だな。
0809nobodyさん02/04/21 16:44ID:???
>>805-807
激しく同意。
激しく同意
0810nobodyさん02/04/21 16:45ID:???
------------------------終了------------------------

------------------仕切りなおして再開-----------------
0811コレが真実だ!02/04/21 16:47ID:???
弐編=神 >>>>>> Dream★=上級者 >>>>>> やさしいお兄さん=中級者 >>>> 初心者 >>>>>>> japu=異常性愛車 > _gunzip=厨房
0812nobodyさん02/04/21 16:48ID:???
みんな死ねよ!
■ このスレッドは過去ログ倉庫に格納されています