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

Perlコーディング初心者質問スレ Part 43

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/08/12(金) 01:26:47ID:mHnZWvqz
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0587nobodyさん2005/09/26(月) 02:22:09ID:???
ちゃんと例示用に予約された example.jp とか、 example.com があるのに、
なぜゆえ・・・
0588nobodyさん2005/09/26(月) 02:59:24ID:???
そこに、ドメインがあるからさ、フフフ・・・ ><
0589nobodyさん2005/09/26(月) 04:43:37ID:???
hogeとfugaも日本人用に予約しておけよな
0590nobodyさん2005/09/26(月) 04:49:01ID:???
>>589
藻前が買ってボランティア汁。
0591nobodyさん2005/09/26(月) 17:53:48ID:???
プログラム板で聞いたら板違いと、言われたので再度ここで質問させてください。

チェックボックスでデータを受け取って
HTMLの確認画面に反映させるプログラムを作っているのですが
行き詰まりました。

例えば、course1,course2,course3とあってcourse1とcourse3がチェックされたら
course2のところが空白で反映されます。

ex.)HTML出力画面
course1

course3

こんな感じになります。

この空白を詰めて

course1
course3
みたいな風に出力したいのですがどのようにすれば良いでしょうか?
05925912005/09/26(月) 17:54:19ID:???
ちなみにソースはこんな感じです。汚くてごめん・・。

if($FORM{'course1'} ne "on"){
print "<TR><TH ALIGN=\"right\" VALIGN=\"top\">希望コース:</TH><TD>\n";
print "$HTML{'course1'}\n";
print "<INPUT TYPE=\"hidden\" NAME=\"course1\" VALUE=\"$FORM{'course1'}\">\n";
print "</TD></TR>\n";
}


if($FORM{'course2'} ne "on"){
print "<TR><TH ALIGN=\"right\" VALIGN=\"top\"></TH><TD>\n";
print "$HTML{'course2'}\n";
print "<br>";
print "<INPUT TYPE=\"hidden\" NAME=\"course2\" VALUE=\"$FORM{'course2'}\">\n";
print "</TD></TR>\n";
}
0593nobodyさん2005/09/26(月) 18:03:42ID:???
>>591
>>592も質問するには情報足らないので、エスパーのフリをしてみる。
foerach ('course1','course2','course3') {
if ($FORM{$_} eq "on") { next; }
print "<TR><TH ALIGN=\"right\" VALIGN=\"top\">希望コース:</TH><TD>\n";
print "$HTML{$_}\n";
print "<INPUT TYPE=\"hidden\" NAME=\"$_\" VALUE=\"$FORM{$_}\">\n";
print "</TD></TR>\n";
}
これでまず問題点を切り分けてくれ。
0594nobodyさん2005/09/26(月) 18:16:11ID:???
>>591
思うにそれは空白をつめて表示させるためにはどのようなHTMLであるべきか
という問題であって、それさえわかってしまえばその通り出力するプログラムを
書けばいいだけだから、まずHTMLに詳しい人がいるところで質問するのが
スジってもんじゃないだろうか。ここにもいるかもしれないけどさ。

05955912005/09/26(月) 18:19:54ID:???
>>593
ありがとうございます、無事に動きましたw
エスパーですね!
すみません、情報不足で・・。>>594さんが書いた通りです。

>>594
すみませんでした。 orz
0596nobodyさん2005/09/26(月) 18:27:36ID:???
どうやらエスパーになれたらしい。
変数以外で同じ文字を出力する場合とかは、とりあえずループにかければ問題点は見つかる。
コピペしたつもりでも、うっかりで変わってたりするから。
05975912005/09/26(月) 18:30:46ID:???
>>596
勉強になりました。ありがとうございました。
0598nobodyさん2005/09/26(月) 21:18:44ID:Q7jBJFo3
$FORM{$_} eq "on" and print <<"END" foerach qw( course1 course2 course3 );
<TR>
 <TH ALIGN="right" VALIGN="top">希望コース:</TH>
 <TD>
  $HTML{$_}
  <INPUT TYPE="hidden" NAME="$_" VALUE="$FORM{$_}">
 </TD>
