Perl コーディング初心者質問コーナー Part34
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001前スレの連投で気分崩したので後よろ
04/04/05 16:01ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0809nobodyさん
04/05/16 02:01ID:???物ぐさしないで新しいの入れてご覧。
ActivePerl build 631以前はTkが同梱されておりません。
0810nobodyさん
04/05/16 05:37ID:???問題の起きるサンプルを書いて欲しいところ。
0811nobodyさん
04/05/16 07:49ID:???今日、今だったらlocaltimeで取得出来ますけど。
引数で何とか出来そうですが分かりませんでした。
0814nobodyさん
04/05/16 10:11ID:WJ6PDaM410846903300057678
のように、表示させたいとしたいのですが、
(プロセス番号は、8桁未満のときは0を入れる)
$datafile = time . sprintf("%8d",$$);
だと、
108469033 57678
となってしまいます。
この空白を0で埋めるにはどうすればよいのでしょうか?
0816814
04/05/16 10:32ID:WJ6PDaM4どうも。
$datafile = time . sprintf("%08d",$$) . ".csv";
で解決しました。
0819nobodyさん
04/05/16 15:59ID:???0821nobodyさん
04/05/16 16:53ID:???さすがマルチなだけあるな。
0822nobodyさん
04/05/16 23:45ID:???ある日付の1日前の日付(YYYY/MM/DD)の取得は一度1970年よりの秒数に変換してから再びlocal関数に通すしかないのでしょうか?
もう一つ、
ある月に何日まであるかを返すには閏年の計算は必須でしょうか?(Perlに用意されていますか?)
0823nobodyさん
04/05/16 23:50ID:???たとえば2chのDATを読む時みたいに。
LPWのmirrorをみてみたのですが、更新されてるときは新しくDLするみたいでよくわかりません。
0824nobodyさん
04/05/16 23:56ID:???3/1の前日が2/28か2/29になる以外、すべての日の前日は固定ですが?
2月以外は何日まであるか固定ですが?
それは閏年によって変わるのだから計算は当然必要ですが?
perlにはそんなものを求める関数はありませんが?
0828822
04/05/17 00:29ID:???回答ありがとうございます。
Time::Localモジュールを使えば日付→経過秒数の変換が一発でできるようですね。
ある月の日数算出は普通に組み込んでみようと思います。
また困ったことがあれば質問しに来ます。
どうもありがとうございました。
0829nobodyさん
04/05/17 06:58ID:???use Date::Calc qw(Add_Delta_Days Days_in_Month);
my ($year, $month, $mday) = (2004, 3, 1);
($year, $month, $mday) = Add_Delta_Days($year, $month, $mday, -1);
print "date-1: $year, $month, $mday\n";
my $days = Days_in_Month($year, $month);
print "days: $days\n";
0830nobodyさん
04/05/17 07:33ID:???0831822
04/05/17 08:22ID:???それです!
わざわざサンプルソースまで書き出して頂きありがとうございます(´Д⊂ヽ
Days_in_Monthにあたる関数は自力で作れましたので、
Date::CalcのAdd_Delta_Daysだけを借りてみようと思います。
そして小一時間ほどppmと格闘しなんとかDate::Calcをインストールし、
5/1→4/30の移動を確認できました!
本当にありがとうございました。
# ついでにTime::Localもインストールしておきました。
0833nobodyさん
04/05/17 13:32ID:???0834nobodyさん
04/05/17 13:44ID:???0835nobodyさん
04/05/17 20:26ID:???0836823
04/05/18 02:17ID:???>>826
探したのですが、rangeと検索してもほかの部分が見つかってしまってだめでした。
もうちょっとヒントをいただけませんか。
0837nobodyさん
04/05/18 02:27ID:???0838nobodyさん
04/05/18 07:19ID:15Ww53+yttp://www.studyinghttp.net/rfc_ja/2616/sec14.html#sec14.35
0842nobodyさん
04/05/18 22:40ID:???前に見つけたんだけど、URLがどっかいっちゃった;それでさっきから探してるけど、見つからないんだ。
0843nobodyさん
04/05/18 22:43ID:???0844名無しさん
04/05/18 23:11ID:4Rd9YBtL表の生成部分はなんとか出来そうなのですが
(a)ファイルの中から行を探して変更、削除する部分と
(b)追加する部分で同じ内容で複数行追加しないようにする部分
の方法が頭に浮かびません。どのような方法がありますか?サンプルソースを教えていただけないでしょうか?
1)予定テキストファイルを読み取り次のような表を生成します。
+−−−−+−+−+−+−+−+−+−+−+−・・・
|2004年06月|先月 |今月 |来月 |
+−−−−+−+−+−+−+−+−+−+−+−・・・
| 名前 |1|2|3|4|5|6|7|8|9・・・
+−−−−+−+−+−+−+−+−+−+−+−・・・
| 鈴木 | | |休| | |後| | |
+−−−−+−+−+−+−+−+−+−+−+−・・・
| 佐藤 | | | | |休| | | |
+−−−−+−+−+−+−+−+−+−+−+−・・・
| 田中 | | |前| | | |休| |
+−−−−+−+−+−+−+−+−+−+−+−・・・
2)先月、今月、来月の部分はリンクとなっていてCGIを呼び出し、先月の表、今月の表、来月の表を生成します。
3)名前もリンクになっていてフォームを呼び出し、SELECTタグにより年、月、日と、休、前、後を選択して予定テキストファイルに追加します。
4)休、前、後もリンクになっていて、フォームを呼び出し、予定テキストファイルから該当行を変更、削除します。
予定テキストファイルの内容は
名前ID<>年<>月<>日<>内容
n0001<>2004<>6<>3<>休
n0002<>2004<>6<>5<>休
n0001<>2004<>6<>6<>後
n0003<>2004<>6<>7<>休
名前と名前IDのリストファイルの内容
名前ID<>名前
n0001<>鈴木
n0002<>佐藤
n0003<>田中
0845nobodyさん
04/05/18 23:28ID:???まずは日本語からお勉強しようね。
お仕事をするには早すぎるようですよ。
ぶっちゃけ表はファイルから読み出すだけだし、
書き込みは重複を検査すれば良いだけだろ。
0846842
04/05/19 00:04ID:???ありがとう!見つかったよ。
目的はメルアドのチェックじゃなくてsendmailに渡す際へんなスクリプトを排除したいだけなんだ。
で、なんか一杯記号は許可されてるみたいだから、結局「<」、「>」、「"」だけ切り捨てることにしたよ。
まだperl勉強足りないんだけど、perlって「$」、「@」、「%」とかを入力されても内部で途中で展開しないで
ただの文字列として扱われるみたいね。いい!
0847nobodyさん
04/05/19 00:22ID:???Perlは不得手。全部読んで全部書き出すよろし。
splice()を使うと幸せになれるかもしれない。
(b)追加する部分で同じ内容で複数行追加しないようにする部分
重複チェックはハッシュを利用すると楽。
0848nobodyさん
04/05/19 01:25ID:???>まずは日本語からお勉強しようね。
>お仕事をするには早すぎるようですよ。
人のあらを見つけると大喜びで責め立てる。845はそういうむなしいやつ。
でもな、845だっていいところもあるんだよ。845のいいとこは↓が教えてくれる。
0849nobodyさん
04/05/19 01:31ID:???>まずは日本語からお勉強しようね。
>お仕事をするには早すぎるようですよ。
人生にとって大切なことを的確にアドバイスしてあげたこと
0850nobodyさん
04/05/19 02:31ID:???例えば相手がフォームに「ササ」と半角カタカナで入力する。んで、漏れが
require "jcode.pl";
read(STDIN,$buffer);
$buffer =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
jcode::convert(\$buffer,"euc");
jcode::h2z_euc(\$buffer);
〜処理〜
jcode::convert(\$buffer,"sjis");
print $buffer;
ってやってもうまくいかない。相手がeucで送ってくれば大丈夫だけど他の文字コードだと駄目。
半角カタカナの文字列+全角文字列(例「ササ表示」)ならちゃんと全角カタカナへ変換できるけど。
なんかPERLメモとかには先にeucに変換してあればおkだなんて載ってるけど、全然おkじゃない・・・
相手がどんな文字コードで送ってきても華麗に半角カナを全角カナに変えれちゃうおっとこまえいませんか?
0851nobodyさん
04/05/19 02:37ID:???0852850
04/05/19 03:07ID:???それも駄目なのさ。
多分問題は$bufferの中に半角カナしかないときなんだよね。他の文字も混ざってればちゃんと機能するんだけどね。
まあそんなにこだわることでもないけどできればなぁ
0853nobodyさん
04/05/19 03:33ID:???http://www.shtml.jp/mojibake/hankaku.html
0854nobodyさん
04/05/19 03:33ID:???するんですけでど、どれくらいのレベルから排他制御って必要になってくるんですか?
0855nobodyさん
04/05/19 03:56ID:???【Perl】ファイルロック(排他処理)について語ろう
http://pc5.2ch.net/test/read.cgi/php/1024795138/
0856854
04/05/19 03:56ID:???でも、人が読みこんでる最中に誰かが新たにopenしようとしたらopenエラーになっちゃいますよね。
それは嫌なので一応flock等で誰かがファイルオープンしているときは待たせればいいんでしょうか?
open(DATA,"< test.txt");
flock(DATA,1);
なんたらかんたら
close(DATA);
みたいでよろしいですか?
0859nobodyさん
04/05/19 06:29ID:Q40mcV4Uあれをやってしまうと、本文に+が含まれている場合
空白になってしまうのですがどうすれば半角の+を表示することができるのでしょうか?
++
0860nobodyさん
04/05/19 06:59ID:???「+」は「%2B」にエンコードされてるんだから無問題。
エンコードされていなかったら送信側のバグ。
0861nobodyさん
04/05/19 07:00ID:???0862nobodyさん
04/05/19 07:02ID:???デコードする際にまず+を半角スペースに変換して、それから%??を変換するのはこいつのため。
先に%2Bを+に変換してしまうと半角スペースになってしまう。
0863859
04/05/19 07:34ID:???なるほど。コードをよくよく見てみたら、unpack(デコード)したあとに
+を半角スペースに置換する処理を行っていました。
どうもありがとうございました。
0864850
04/05/19 17:11ID:???やっぱそうですかね、相手が送ってきたものを先にeucに変換する処理も相手が半角カナしか
入力しない場合、jcode.plではeucへの変換が正常におこなわれないみたいですね。
まあ、仕方ないということで半角カナは止めてね。って注意書きいれる事にしますた。
0865nobodyさん
04/05/19 17:19ID:???戻るボタンを押すと普通は
「セキュリティ保護のため、〜〜〜」
っていう文言がでてしまいますが、最近そうならないページを見つけました。
ttp://www.blueberryeye.co.jp/
の注文ページなんですが、間違っても簡単に前のページに戻れるのはいいなぁと思いますが、
やり方がわかるかたいますか?
0866nobodyさん
04/05/19 18:01ID:???.htaccessでIP指定してdenyしてもだめだし
User-Agentがlibwww-perl/5.75なのでそれをdenyしても防げません。
lwpを使ったサンプル探して自分でいろいろテストしてみようと思いましたが
そういうのも見つかりませんし
何方かお知恵を拝借できませんでしょうか
0867866
04/05/19 18:02ID:???●User-Agentがlibwww-perl/5.75なのでそれをdenyしてみましたが防げません。
0868nobodyさん
04/05/19 18:04ID:???前にもそんなネタ振った人がいたな。
入力値引き渡す方法はいろいろあるんだが
調べる気がさらさらない様子で放置されてたような。
0869865
04/05/19 18:12ID:???入力値の引継ぎではなくて、多分キャッシュ関係なんだと思います。
例えば前ページに戻ったとき、フォームに入力していたのが消えずにそれぞれのボックス内に
残ってるんですよ。フォームのあるページを普通のHTMLで作った場合と同じ事が、CGIから吐き出されるHTMLでも
できてるって話です。
0870nobodyさん
04/05/19 18:17ID:???0872nobodyさん
04/05/19 19:01ID:???そんな方法があるのなら知りたいな。
0873865
04/05/19 19:03ID:???そうなんですか?HTMLではその入力値の引継ぎを自動でやってるってことですか?
ただ単にCGIから吐かれたHTMLをブラウザに一定の時間のキャッシュを許すだけとかかなぁと
思ってました。
CGIで作られたページのキャッシュを制御するような機能をPERLで作れるのかなと。
0874nobodyさん
04/05/19 19:19ID:???Perlのコーディングとは全く関係ない
0876865
04/05/19 19:41ID:???何度も読んだ。
なんかみんな質問を勘違いしてるぽ
引継ぎなんてやっぱり関係ないみたい。ブラウザの戻るボタンで情報の再送信普通は自動
でしないけど、それを自動でやっている。っていう話でもない。
例えば、a.htmlにテキストボックスがある。そこに「あいうえお」といれてb.cgiに移る。
b.cgiが何するかなんてどうでもよくて、b.cgiからa.htmlに戻った場合、a.htmlのテキスト
ボックスには、さっき自分で書いた「あいうえお」が残ってるよね。
それは入力値の引継ぎなんて全く関係ない。ブラウザは新しく何かを読みこむわけじゃないし。
それのa.htmlがa.cgiになっても同じ様にするにはってことなんだけどね。
0877nobodyさん
04/05/19 20:03ID:???さっさと消えろ。
では、次の人どうぞ。
0879nobodyさん
04/05/19 20:30ID:???0880nobodyさん
04/05/19 20:52ID:???テキストカウンターなのですが、
<!--#exec cgi="./counter.cgi?id=tes&md=4" -->
とするとSSIエラーが出ます。
?以降を外せば動くんですが・・・。
0882nobodyさん
04/05/19 21:07ID:???しかし>>878よ、>>877は決して間違ってはいないんだぞ。そこの所は理解して欲しい。
>>877の本心を明かす男は↓
0883nobodyさん
04/05/19 21:08ID:???0884nobodyさん
04/05/19 21:09ID:???0885nobodyさん
04/05/19 21:10ID:???0886nobodyさん
04/05/19 21:11ID:???POSTでアップロードしてから戻ると「セキュリティ保護のため、〜〜〜」
ってことならもう少し盛り上がったんだろうけどねぇ。
HTTPヘッダのLocationですっとばすぐらいしか策を思いつかないが、
Perlには関係ないか。
0887nobodyさん
04/05/19 21:54ID:???ある一つのデータファイルに対して、二つ以上の
Perlプログラムからファイルの読み書きを行う場合、
flockを使っていれば排他処理は問題ないですよね?
0890nobodyさん
04/05/19 22:33ID:ObBdfHPa以前、板違いのところで質問しまいましたが、親切にこちらを紹介して頂いたので
来た次第です。今回は教えを乞いたく伺いました。
私はsendmailを使ってメールフォームCGIを作ろうとしています。しかし、
No recipient addresses found in headerというエラーが出てしまいます。
エラーは受け取り人のアドレスがヘッダーにないといっているようなのですが、
変数の中にはアドレスがきちんと入っているんです。
現在、いろいろ試して最終的なソースはこうなっています。
$honbunていうのがbody部分(のつもり)です
$sendmail = '/usr/lib/sendmail -t';
if(open(SENDMAIL,"| $sendmail")){;
print SENDMAIL <<"EOM";
From: $motoadr_1
To: $mail_to
Subject: $staff_subj
Errors-To: $errmailadr
MIME-Version: 1.0
Content-Type: text/plain; charset="ISO-2022-JP"
$honbun
EOM
close(SENDMAIL);
}
ヘッダーとボディ部分の間は空行で区切ったのですが、これではダメなのでしょうか?お気付きの方はぜひとも教えてくださいませ。
0892nobodyさん
04/05/19 23:22ID:???sendmailに食わしている内容が間違ってる可能性が高いと
思われるので、
open(SENDMAIL,"| $sendmail")
のところを
open(SENDMAIL,"> 適当なファイルのパス")
としてファイルに書き出してよく調べてみることをお勧め
する。
ありがちなのはヘッダ部に埋め込んでいる$ほげほげのどれ
かの末尾に改行がついていて、そこが空行になってしまって
いるって奴だね。
0893nobodyさん
04/05/20 00:32ID:UfxuQY5M#$1,$2,$3に前回のマッチパターンが入っているからなのかうまく行かないことがあります
$s='921010';
my ($year,$month,$day)=($s=~m/^(\d+)(\d\d)(\d\d)$/);
print "$year,$month,$day\n";
$s2='hogemogesage';
($hoge,$moge,$sage) =($s2= ~m/(hoge)(moge)(sage)/);
print "$hoge,$moge,$sage";
->
92,10,10
4294967295,,Hit any key to close this window...
これを避ける簡単な方法ってないですか?
0896nobodyさん
04/05/20 00:54ID:???0897nobodyさん
04/05/20 00:57ID:UfxuQY5Mばかでした
結局
= ~→=~
お騒がせスマソ
0898nobodyさん
04/05/20 02:58ID:746RqQ7wひとつづつopenしてgrepならできるんだけど。
0899nobodyさん
04/05/20 03:14ID:???0901nobodyさん
04/05/20 05:07ID:???grep -nH 特定の文字列 `find ディレクトリ -type f`
# find ディレクトリ -type f | xargs grep -nH 特定の文字列
# find ディレクトリ -type f -exec grep -nH 特定の文字列 {} \;
0902nobodyさん
04/05/20 05:55ID:???apacheなら
http://httpd.apache.org/docs/howto/ssi.html#includingtheresultsofacgiprogram
0905nobodyさん
04/05/20 20:22ID:???それを find にやらせるか、それとも perl が自分でやるか、というだけの違い
0906nobodyさん
04/05/20 20:25ID:???0907nobodyさん
04/05/20 22:11ID:???perlでレスポンスヘッダに含まれるHTTPのバージョンを
変更したいのですが、できるのでしょうか?
レス数が900を超えています。1000を超えると表示できなくなるよ。