Perlコーディング初心者質問スレ Part 43
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/08/12(金) 01:26:47ID:mHnZWvqz【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0614nobodyさん
2005/09/28(水) 00:14:48ID:???0615nobodyさん
2005/09/28(水) 00:46:08ID:???よくわかりませんが、
$sql =~ s/(\\|\'|\\%|\,)/\\$1/g;
にすることによって解決しました。
お騒がせしました。
0616nobodyさん
2005/09/28(水) 00:47:05ID:???0617nobodyさん
2005/09/28(水) 01:02:47ID:MTwQib0M15桁(1÷3の場合は小数第14位)までしか計算出来ないようです。
例えば、1 / 3 を計算すると、
0.33333333333333 となってしまいます。
例えば、1 / 3 の結果を 100桁で出力させたい場合は、
小数第5000位で割り切れる割り算の答えを正確に (= 小数弟5000位まで) 出力したい場合には
どのようなコードにすれば良いでしょうか?
ご教示お願いします。
0618nobodyさん
2005/09/28(水) 01:03:41ID:???正) 例えば、1 / 3 の結果を 100桁で出力させたい場合や、
間違えました。申し訳ありません。
0620nobodyさん
2005/09/28(水) 08:23:08ID:???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";
0621617
2005/09/28(水) 17:07:26ID:???ご教示ありがとうございます。
実際にやってみたら正常に動作しました。
div_scale(); で無限に計算を続けるようになるとおもったら
数百桁までしか計算されていないようなので、
div_scale(1000000000000000000) みたいに馬鹿でかい数をいれたら
期待通りに動作しました。
0622nobodyさん
2005/09/29(木) 09:36:51ID:???<head><title>test</title></head>
<body>test</body>
</html>
上のようなHTMLファイルを読み込んで、
gzip圧縮してブラウザにかえすCGIを作っています。
gzip圧縮する部分はネットの記事を参考に出来たのですが
HTMLを読み込んでCGIに出力させるにはどうすればよいでしょうか。
0624nobodyさん
2005/09/29(木) 10:05:50ID:???質問の意味がよく分からんが、
print <<END;
<html>
<head><title>test</title></head>
<body>test</body>
</html>
END
でいいのでは?
0625nobodyさん
2005/09/29(木) 10:16:37ID:???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:???http の レスポンスヘッダを返さないと。
>>622
print "\n", `cat hoge.html`;
0628nobodyさん
2005/09/29(木) 13:45:10ID:???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 でソース丸見えです。
他も同じように作ってるつもりなのに、なぜこれだけ失敗するのかわかりません。
何か勘所ありましたらお教えくださいませ。 よろしくお願いします。
0634nobodyさん
2005/09/29(木) 14:20:46ID:???HTMLがテキストで見えるのなら、Content-typeが上手く出力されてないと思われ。
出力されてるヘッダを確認。
0635nobodyさん
2005/09/29(木) 14:21:56ID:???その次に、確認方法きぼんぬ。とかね。
0636nobodyさん
2005/09/29(木) 14:49:09ID:???perlをローカルにインスコしてるなら、lwp-requestコマンドが使えるので、コマンドラインから
lwp-request -e -d http://example.net/
という感じでアクセス。
0637nobodyさん
2005/09/29(木) 14:50:07ID:???演算部分をカットしても表示変わらず。
もっかいよく見てみます どうもありがとうございました。
0638nobodyさん
2005/09/29(木) 15:14:00ID:???0639nobodyさん
2005/09/29(木) 19:45:41ID:???0640nobodyさん
2005/09/29(木) 20:02:55ID:???0641nobodyさん
2005/09/29(木) 20:33:30ID:???p2 とか見てると、芸術的なすぱげっちーだし、
> たくさん cgi ファイルがある設計がどうかしていると思われ。
って感じだしなぁ。
0642639
2005/09/29(木) 21:56:36ID:???ほらほら、いちいち噛み付かない。
「みんな」ってのは、「ダメなやつはみんな」という意味だ。
そう書けば満足かな?
もっとも、新規にダメなやつが参入してくるから、あんまり
状況は変わってないが。
> たくさん cgi ファイルがある設計がどうかしていると思われ。
うん。一つ一つは正しそうに動くのに、全体を流すとつじつまが
あわなかったりしてね。まあ、きちんと管理できるなら、小分けに
したほうがいいという考えもありだとは思うけど。
0643nobodyさん
2005/09/29(木) 22:00:27ID:???あわなかったりしてね。まあ、きちんと管理できるなら、小分けに
したほうがいいという考えもありだとは思うけど。
テキストエディターのスクロールバーがちっこくなって、
編集時のスクロールでドラッグしにくいので、
用途や動作内容に分けて分割してる。
0644nobodyさん
2005/09/30(金) 00:31:42ID:???手前で$!を見てみたところ、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:EO7sC93p0646644
2005/09/30(金) 01:20:52ID:???しかしBad file descriptorが出たままなので気味が悪いです。一体何が問題なのでしょうか。
0647nobodyさん
2005/09/30(金) 03:16:19ID:???一般的にどのようなコーディング方法がありますか?
0648nobodyさん
2005/09/30(金) 03:56:57ID:???>>647
携帯でPerlを動かすのは聞いたことがないのでCGI用途とすると、
スクリプトはサーバ側の環境に依存するから自由にコーディングできる。
あとは問題なるかも知れないHTTP(リクエスト/レスポンス)ヘッダと問題になりそうなキャリア特有のhtml(chtmlとかhdml)。
前者はPerlに限ったことじゃないし、後者は板が違うね。
0649nobodyさん
2005/09/30(金) 08:41:28ID:???> ほらほら、いちいち噛み付かない。
>>641 を噛み付ついている状態であるとみなしているくせに、
どーして、そんな噛み付いているやつに、噛み付くのだろう。
> うん。一つ一つは正しそうに動くのに、全体を流すとつじつまが
> あわなかったりしてね。まあ、きちんと管理できるなら、小分けに
> したほうがいいという考えもありだとは思うけど。
ちゃんとした設計してれば、「小分け」の状態が良いと思われ。
>>648
> 優勝記念マジレス
板が違うね。
0650647
2005/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:???フレームワーク厨が暴れる前の発言では、
小分け == cgi たくさん
が成り立ってるっぽいので、何とも言えないのでは?
0655nobodyさん
2005/09/30(金) 17:05:31ID:kGP+cAoIいちいち噛み付かない。
0656nobodyさん
2005/09/30(金) 17:12:02ID:???ちゃんとした設計をしているなんて前提条件なかったじゃん。
後出しジャンケンっぽくて、ちょっとイヤーンだぞ。
そもそも、
> ちゃんとした設計してれば、
という前置きがつけば、何でも正当化できる。
『ちゃんとした設計をしていれば、○○の状態がよい』は、
無敵であるがゆえに、何も語っていないのと同じ。
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:ue8bjOg50661nobodyさん
2005/09/30(金) 21:04:35ID:???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何日考えても歯が立たない問題にぶち当たったので、詳しい人の知識をお借りしたいです!!
私がやりたいことは、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:???0676nobodyさん
2005/10/01(土) 12:54:48ID:???0677nobodyさん
2005/10/01(土) 14:07:37ID:3dTdip7r以下のように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:???0679nobodyさん
2005/10/01(土) 23:13:02ID:???遅レスだが、$!(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:???そういうのは一行で書く必然性が無ければ
二行に分けた方が読み解き易く美しい。
"STR" =~ /(REGEX)/;
op $1;
> ${\("STR" =~ /REGEX/g)};
REGEX にマッチした部分文字列の*リスト*を返した上で
無理矢理一つだけを利用しているのが無駄と混乱を招く。
どうしても /g を使いたければ
op +("STR" =~ /REGEX/g)[0];
とでもした方がいいだろう。
0684nobodyさん
2005/10/02(日) 11:53:28ID:???おそらく /g を付けているのは問題回避のためだろうから、
値1つを取れればいいなら
op +("STR" =~ /REGEX/)[0];
0685682
2005/10/02(日) 12:38:08ID:???ありがとうございます。確認しました。
/gはラクダ本(日3版175P)に「リストコンテキストでm//gを使って…」とあったので両方必須なのだと勘違いしていました。
実際のコーディングは2文でやってみようと思います。
0686nobodyさん
2005/10/02(日) 14:19:35ID:???みたいに引数を渡す場合がありますがコマンドラインからこのような
引数を渡すにはどうしたらよいでしょうか?
#>perl test.pl 「ここの部分?」
0687nobodyさん
2005/10/02(日) 14:35:59ID:???値は @ARGV に入る。
0688686
2005/10/02(日) 15:14:12ID:???サンクス。
if($#ARGV >= 0){ $buffer = join'&',@ARGV; }
デコードに付け加えて何とかなりますた。
0691nobodyさん
2005/10/02(日) 16:49:19ID:???0692nobodyさん
2005/10/02(日) 17:19:24ID:???0693ヽ(´ー`)ノ ◆.ogCuANUcE
2005/10/02(日) 17:35:02ID:???@ARGV が空リストなら $buffer は空文字になるわけだし。
使うんなら $buffer = join('&', @ARGV) if @ARGV; かな。
0694nobodyさん
2005/10/02(日) 17:51:48ID:???0695680
2005/10/03(月) 01:39:26ID:???別に確認画面を作成してそのでーたをメールを送るCGIに渡すようにしました。
ありがとうございました。
0696もな
2005/10/03(月) 02:21:03ID:???書き込みボタンを押すとエラーが出るわけでもなく画面が遷移して、また再表示というふうにはなるのですが・・・。
どうかご教授願います。datファイルには何も書き込まれていない状態です・・
以下ソースです↓
#!/usr/bin/perl
require 'cgi-lib.pl';
&print_header(); #ヘッダを表示する
if(open(CHK,"bbs.dat")){
if(&get_data == 0){
if ($name eq '') {
&show_error('名前が記入されていません');
} elsif ($title eq '') {
&show_error('タイトルが記入されていません');
} elsif ($message eq '') {
&show_error('内容が記入されていません');
}
&write_to_file();
}
&read_file(); #ファイルからデータを読み出してリストに格納
&print_top(); #トップを表示する
}else{
&show_error('データファイルがオープンできません');
}
続く
0697もな
2005/10/03(月) 02:22:02ID:???$haikei_img ="back.jpg"; #背景画像の指定
print "Content-type: text/html\n\n";
print "<META HTTP-EQUIV=Content-Type CONTENT=\"text/html;CHARSET=Shit_JIS\">";
print "<html>\n";
print "<head><title>Simple BBS</title></head>\n";
print "<body style=\"background-image : url($haikei_img);background-repeat : no-repeat;background-attachment : fixed;\" text=#000000>\n";
}
sub print_top(){
print "<center<table width=600><tr><td>\n";
print "<br><br><center><h2>掲示板</h2>\n";
print "<hr> [ <a href=http://www.yahoo.co.jp>Back To Homepage</a> ] <hr></center>\n";
print "<form method=post action=\"bbs1.cgi\">\n" ;
print "<table border=0>\n" ;
print "<tr><td align=right>名前 :</td><td><input type=text size=20 name=name></td></tr>\n" ;
print "<tr><td align=right>E-mail:</td><td><input type=text size=40 name=mail></td></tr>\n" ;
print "<tr><td align=right>URL :</td><td><input type=text size=40 value=http:// name=url></td></tr>\n" ;
print "<tr><td align=right>タイトル:</td><td><input type=text size=40 name=title></td></tr>\n" ;
print "<tr><td align=right>内容 :</td><td><textarea cols=50 rows=5 wrap=hard name=message></textarea></td></tr>\n" ;
print "<tr><td colspan=2 nowrap align=right><input type=submit value=送信><input type=reset value=書き直し></td></tr>\n" ;
print "</table>\n" ;
print "</form>\n" ;
}
0698もな
2005/10/03(月) 02:23:21ID:???&ReadParse(*FORM_DATA);
if($FORM_DATA{'action'} eq 'reqist') {
&get_time(); #時刻の取得
$name = $FORM_DATA{'name'};
$message = $FORM_DATA{'message'};
$title = $FORM_DATA{'title'};
$mail = $FORM_DATA{'mail'};
$url = $FORM_DATA{'url'};
$action = $FORM_DATA{'action'};
return 0;
}else{
return 1;
}
}
#========================================================
# 日付の取得と整形
#========================================================
sub get_time(){
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime;
@weekday = ('日','月','火','水','木','金','土');
$week=$weekday[$wday];
$mon++;
$year = 1900+$year;
$date="$year年$mon月$mday日($week) $hour時 $min分 $sec秒";
}
0699もな
2005/10/03(月) 02:24:43ID:???open(WRITE,">>bbs.dat");
print WRITE"$name\t$mail\t$url\t$date\t$title\t$message\n";
close(WRITE);
}
sub read_file(){
open(READ,"bbs.dat");
@data_set = <READ>;
close(READ);
}
sub show_error(){
print "<h2>エラー発生</h2><hr><br>";
print "エラー内容: $_[0]";
print "<br>WebブラウザのBackボタンで戻ってください";
exit();
}
_END_
0700もな
2005/10/03(月) 02:25:24ID:???0701nobodyさん
2005/10/03(月) 02:34:33ID:???0702nobodyさん
2005/10/03(月) 02:46:02ID:hN7oOpvnそれだとオブジェクト指向サポートしてないから書き込めないよ
0703nobodyさん
2005/10/03(月) 02:51:30ID:???0704もな
2005/10/03(月) 02:51:39ID:???です。おねがいしますm(__)m
0706もな
2005/10/03(月) 03:04:26ID:???オープンモードですか?
+>や>>などですか。調べてみましたが、もはやどうにも;;
>>705
初歩的なミスですね、ありがとうございます。
その部分を registと書き直しましたが
改善しません。
0707nobodyさん
2005/10/03(月) 03:33:27ID:???入力画面の表示の部分に
<input type="hidden" name="action" value="request">
が抜けている。
そしてなにより、@data_setにいれたログを表示する部分が、ない。
0708もな
2005/10/03(月) 03:44:44ID:???>入力画面の表示の部分に
><input type="hidden" name="action" value="request">
>が抜けている。
今自分で発見しました。ごもっともです・・・。これが原因でした。
>そしてなにより、@data_setにいれたログを表示する部分が、ない。
これはこれから実装予定です。
いまはとりあえずbbs.datに書き込めればいいので。
ありがとうございましたm(__)m
0709nobodyさん
2005/10/03(月) 05:25:36ID:AwkrNdbsCGIの改造を考えていますが、この内容が素人に出来そうでしょうか?
パールの解説のHPを見つけたのと、大昔、BASICをやっていました。
「掲示板に親記事を投稿した人間以外にレスを付けれなくする。」
1、親記事の入力フォームに記事ロックの選択肢を追加。ログデータに
この項目を追加。
2、ロックマーク表示。
3、レス投稿時に親記事番号のログデータを読み込んで、ロックであれ
ばパスワード判定。パスワードは投稿時の物を使用、判定はそのサブル
ーチン流用。
4、エラー処理。(サブルーチンから流用)。
0710nobodyさん
2005/10/03(月) 05:36:42ID:???0713709
2005/10/03(月) 22:58:15ID:y4rbqtg0ログファイルの読み込み、書き込みが強敵です。なにせ、BASICには無い
概念なので。あとは、他の部分からの流用、小改造でなんとかなりそうなんで
すが。
■ このスレッドは過去ログ倉庫に格納されています