</TR>
END

エスケープとかprint連記とかキモイからこれぐらいスッキリしてもらえる?

いや、オナニーだけどさ。
0599nobodyさん2005/09/26(月) 21:48:52ID:fXbmUf3O
foerach
0600nobodyさん2005/09/26(月) 22:27:10ID:???

ヒントをいただきたく思っております。

cgiで書き出すhtmlページ page1 → page2 に進んで、 page1に戻ったときに 「あんたpage2に進んだからもう戻れないよ!!」

ってやりたいのですが、

集めた情報では cookieでセッション管理して、page1でcookie → page2でcookieになんか値を持たせる。
でもってpage1に戻ったら値違うからダメよ!みたいなことをしろ!! 

とあったのですが、どんなソースなのかさっぱりです。。

どなたか道しるべいただけませんでしょうか?所謂ブラウザの戻る制御みたいなことなのですが、
phpではなく perlでやりたいです。


野暮な質問ですいません。何卒宜しくお願いいたします。
0601nobodyさん2005/09/26(月) 22:38:13ID:???
>>600
その集めた情報の意味がわからないなら、ここで聞いても意味がないと思います。
クッキーの保存と呼び出しの勉強をしてきてください。
ついでに、ブラウザの戻る進むでは意味がないのであしからず。
0602nobodyさん2005/09/26(月) 22:44:25ID:???
>>601
ブラウザのバックはjavascriptで消せる。

Cookieの送り方が分からないんじゃどうしようも無いがな。
0603nobodyさん2005/09/26(月) 23:05:12ID:???
このサイトはもちろん見ましたよね?

http://www.google.com/search?num=50&hl=ja&q=perl+%E3%82%AF%E3%83%83%E3%82%AD%E3%83%BC&lr=lang_ja
0604nobodyさん2005/09/26(月) 23:07:24ID:???
>>601さん
レスありがとうございます。

最近cookieの勉強を始めたばかりなので、ほんとに基本しか知らないのですが、
この場合は、NAME= 値(たとえば1)、 print "path=", "/page2 ";  でpage2に値を持たせて。。
戻ったときにエラーを出す方法がよくわからないのですが。。。勉強不足ですいません。

0605nobodyさん2005/09/26(月) 23:29:13ID:???
>>602
ブラウザはIEだけじゃないですよ。
>>604
検索の方法から勉強してください。
0606nobodyさん2005/09/26(月) 23:45:44ID:???
>>604
いやいや、俺始めてクッキーを知った日に応用は出来なかったけどそれぐらいの事は出来たが・・・・

