Perlコーディング初心者質問スレ Part 50
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/06/26(月) 00:46:38ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0715nobodyさん
2006/07/19(水) 02:04:47ID:???$mon は "11月" じゃなくて "11ヶ月目" なんだろ? +1する必要なんてない。
まあ $day を -1 してる (らしい) のはよかったと思うよw
0716706
2006/07/19(水) 02:12:29ID:aJ2dkknBなんかおかしいな〜と思ってずっとカレンダー見てました
ようやく謎が解けましたw
ありがとうございます
ただ>>711のようにすると100年を超えると解がヌルになるようです
$a = 31536000000;
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime($a);
$year = $year-70;
$mday = $mday-1;
print $year."年".$mon."月".$mday."日".$hour."時".$min."分".$sec."秒";
ヌルにしないためにはどうすればいいっすか?
0717nobodyさん
2006/07/19(水) 02:19:09ID:WORWfBlMこの際、ファイル名にタイムスタンプがついて1153238735__photo.jpgというようになりますが、
この「__photo」の部分を取って「1153238735.jpg」にする方法は無いでしょうか?
Content-dispositionのヘッダを使えばいいらしいですが具体的な方法が解りません。
よろしくお願いします。
0718nobodyさん
2006/07/19(水) 02:20:38ID:???▽2038年問題
http://ja.wikipedia.org/wiki/2038%E5%B9%B4%E5%95%8F%E9%A1%8C
まあ、そんな気になるなら一定の年数分の時間を最初に引いておけば?
0720706
2006/07/19(水) 02:33:21ID:aJ2dkknBわかりました
0721nobodyさん
2006/07/19(水) 13:05:06ID:???SSIをmod-perlで動かすにはどうしたらいいんでしょう?
CGIからmod-perl移行時にindexページはindex.html(SSI)からindex.cgiになるように設定したんですが、
GoogleのページランクとかもあるのでSSIを使いたいんですが、、
mod-perlに移行したらSSIが全く効いていないんです(-o-;
呼び出すperlがindex.plだとしたら、それ単体では問題なく実行されるんですが。。
0722nobodyさん
2006/07/19(水) 13:13:26ID:???http://www.google.co.jp/search?hl=ja&q=perl+SSI+mod_perl&lr=lang_ja
0724nobodyさん
2006/07/19(水) 19:58:46ID:???gmtimeとかって普通に現在時刻+αぐらいを扱うためのものだから、
100ねんとか、それ以上のことやろうとしてるんだったら、
自分でなんか作ったほうがいいと思う・・・
0725nobodyさん
2006/07/19(水) 20:00:25ID:???0726nobodyさん
2006/07/19(水) 20:03:34ID:+wpVYCo5$ENV{"HTTP_USER_AGENT"}
この中の文字列を正規表現とか掛ければいいのでしょうか?
$ENV{"HTTP_USER_AGENT"} =~ /internet explorer/i;
で大丈夫でしょうか?自分はIE6ですので他のバージョン確認できませんので宜しくお願いします
0727726
2006/07/19(水) 20:05:37ID:+wpVYCo5$ENV{"HTTP_USER_AGENT"} =~ /IE/;
これでいいのでしょうか?ちなみにOSは虫です。
0728nobodyさん
2006/07/19(水) 20:17:07ID:???自分のPCなら火狐とかモジラとかオペラとかインストールして
実験すれば?
あとは、自分のページの中で一番アクセスのあるページでユーザエージェントを記録して、
どういうブラウザのアクセスがあるか観察して判断
0729571
2006/07/19(水) 20:40:38ID:+wpVYCo5この雰囲気からすると、そんな簡単なIEとそれ以外の判別方法は存在しないということでしょうか。
確かに今後IEという文字が入るIE以外のブラウザが出る可能性もありまよもんね。
なかなか制作側には不便な環境なんですね。
レスありがとうございました。
もう少しだけ粘ってみます・
0730nobodyさん
2006/07/19(水) 20:47:29ID:???今のところ、User-Agentに"MSIE"が含まれる一般的なブラウザはIEだけ。
0731571
2006/07/19(水) 20:48:27ID:+wpVYCo5これで行こうと思います。
728さんもよければ参考にしてください。
それでは失礼します。
0732571
2006/07/19(水) 20:50:23ID:+wpVYCo5どうやらOperaが危ないようです。
$ENV{"HTTP_USER_AGENT"} =~ /MSIE/ and $ENV{"HTTP_USER_AGENT"} !~ /Opera/;
これで90%程度はいけるのではないかと思いますが。
0733nobodyさん
2006/07/19(水) 21:00:22ID:PWLYocjqUse of uninitialized value in substitution (s///)
というエラーが出ました。例えば下記の場合、@_が問題っぽいんですが、
どのように直したらいいでしょうか。
sub reformat_date {
my %args = (date => '', @_);
my $tmp = $args{'date'};
$tmp =~ s/(\d\d\d\d)(\d\d)(\d\d)/$1-$2-$3 00:00:00/;
return $tmp;
}
0734nobodyさん
2006/07/19(水) 21:04:25ID:???0736nobodyさん
2006/07/19(水) 21:21:25ID:???してるものと仮定して。
my %args = (date => $_[0] );
つかこれだけだったら、%args てまったくの無駄なんだけど…
で、入力は何?
0737nobodyさん
2006/07/19(水) 21:22:42ID:???ブラウザの「戻る」を押すと、入力フォームにデータが残ってる状態です。
二重のpostを防ぐために、postした後、戻るを押すと、
「ページの期限切れ〜」みたいな表示にする方法は無いんでしょうか?
0738nobodyさん
2006/07/19(水) 21:23:48ID:???0740733
2006/07/19(水) 21:34:01ID:???こういうシンプルなのも%argsになってます。736さんのように変更してもだめでした。
ていうか、全く同じ関数をテスト用のシンプルなコードに書いたら
エラーがでませんでした。-wは呼び出し元との兼ね合いでもエラー出すんでしょうか。
0741nobodyさん
2006/07/19(水) 21:36:59ID:???reformat_date( date => $hoge )
とかやってて、$hoge が未定義(undef) なんじゃないの?
$tmp =~ s/(\d\d\d\d)(\d\d)(\d\d)/$1-$2-$3 00:00:00/ if (defined $tmp);
とかにしてみればどうよ
0742733
2006/07/19(水) 21:37:48ID:???0743733
2006/07/19(水) 21:43:08ID:???呼び出し側が場合によって未定義のときがあったのが原因でした。
てっきり、字面だけでデバッグされているのかと勘違いしてましたので
呼び出し側をチェックしてませんでした。
ありがとうございました!
0745nobodyさん
2006/07/19(水) 22:22:19ID:???pragma no-cacheあたりで検索
まあ、そういう仕様の板が便利かどうかは微妙な気もするけど、
むしろ、パスワードで削除機能とかの方がエレガントなような・・・?(作るのはめんどくさいけど
0747nobodyさん
2006/07/20(木) 00:14:49ID:???print "pragma:no-cache\n\n";
とかこういうこと?それともパスワード機能の実装の仕方自体語れってこと?
後者だったら拒否w
0748nobodyさん
2006/07/20(木) 00:42:07ID:EXDq6RmQsub main{
local @tmp = ("aa","bb");
print "$tmp[0]"." "."$tmp[1]\n";
&subroutine(\@tmp);
print "$tmp[0]"." "."$tmp[1]\n";
}
sub subroutine{
local $tmp = @_[0];
$tmp = ("cc","dd");####################################
print "$tmp->[0]"." "."$tmp->[1]\n";
}
というコードを書きました。
しかし#############の行でエラーになってしまいます。
要するにmainルーチンから@tmpのポインタを送ってサブルーチン側では@tmpに("cc","dd")を代入したいのです。
サブルーチンで
$tmp->[0] = "cc";
$tmp->[1] = "dd";
とやれば済むのですが、こうではなくて = ("cc","dd")という風に代入したいのです。(実際はsplitとかを使って代入するから)ポインタを使ってどういう風にしたらよいかわかりません。ご教授おねがいします。
0749nobodyさん
2006/07/20(木) 00:48:05ID:???@{ $_[0] } = ("cc", "dd");
}
こういう事?
他の部分に関してはつっこんだら負けかなと思っている
0750748
2006/07/20(木) 00:50:00ID:EXDq6RmQ即レスありがとうございます。
そのようにやったらできました、ありがとうございました!
0754nobodyさん
2006/07/20(木) 09:22:01ID:???0755nobodyさん
2006/07/20(木) 09:42:37ID:???0756nobodyさん
2006/07/20(木) 11:10:49ID:OwGfxrortest.cgiが呼ばれたときにtest.cgiの中で、まず初めにaccess.cgiを起動実行させてから
test.cgiの本処理に映りたいのですがさすがに無理でしょうか?
access.cgiはgif画像を一つ返してくるだけです。
0757756
2006/07/20(木) 11:37:22ID:OwGfxroruse LWP::UserAgent;
my $ua = new LWP::UserAgent;
$ua->agent('AgentName/0.1'.$ua->agent);
# リクエストを作成
my $req = new HTTP::Request(POST => 'http://hoge.com/access.cgi');
$req->content_type('application/x-www-form-urlencoded');
$req->content("id=get");
# ユーザ・エージェントにリクエストを渡し、返されたレスポンスを取得
my $res = $ua->request($req);
# print $res->is_success;
昔作ったCGIから拾ってイジッテいちおうこれで呼び出しはできたのですが、
access.cgiに自分のとは違うIPが記録されてしまうようです。
アクセス管理CGIの都合上できればIPが別のものになってほしくないんです。
また、できればネット経由でない方法で呼び出せればと思ったのですが。
cron使用の呼び出しと同じような感じができて、さらにIPが自分のものか127.0.01とかなら最高なんですが。
どうぞ玄人の方お助け宜しくお願いします。
0758nobodyさん
2006/07/20(木) 11:47:34ID:???0759nobodyさん
2006/07/20(木) 12:01:19ID:WCdGbBzjところが、openでエラーになります。
majordomoのファイルが
オーナー:mail
グループ:deamon
属性:777
なのが原因だと思うのですが、このファイルを上記条件から書き換えるようにするには、cgiのプログラム
からどのようにしたら良いでしょうか?
0760nobodyさん
2006/07/20(木) 12:12:22ID:???$!の値も示せよ。
0761756
2006/07/20(木) 12:13:08ID:OwGfxror0762nobodyさん
2006/07/20(木) 12:16:44ID:???その理屈ならYAHOOは死刑になっちゃいそうな勢いだな。
あんな有名なサイトが無許可で他人のサイトのアドレスを晒しまくって。
とりあえず削除申請してこいよ。
0763756
2006/07/20(木) 12:24:17ID:OwGfxror荒れるから止めて欲しいのですm(__)m
私あてのレスです。
本人である私がスルーしてるのですから、察してくださいませんか。
宜しくお願いします。
0764nobodyさん
2006/07/20(木) 12:35:40ID:???system('perl access.cgi');とか?
というか、そのaccess.cgiの返してくる画像は必要なんですか?
画像だけが、必要なら<img src="access.cgi">とか?
でも、そのくらい知ってそうっていう雰囲気ですよね・・・・・・・・
なんだろう・・・
0765756
2006/07/20(木) 12:46:10ID:OwGfxror言葉足らずだったかもしれません。ごめんなさい。
access.cgiはアクセスログを取っていくcgiなんです。
test.cgiは今仮で作ってるアクセス解析cgiなんです。
test.cgiからaccess.cgiを呼びたいのは最新の情報を読みたいからなんです。
つまりaccess.cgi直後のaccess.logが一番精度が高いわけです。
秒単位で誰がどこにいるかを表示してますので意外と重要なのです。
ですからaccess.cgiからの戻り値はまるでいりません。
要はaccess.cgiに処理をさせればいいだけなんです。
それこそ最悪access.cgiの中身をtest.cgiに書いて解決です。あまりにひどい決着ですが。
返してくるgif画像自体はまるでいりません。
長文すみません。ご飯を食べてまいります。
0766nobodyさん
2006/07/20(木) 13:09:01ID:???0767756
2006/07/20(木) 13:10:51ID:OwGfxrorexampleですね。ありがとうございます。
以後そういたします。
0768nobodyさん
2006/07/20(木) 13:13:04ID:???その前になぜかむかつくんだがなんでだぜ?
0769nobodyさん
2006/07/20(木) 13:20:02ID:???0770759
2006/07/20(木) 13:32:32ID:WCdGbBzj権限の問題だと思うのですが・・・どうすれば処理できるでしょうか?
0771756
2006/07/20(木) 13:32:50ID:OwGfxror呼び出したいがためだけにaccess.cgiに手を加えるのは避けたかったです。
他のケースのときでも全部そうなってしまうのは愚の骨頂みたいに思ってましたが
その認識が間違ってるのですかね。
ちょっとガッカリです。
0772nobodyさん
2006/07/20(木) 13:37:48ID:???0773nobodyさん
2006/07/20(木) 13:38:45ID:???ファイル自体が777なのでそれは問題ないと思うから経由するディレクトリだろうな。
どういう風にパス指定しているのかは知らないが関係するディレクトリを全部確認してみ。
0775nobodyさん
2006/07/20(木) 13:44:36ID:???へぇ。Operaは何がしたいんだろう・・・・
そもそも偽装するなよって話だよな。製作者への嫌がらせとしか思えない。
製作者協会とかあればなぁ。ふざけた実装を排除していけるのに。
>>768
まあまあ。今日はなかなかすごしやすい気温なんだからおっとりしようぜ
0777nobodyさん
2006/07/20(木) 13:48:44ID:???0778756
2006/07/20(木) 13:55:49ID:OwGfxrorいえ、それは勘違いですよ・・・(´・ω・`)
0779nobodyさん
2006/07/20(木) 13:58:35ID:???UAにIEを含んだらヤフにでも飛ばしたろとか思ったことあるはずだ
0780nobodyさん
2006/07/20(木) 14:05:54ID:???違うよ。
>>779
ん?なんか変だぞ?
そもそも「XHTML+CSSで凝ったサイト作ろうと」ってのがどうなんだろうか。
XHTMLやCSSは目的を果たすための一つの手段に過ぎないというのに、
その手段を目的としてるということは、何かを伝えたいんじゃなくて、使いたいだけという可能性もあるな。
それこそIEの挙動なんて無視すればいいじゃない。使いたいだけなんだから。
なんちゃって。人間がそれほど単純なら苦労はないよね。
やっぱり制作協会ってのがあればいいと思うんだよな。
0781nobodyさん
2006/07/20(木) 14:08:55ID:???0782nobodyさん
2006/07/20(木) 14:10:18ID:???access.logの内容はIPとかUAとか時刻とかがずらずら並んだ状態ですか?
もしそうだったら、別にいつ読み込んでも、新鮮とか新鮮じゃないとか
関係ない気がしますが・・・
それとも、なんか特殊な、フォーマットのデータがaccess.logには含まれてるんでしょうか?
0783759
2006/07/20(木) 14:11:14ID:WCdGbBzj/usr/local/majordomo/lists/ なので上位全ての777にするのは気がひけます。
listsだけは 777 にしみましたが、同じエラーでした。
linuxのfs設定で何かあるのでしょうかねぇ?
0784756
2006/07/20(木) 14:14:40ID:OwGfxrorありがとうございます。
ずらずら並んだ状態です。
アクセス時刻ももちろん並んでおります。アクセス時刻が一定を過ぎると削除し
リアルタイムで誰がどこにいるかをある程度特定するアクセスプログラムになっております。
ですので新鮮さは重要なのです。
でももう最悪の方法で片付けてしまいました。せっかくご親切に気に掛けていただいたのにすみませんです。
access.cgiの一部をそのままコピペしましたtest.cgiにorz
0786nobodyさん
2006/07/20(木) 14:19:19ID:???また同じこと繰り返すことになるぞ
0787nobodyさん
2006/07/20(木) 17:29:45ID:gqKAMnqO1)combbslog.cgiというファイルを一行読み込んで
$rl,$yl,$gl,$wl,$blにそれぞれの値を代入して
すべてが1より大きければ実行する。
プログラムを書いてみたつもりです。
ちなみにcombbslog.cgiの中身は
<>1<>3<>1<>1<>1<>
↑こんな感じです
2)open(IN,"combbslog.cgi") || &error("Open Error: combbslog.cgi");
local(@file) = <IN>;
close(IN);
local($rl,$yl,$gl,$wl,$bl) = split(/<>/);
if(($rl > 1) && ($gl >1) && ($yl > 1) && ($wl > 1)){実行したい内容;}
3)とくにエラーなどは出ないのですが条件を満たしていても実行されません。
ファイルを読み込む当たりが良くわかっていないのでそのあたりがおかしいのではないかと思っています。
どこかおかしいところがありましたら教えてください。
0788nobodyさん
2006/07/20(木) 17:38:15ID:???とりあえず
print $rl,$yl,$gl,$wl,$bl;
してみろ
0789nobodyさん
2006/07/20(木) 17:44:06ID:???if文の所。
>
の演算子の意味はわかってるよね?1には反応しないよそれじゃあ。2からだな
だからファイルの中身が全部2以上なら実行されるだろうね。
0790nobodyさん
2006/07/20(木) 17:48:57ID:???$rlの値がいつも空になると思うよ。
split(/<>/) だと
$rl<>$yl<>$gl<>$wl<>$bl<> こうでしょ。
>>788
> データファイルに*.cgiという拡張子をつけるのはおかしい。
( ´_ゝ`)・・・
>>789
すべてが1より大きければ実行する。ってことだからいいんじゃないの
0792787
2006/07/20(木) 18:00:12ID:???とりあえず全部2以上にしてみて
あと$rl<>$yl<>$gl<>$wl<>$bl<>にしてみますね
0793787
2006/07/20(木) 18:13:32ID:gqKAMnqO上記のことをやってみましたが出来ませんでした・・・
ためしに
print $rl,$yl,$gl,$wl,$bl;
しても何も表示されなかったのでどこか他のところがおかしいのかな?
以下にプログラム全文載せますので、もしよろしかったらまたお願いします。
-selectcol.cgi-
#!/usr/bin/perl --
open(IN,"combbslog.cgi") || &error("Open Error: combbslog.cgi");
local(@file) = <IN>;
close(IN);
local($no,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$tim,$rl,$yl,$gl,$wl,$bl) = split(/<>/);
print $rl,$yl,$gl,$wl,$bl;
__END__
-combbslog.cgi-
1<>2006/07/20(Thu) 00:06<>blackh.gif<><><>北朝鮮がミサイルを発射することで国際社会からより疎外されている<><>127.0.0.1<><>1153321603<>2<>2<>2<>2<>2<>
0794nobodyさん
2006/07/20(木) 18:17:11ID:???.r‐――'i / > _ ,ノ~';;. .....,,、 l´゙|゛ |´゙l゙ ,,,,,,,...... --、,
. ̄ ゙̄} | / ./ .;;./ '、 / ,./ ,! ./____| |__________、 ,,............-! !ー'''"゙.l .ヽ --‐= /
.r‐―" |'l゙_,,, ̄'i --、'ッ / / ./ ...........、 ,,................,! ゙‐'ー''''''''''、 '.l゙´_,,,, 、 /./
l |゙゙゙゙"'".._.... ! .|........ニ / / / / || .l'''''''''''''''''''_.゛,,.... --′ ./ .イ-―ー 、
! .―--ィ .! .r‐''i .r‐‐i ! ..l ヽ. ゙'/l'''''''''''''′゙'''''''''''''''i `゙゙゙゙゙゙´゙_,゙,゙,,,,゙;;..\, ./ ,..-''''^゙゙゙゙゙''''、 ヽ
.゙‐'"^゙| ! .| .゙‐'''" !―" | \ .\. `゙゙゙゙゙゙゙゙゙| .!゙゙゙゙゙゙゙゙゙´ ,r'",, ---- ..,,/ < / .| |
.| ! .゙‐'゙゙゙゙゙! .!゙゙.l゙'│ .\. ゙'-, ,! ! ! l゙ ゛ ._./ ./
.,,,,,,,ノ !.r‐―ー" ゙''二、ヽ .\ .゙> .!^^^^^^^^^゛ `^^^^^^^^.! .\`'''''''''''''''''''''> 'l'''''''''^゙゙_,,..-'゛
.ゝ--‐゛ ゙‐''"゙ ̄´゛ `'´ ` . ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄゛ `゙゙''''''''''''''''"  ̄ ̄゛
0795nobodyさん
2006/07/20(木) 18:19:15ID:???local(@file) = <IN>;
ぢゃなくて
@_ = <IN>;
なら動くんで内科医?
0796nobodyさん
2006/07/20(木) 18:19:15ID:???あえてソコだったんだがただのかわいそうな人になってしまったw
0798787
2006/07/20(木) 18:25:43ID:gqKAMnqO>>795さんのいうとおりにしたら
error500
CGIエラー-Content-Typeヘッダが正しくありません。
とでてしまいました。これはどういうことでしょうか?
0799nobodyさん
2006/07/20(木) 18:25:51ID:???おかしいと思う理由が知りたいんだが
0800nobodyさん
2006/07/20(木) 18:27:34ID:???0801nobodyさん
2006/07/20(木) 18:29:28ID:???っつーかもう触れないでくれw
どおりで俺の冗談には誰も笑わないわけだ
0803nobodyさん
2006/07/20(木) 18:32:45ID:???> close(IN);
> local($no,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$tim,$rl,$yl,$gl,$wl,$bl) = split(/<>/);
$_ に何入ってんだよwww
foreach (@file) {
local($no,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$tim,$rl,$yl,$gl,$wl,$bl) = split(/<>/);
・・・
}
こうしたいんじゃねえのかい?
0804nobodyさん
2006/07/20(木) 18:33:56ID:???0805nobodyさん
2006/07/20(木) 18:34:18ID:???print "Content-type: text/html\n\n";
を出力の前に入れないと駄目でしょ。
それと>>793が全文だとすると、sub error はいずこへ
0807nobodyさん
2006/07/20(木) 18:35:31ID:???ブラウザでやってんの?
なら
つ【print "Content-type: text/html;\n\n"】
0808nobodyさん
NGNG0809787
2006/07/20(木) 18:41:17ID:gqKAMnqOパーミッションの設定はまだ関係ないですよね。
0810787
2006/07/20(木) 18:44:23ID:gqKAMnqO>>803さんや>>805さんのとおりにしてみたらエラーは出なくなりました。
ただ何も出力されてきません。
0811nobodyさん
2006/07/20(木) 18:48:34ID:???とりあえず
open(IN,"combbslog.cgi") || &error("Open Error: combbslog.cgi");
print <IN>;
close(IN);
とかからやってみたら。
あと無意味に local 使ってるのが kentくさくてイヤ。
0812787
2006/07/20(木) 18:51:54ID:???はい、デバックは自分で頑張ってみますね。
Kentさんのところをすごく参考にしていたのでそうなってしまいました。
0813787
2006/07/20(木) 18:55:45ID:gqKAMnqOファイルを読み込むとき
最初の一行だけを読み込むとか出来ますか?
0814789
2006/07/20(木) 18:57:06ID:???まあ雨がひどいからな。
■ このスレッドは過去ログ倉庫に格納されています