まぁ>>601氏の言うようにブラウザの戻るはキャッシュがほとんどなので(略
0607nobodyさん2005/09/27(火) 09:58:18ID:???
>>600
http://perldoc.jp/docs/modules/CGI-Session-3.11/Tutorial.pod
http://perldoc.jp/docs/modules/CGI-Session-3.11/Session.pod
これでセッションは、だいたい分かると思うけど。
0608nobodyさん2005/09/27(火) 23:34:13ID:1E14u9Km
$sql =~ s/(\\|\'|\%|\,)/\\$1/g;

これがおかしな挙動を見せるのでググってみたところ、
%は%%でエスケープすることを学習したのですが、

$sql =~ s/(\\|\'|%%|\,)/\\$1/g;
こうした場合、「%」1つの入力であれば正常にエスケープされるように
なってのですが、「%%」と入力するとなぜか\\%%になってしまいます。

ご教示いただけますと非常に助かります。
0609nobodyさん2005/09/27(火) 23:41:28ID:???
おまいがしたいのはこれではないのか?
$sql =~ tr/\'%,/\\\'\%\,/;

それと安易にエスケープするな\Q使え
0610nobodyさん2005/09/27(火) 23:56:08ID:???
>>609
早速のご返答有難うございます。

しかし、「\\\\\'''''%%%%%」と入力したところ、
「\\\\\\\\\\'''''%%%%%」となりました。

前の\のみエスケープされているみたいです。
0611nobodyさん2005/09/28(水) 00:02:13ID:???
別の方法も試してみましたが、だめでした。

$sql =~ s/\Q(\\|'|%|,)\E/\\$1/g;

これですと
「\\\\\'''''%%%%%」は「\\'''%%%%%,,,,,」になってしまいました。。
0612nobodyさん2005/09/28(水) 00:07:50ID:???
何をしたいんだっけ?
06135842005/09/28(水) 00:12:25ID:???
ありがとうございます。
LWP・・・。

プロレス団体みたいですね。

0614nobodyさん2005/09/28(水) 00:14:48ID:???
lib-www-perl すごいプロレス団体でつね。
0615nobodyさん2005/09/28(水) 00:46:08ID:???
解決しました。

よくわかりませんが、
$sql =~ s/(\\|\'|\\%|\,)/\\$1/g;
にすることによって解決しました。

お騒がせしました。
0616nobodyさん2005/09/28(水) 00:47:05ID:???
Larry Wall Prowrestling
0617nobodyさん2005/09/28(水) 01:02:47ID:MTwQib0M
Perlで数学的な演算をやろうと思っているのですが、
15桁(1÷3の場合は小数第14位)までしか計算出来ないようです。

例えば、1 / 3 を計算すると、
0.33333333333333 となってしまいます。


例えば、1 / 3 の結果を 100桁で出力させたい場合は、
小数第5000位で割り切れる割り算の答えを正確に (= 小数弟5000位まで) 出力したい場合には
どのようなコードにすれば良いでしょうか?

ご教示お願いします。
0618nobodyさん2005/09/28(水) 01:03:41ID:???
誤) 例えば、1 / 3 の結果を 100桁で出力させたい場合は、
正) 例えば、1 / 3 の結果を 100桁で出力させたい場合や、


間違えました。申し訳ありません。
0619nobodyさん2005/09/28(水) 01:34:06ID:???
>>617

Math::BigFloat
0620nobodyさん2005/09/28(水) 08:23:08ID:???
>>617
use bignum;

bignum->div_scale(100);
my $x = 1.0;
print $x/3, "\n";

bignum->div_scale(5000);
my $y = 1.0;
print $y/7, "\n";
06216172005/09/28(水) 17:07:26ID:???
>>619-620
ご教示ありがとうございます。
実際にやってみたら正常に動作しました。

div_scale(); で無限に計算を続けるようになるとおもったら
数百桁までしか計算されていないようなので、
div_scale(1000000000000000000) みたいに馬鹿でかい数をいれたら
期待通りに動作しました。
0622nobodyさん2005/09/29(木) 09:36:51ID:???
 <html>
 <head><title>test</title></head>
 <body>test</body>
 </html>
上のようなHTMLファイルを読み込んで、
gzip圧縮してブラウザにかえすCGIを作っています。

gzip圧縮する部分はネットの記事を参考に出来たのですが
HTMLを読み込んでCGIに出力させるにはどうすればよいでしょうか。
0623nobodyさん2005/09/29(木) 09:53:31ID:???
>>622
そういうことしたいときは、mod_gzip ってものを使うんですが。
0624nobodyさん2005/09/29(木) 10:05:50ID:???
>>622
質問の意味がよく分からんが、

print <<END;

<html>
<head><title>test</title></head>
<body>test</body>
</html>
END

でいいのでは?
0625nobodyさん2005/09/29(木) 10:16:37ID:???
sub fuck {
local $/;
open(F, "fuckyou.html") || die "why don't you fuck?"
my $buf = <F>;
close(F);
return $buf;
}

こーゆーことをしたいとかじゃなくて?
こんな基本すら書けない人間が gzip とか言ってるのってありえんとおもた。
0626nobodyさん2005/09/29(木) 10:26:27ID:???
>>625
http の レスポンスヘッダを返さないと。

>>622
print "\n", `cat hoge.html`;
0627nobodyさん2005/09/29(木) 10:27:10ID:???
>>626
IIS な鯖だったら cat できんわけだが。
0628nobodyさん2005/09/29(木) 13:45:10ID:???
#!/usr/local/bin/perl

use CGI
cgi = new CGI

(formの値をどうたらこうたら)

(メイン演算)



print "Content-type: text/html\n\n";

print "<html>\n";

(演算結果をprint)

print "</html>";


という感じのPerlのCGIがたくさんあるのですが、
一つだけHTMLソースがベタ書きで出てしまいます。
Win IE ではちゃんと見えるのですが、Mozilla でソース丸見えです。
他も同じように作ってるつもりなのに、なぜこれだけ失敗するのかわかりません。
何か勘所ありましたらお教えくださいませ。 よろしくお願いします。
0629nobodyさん2005/09/29(木) 13:59:24ID:???
>>628
たくさん cgi ファイルがある設計がどうかしていると思われ。
0630nobodyさん2005/09/29(木) 14:05:41ID:???
>>629  ? なんで?
演算ごとに作っておいた方がラク。
0631nobodyさん2005/09/29(木) 14:09:41ID:???
>>628
問題が再現する最小のソースを書くべし。
0632nobodyさん2005/09/29(木) 14:11:47ID:???
>>628
ソースって中濃?とんかつ?
どのソースが見えてる?
0633nobodyさん2005/09/29(木) 14:13:15ID:???
>>630
何をもってラクとするかだよね。
MVC フレームワークとか勉強してみてください。
0634nobodyさん2005/09/29(木) 14:20:46ID:???
>>628
HTMLがテキストで見えるのなら、Content-typeが上手く出力されてないと思われ。
出力されてるヘッダを確認。
0635nobodyさん2005/09/29(木) 14:21:56ID:???
ヘッダって何ですか?とか聞かれる悪寒。
その次に、確認方法きぼんぬ。とかね。
0636nobodyさん2005/09/29(木) 14:49:09ID:???
>>635
perlをローカルにインスコしてるなら、lwp-requestコマンドが使えるので、コマンドラインから
lwp-request -e -d http://example.net/
という感じでアクセス。
0637nobodyさん2005/09/29(木) 14:50:07ID:???
>>634 ちゃんと text/html と思われているもようでつ。
演算部分をカットしても表示変わらず。 
もっかいよく見てみます  どうもありがとうございました。
0638nobodyさん2005/09/29(木) 15:14:00ID:???
こういうのを見てると、どーかんがえても何らかのフレームワークに乗ったほうが楽だね。
0639nobodyさん2005/09/29(木) 19:45:41ID:???
だから、みんなPHPに流れたのかも。
0640nobodyさん2005/09/29(木) 20:02:55ID:???
PHPやだ、Perlが良い!
0641nobodyさん2005/09/29(木) 20:33:30ID:???
「みんな」流れたことにしたいのでつか?
p2 とか見てると、芸術的なすぱげっちーだし、

> たくさん cgi ファイルがある設計がどうかしていると思われ。

って感じだしなぁ。
06426392005/09/29(木) 21:56:36ID:???
>>641
ほらほら、いちいち噛み付かない。

「みんな」ってのは、「ダメなやつはみんな」という意味だ。
そう書けば満足かな?

もっとも、新規にダメなやつが参入してくるから、あんまり
状況は変わってないが。

> たくさん cgi ファイルがある設計がどうかしていると思われ。

うん。一つ一つは正しそうに動くのに、全体を流すとつじつまが
あわなかったりしてね。まあ、きちんと管理できるなら、小分けに
したほうがいいという考えもありだとは思うけど。
0643nobodyさん2005/09/29(木) 22:00:27ID:???
>うん。一つ一つは正しそうに動くのに、全体を流すとつじつまが
あわなかったりしてね。まあ、きちんと管理できるなら、小分けに
したほうがいいという考えもありだとは思うけど。

テキストエディターのスクロールバーがちっこくなって、
編集時のスクロールでドラッグしにくいので、
用途や動作内容に分けて分割してる。
0644nobodyさん2005/09/30(金) 00:31:42ID:???
ファイルをオープンしようとすると、ファイルがある・またはファイルを作ろうとしているのに何故かNo such file or directoryが出てくるので
手前で$!を見てみたところ、Bad file descriptorと出てきて、その原因が分からなくて困っています。

Bad file descriptorはどんな状態のときに出るのでしょうか。
色々試したところ、 require 'hoge.pl'; (hoge.plは自前のもの)を削ると上記のエラーが出なくなるのですが、
hoge.plの中身を削って行ってもエラーが消えません。
requireに制限でもあるのでしょうか。

http://e-words.jp/w/E38395E382A1E382A4E383ABE38387E382A3E382B9E382AFE383AAE38397E382BF.html
これを見てもどこで何が起こっているのか見当が付きません。よろしくお願いします。
0645nobodyさん2005/09/30(金) 00:54:07ID:EO7sC93p
PDFのファイルの印刷をActivePerlから行いたいのですが、どのように行えば良いのでしょうか?
06466442005/09/30(金) 01:20:52ID:???
No such file or directoryについては解決しました。Bad file descriptorは関係ありませんでした。
しかしBad file descriptorが出たままなので気味が悪いです。一体何が問題なのでしょうか。
0647nobodyさん2005/09/30(金) 03:16:19ID:???
携帯に対応させる為のPerlコーディングは、
一般的にどのようなコーディング方法がありますか?
0648nobodyさん2005/09/30(金) 03:56:57ID:???
優勝記念マジレス
>>647
携帯でPerlを動かすのは聞いたことがないのでCGI用途とすると、
スクリプトはサーバ側の環境に依存するから自由にコーディングできる。
あとは問題なるかも知れないHTTP(リクエスト/レスポンス)ヘッダと問題になりそうなキャリア特有のhtml(chtmlとかhdml)。
前者はPerlに限ったことじゃないし、後者は板が違うね。
0649nobodyさん2005/09/30(金) 08:41:28ID:???
>>642
> ほらほら、いちいち噛み付かない。

>>641 を噛み付ついている状態であるとみなしているくせに、
どーして、そんな噛み付いているやつに、噛み付くのだろう。

> うん。一つ一つは正しそうに動くのに、全体を流すとつじつまが
> あわなかったりしてね。まあ、きちんと管理できるなら、小分けに
> したほうがいいという考えもありだとは思うけど。

ちゃんとした設計してれば、「小分け」の状態が良いと思われ。

>>648
> 優勝記念マジレス

板が違うね。
06506472005/09/30(金) 10:13:27ID:???
ありがとうございました。
0651nobodyさん2005/09/30(金) 10:18:00ID:???
真面目につっこむと

理想的に「小分け」された状態ってのは
「cgi」がたくさん小分けに作られるという意味ではないよね?
0652nobodyさん2005/09/30(金) 14:09:04ID:???
テラワロス
0653nobodyさん2005/09/30(金) 14:54:58ID:???
>>651
フレームワーク厨が暴れる前の発言では、

小分け == cgi たくさん

が成り立ってるっぽいので、何とも言えないのでは?
0654nobodyさん2005/09/30(金) 15:29:51ID:???
>>653
いやいや、>>651は>>649への突っこみと読むべきだろう。
0655nobodyさん2005/09/30(金) 17:05:31ID:kGP+cAoI
>>649
いちいち噛み付かない。
0656nobodyさん2005/09/30(金) 17:12:02ID:???
>>651
ちゃんとした設計をしているなんて前提条件なかったじゃん。
後出しジャンケンっぽくて、ちょっとイヤーンだぞ。

そもそも、

> ちゃんとした設計してれば、

という前置きがつけば、何でも正当化できる。

『ちゃんとした設計をしていれば、○○の状態がよい』は、
無敵であるがゆえに、何も語っていないのと同じ。
0657nobodyさん2005/09/30(金) 20:15:08ID:???
> 無敵であるがゆえに、何も語っていないのと同じ。

異なる性質のものを同じにしたいのですか?
0658nobodyさん2005/09/30(金) 20:19:04ID:???
> > ちゃんとした設計してれば、
>
> という前置きがつけば、何でも正当化できる。

ほう、何でも正当化できるんですか。それはすごい言葉ですね。
今回の小泉タン違憲問題も「ちゃんとした設計してれば、」をつけて
正当化の程よろしくおながいします。
0659nobodyさん2005/09/30(金) 20:37:17ID:???
藻前ら共食いやめろ。
0660nobodyさん2005/09/30(金) 20:42:25ID:ue8bjOg5
ここは話題を逸らしてどれだけ釣れるかを競うスレですね
0661nobodyさん2005/09/30(金) 21:04:35ID:???
> Perlのコーディングで困ってる人のスレです。
0662nobodyさん2005/09/30(金) 22:49:26ID:???
面白い話があるからおまいら聞いてくれ。

彼女が医療関係の学校に通ってるんだが、実習か何かで精神
障害者の施設へ行ったそうなんだ。それが終わって会った時に、
単なる会話として「大変だった?」とか訊いてたら、「あなたと同じ
本を読んでる患者がいた」って言うんだよ。隠してあったエロ本が
見つかったのかと動揺してたら、「あれだよ、表紙に動物の絵が
書いてあるコンピュータの」って言うから、オライリーのを順番に
見せていったら「それそれ! ラクダのやつ」だって。

施設の人が言うには、その患者は絶対にその本を手放さないし、
取り上げると錯乱するからずっと持たせてあるんだってさ。
0663nobodyさん2005/09/30(金) 23:10:31ID:???
で?
0664nobodyさん2005/09/30(金) 23:23:25ID:???
ラクダ本がどうかしたか?
0665nobodyさん2005/09/30(金) 23:43:37ID:???
他スレの終わったネタを持ち込むなよ。
0666nobodyさん2005/10/01(土) 00:06:13ID:tjNKkKzJ
perl でCGIに挑戦中の者です。
何日考えても歯が立たない問題にぶち当たったので、詳しい人の知識をお借りしたいです!!

私がやりたいことは、textファイルのある一行を、別のデータで上書きするということをしたいです。
現在、削除する行を探すためにforeachを使っています。

私の望むイメージはこのような感じです。
-------aaaa.txtのファイル------
あいうえお
かきくけこ
さしすせそ
たちつてと
なにぬねの
-------------------------
↑を
---------------------------
あいうえお
かきくけこ
さしすせそ
なにぬねの
------------------------

削除したい行を特定する部分は自分でなんとかできたのですが、肝心の削除方法が理解不足でどのようにすればいいのか分かりません。
ご教授お願いします。
0667nobodyさん2005/10/01(土) 00:10:24ID:tjNKkKzJ
何を言ってるのか良くわかんなくなってました。ごめんなさい。

私が知りたいのは、削除するためにはどのようにすればいいのか、です。
0668nobodyさん2005/10/01(土) 00:18:13ID:???
こう考えよう。

・今あるデータを配列に読み込む
・新しく作るデータを入れる配列を用意する
・消したい行だけを新しい配列に入れない
・新しい配列をファイルに書き込む
0669nobodyさん2005/10/01(土) 00:25:11ID:???
この際だから書いちまうか

open (TXT, "<aaaa.txt");
flock (TXT, 1);
@data = <TXT>;
close TXT;
@new = ();
foreach (@data) {
 if ($_ ne "たちつてと\n") {
  push (@new, $_);
  }
 }
open (TXT, ">aaaa.txt");
flock (TXT, 2);
print TXT @new;
close TXT;
0670nobodyさん2005/10/01(土) 00:36:22ID:???
文字の置き換えについて教えてください!

$okikae =~ s/文字/変更後の文字/g;

までは分かりましたが、
チルダやスラッシュを含む文字を置き換えるときはどうすればよいのでしょうか?
例として/~id/aaa/aaa/を/bbb/に置き換えるには??
教えてください。
0671nobodyさん2005/10/01(土) 00:44:17ID:???
メタ文字
エスケープ
などの言葉で検索すると幸せになれるかもしれない
0672nobodyさん2005/10/01(土) 07:28:28ID:???
> 幸せになれるかもしれない

なんてどこの老人が使い始めた言葉なのか知らないけど、
見るたびに気持悪くなる・・・。
0673nobodyさん2005/10/01(土) 08:58:47ID:???
うぐぅ、ぎもじわるぃ…
0674nobodyさん2005/10/01(土) 10:35:57ID:???
幸せになれるかもしれないとか見るたびに気持ち悪いとか言い出したのは誰なのかしら
0675nobodyさん2005/10/01(土) 11:27:36ID:???
>>672->>674

>>660
0676nobodyさん2005/10/01(土) 12:54:48ID:???
m9プギャ
0677nobodyさん2005/10/01(土) 14:07:37ID:3dTdip7r
MIMEについての質問です。

以下のようにMIMEを使ってメールを受信して本文を取得するプログラムを作っています。

#!/usr/bin/perl

use File::Basename;
use MIME::Parser;


my $parser = MIME::Parser->new;


#ファイルの一時保存場所を指定
$parser->output_dir('/tmp');


#標準入力からメールを取得
my $entity = $parser->parse(\*STDIN);
my $body_entity = ($entity->is_multipart) ? $entity->parts(0) : $entity;
my $body = $body_entity->bodyhandle;

open(FILE, ">> /log");
print FILE "Test\n";
print FILE $body->as_string."\n";
close(FILE);

ですが、何故か$body->as_stringの時点で本文が拾えず空文字列になります。
ちなみにheadなどのメソッドや、ファイル添付時のis_multipart、partsなどは正常な値を返します。

どういった理由が考えられるのでしょうか?
0678nobodyさん2005/10/01(土) 14:34:03ID:???
MIME::Explode とかが使いやすかった気がするけど。
0679nobodyさん2005/10/01(土) 23:13:02ID:???
>>646
遅レスだが、$!(errno)はシステムコールやライブラリ呼び出しが
失敗したときは値がそれに応じて設定されるけど、成功したときは
未定義なので、何になっているかはわからない。

perldoc perlvarの$!の説明をよく嫁。

0680nobodyさん2005/10/02(日) 04:48:22ID:???
すみません。
http://internet.watch.impress.co.jp/www/article/1999/1122/special.htm
でフォームからメールがおくれたのですが、確認画面を表示させたいのですが、
どのように書いていけばよいのでしょうか。
よろしくお願いします。
0681nobodyさん2005/10/02(日) 09:19:04ID:???
どのようにって・・・
まさか手取り足取り一から十まで順を追って説明しろなんて
ふざけた要求してるわけじゃないよな?

ここの説明を参考にやったんなら、
確認画面の表示の有るフォームメールcgiをいくつかダウンロードして
スクリプトを眺めてみればいいんじゃない?
0682nobodyさん2005/10/02(日) 10:23:03ID:???
スカラーコンテキストの演算子に
文字列の一部を正規表現でキャプチャし一発で渡したい時にはどうすればいいでしょうか?
一応 op ${\("STR" =~ /REGEX/g)}; でできるのですが冗長ですよね。
0683nobodyさん2005/10/02(日) 11:42:59ID:???
>>682
そういうのは一行で書く必然性が無ければ
二行に分けた方が読み解き易く美しい。

"STR" =~ /(REGEX)/;
op $1;

> ${\("STR" =~ /REGEX/g)};
REGEX にマッチした部分文字列の*リスト*を返した上で
無理矢理一つだけを利用しているのが無駄と混乱を招く。
どうしても /g を使いたければ

op +("STR" =~ /REGEX/g)[0];

とでもした方がいいだろう。
0684nobodyさん2005/10/02(日) 11:53:28ID:???
>>682
おそらく /g を付けているのは問題回避のためだろうから、
値1つを取れればいいなら

op +("STR" =~ /REGEX/)[0];
06856822005/10/02(日) 12:38:08ID:???
>>683 >>684
ありがとうございます。確認しました。
/gはラクダ本(日3版175P)に「リストコンテキストでm//gを使って…」とあったので両方必須なのだと勘違いしていました。
実際のコーディングは2文でやってみようと思います。
0686nobodyさん2005/10/02(日) 14:19:35ID:???
URLでよくtest.pl?line=ABC&line2=DEF
みたいに引数を渡す場合がありますがコマンドラインからこのような
引数を渡すにはどうしたらよいでしょうか?
#>perl test.pl 「ここの部分?」
0687nobodyさん2005/10/02(日) 14:35:59ID:???
perl test.pl line=ABC line2=DEF

値は @ARGV に入る。
■ このスレッドは過去ログ倉庫に格納されています