Perlコーディング初心者質問スレ Part 47
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/03/01(水) 15:39:31ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0249nobodyさん
2006/03/19(日) 15:23:23ID:???ttp://allabout.co.jp/career/cgiperl/closeup/CU20050131A/index3.htm
ここ参考にしてそのままコピペしてもエラーになるのはなんで?
モジュールはちゃんとインストールされてる
0250nobodyさん
2006/03/19(日) 15:47:58ID:???1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
0251nobodyさん
2006/03/19(日) 15:56:26ID:???よーしパパ暇だから両者の言い分を解説しちゃうぞー
>>244の言い分
$ perl -MO=Terse -e 'qq[hoge].$x.qq[fuga]'
$ perl -MO=Terse -e 'q[hoge].$x.q[fuga]'
を見るとバイトコードレベルで行われる処理は同じである。
>>245の言い分
パーサが変数の展開を考慮しなくてはいけなくなるのだから、
""の方が必要な処理は多いはずだ。
で、5.8.7でバイトコードを覗いてみると、""はパース時に中に変数展開が
含まれていた場合のみ連結を行うバイトコードに変換されるので、
そんなに気にする必要はないと思われる。古いバージョンではどうか知らないけど。
それよりも可読性等を重視するべきだと思う。
0252nobodyさん
2006/03/19(日) 16:03:07ID:???こんな古い言葉使ってる老人って・・・。
0253nobodyさん
2006/03/19(日) 17:56:12ID:???\"でエスケープした場合も実は対して気にするレベルじゃ無さそうなのかな。
0254nobodyさん
2006/03/19(日) 17:59:18ID:???0255nobodyさん
2006/03/19(日) 18:10:48ID:???負荷が馬鹿にならないレベルだと、ちょっとの差が大きな違いになりそうじゃない?
0256nobodyさん
2006/03/19(日) 18:12:55ID:???モジュール同士、CGIで動作のどちらでやっても速度はperl>phpになるだろうし、
perl以外に良い選択肢ってそもそも有るんだろうか。
Cは流石にだるいし。
0257nobodyさん
2006/03/19(日) 18:15:33ID:???0258nobodyさん
2006/03/19(日) 18:15:59ID:3oCqRbiL0259nobodyさん
2006/03/19(日) 18:22:14ID:???phpは軽い早いって嘘って事?
0260nobodyさん
2006/03/19(日) 18:27:56ID:???大きな違いがある場所では、xs とか書けばよいのでは?
んで、そんなものを鯖 1 台でさばくんかね?
> phpは軽い早いって嘘って事?
一部嘘かもね。ぐぐればいろいろベンチあるぞ。
0261nobodyさん
2006/03/19(日) 18:36:18ID:???0262nobodyさん
2006/03/19(日) 18:46:28ID:???0263nobodyさん
2006/03/19(日) 18:49:15ID:???perlcc -B
0264nobodyさん
2006/03/19(日) 21:10:06ID:???ただ、眉毛剃ると空気抵抗が減って走るの早くなるよ、
ってのと同じレベルの話なわけだが。
まぁ、初心者でもできるしお手軽だわなw
0265nobodyさん
2006/03/19(日) 21:11:40ID:???0266nobodyさん
2006/03/19(日) 21:22:33ID:???0267nobodyさん
2006/03/19(日) 21:27:36ID:???0268nobodyさん
2006/03/19(日) 21:28:35ID:???0269nobodyさん
2006/03/19(日) 21:41:19ID:???結局、そういうことだよね。
' ' の方が速くなる気がして気持ちぃー (気のせい) って香具師はそうすりゃいいし、
開発効率&可読性を取るぜー (現実的) って香具師はそうすりゃいい。
0270nobodyさん
2006/03/19(日) 21:42:41ID:???どうせ色分けしてるし。
0271nobodyさん
2006/03/19(日) 21:48:41ID:???0272nobodyさん
2006/03/19(日) 21:56:33ID:???0273nobodyさん
2006/03/19(日) 22:00:31ID:???0274nobodyさん
2006/03/19(日) 22:29:27ID:???0275nobodyさん
2006/03/19(日) 22:33:21ID:???> perlcc -B
こういう運用ってしてるの見たことがないなぁ。
0276nobodyさん
2006/03/19(日) 22:39:47ID:???0277nobodyさん
2006/03/19(日) 22:47:43ID:???> perlcc -B
と
> mod_perl使えってことでは
が同値であるということにしたいのですか?
0278nobodyさん
2006/03/19(日) 22:55:36ID:???0279nobodyさん
2006/03/19(日) 22:55:54ID:???mod_perlも用意してなかった環境でチャットスクリプトを動かすときに一度だけ実際にやったことがある。
もう忘れたけどtimeを取ってみたら確か200ms位が80ms位になったと思った。
0284nobodyさん
2006/03/20(月) 11:06:50ID:???0285nobodyさん
2006/03/20(月) 11:19:22ID:???0286nobodyさん
2006/03/20(月) 11:32:49ID:???0287nobodyさん
2006/03/20(月) 12:26:15ID:???0288nobodyさん
2006/03/20(月) 12:34:37ID:???と
open FILE,"< hoge.cgi";
の違いはないみたいだけど正しいのはどっち?
0290nobodyさん
2006/03/20(月) 16:59:39ID:f3pQ7Duw24時間(0時)に一度処理を行うというcgiを作りたいのですが、
どうすればいいでしょうか?
多分スレッドなどを使うことになるとは思うのですが、
その処理が動いている間は、同じ処理が二重で動かないようにしたいです。
シーケンスとしては以下のようなものをイメージしているのですが・・・。
main {
ボタンを押す;
if(既にスレッドが立ち上がってなかったら){
スレッドで th 実行;
}else{
print "既に起動中です。";
}
}
sub th{
while(1){
if(0時になったら){
処理実行;
}
}
}
よろしくお願いします・・・m(_ _)m
0292nobodyさん
2006/03/20(月) 17:14:33ID:f3pQ7Duwどもです!
すみません、環境を書いていませんでした・・・。
環境が開発がWindows環境で、実際に稼動させるのがLinuxなんですよね。
テストの面などからできれば、環境に依存しない方法はないでしょうか?
0293nobodyさん
2006/03/20(月) 17:18:02ID:???ただ、あなたの現状では使えるようになるまで莫大な時間を要するでしょうけど。
0294nobodyさん
2006/03/20(月) 17:26:03ID:???いずれにしろCGI&スレッドでやるべき仕事じゃあないでしょ。
0295nobodyさん
2006/03/20(月) 17:28:55ID:???ってことで、
> Windows なら「タスク」とかも使えるんじゃないかな。
ってのはだめだとおもう。
0296nobodyさん
2006/03/20(月) 17:30:39ID:???アクセスした時にtimeで時間取得して、設定時間以上経ってたら
実行+次回の実行時間(全開の実行時間+間隔)に書き換えでダメなん?
0297nobodyさん
2006/03/20(月) 17:32:24ID:???> 実行+次回の実行時間(全開の実行時間+間隔)に書き換えでダメなん?
それって、0 時に複数のアクセスがあった場合どうなる?
やっぱ初心者が初心者の質問に初心者知識で答えるスレだね。
0298nobodyさん
2006/03/20(月) 17:38:18ID:???そんなにシビアに考えないといけないもの?
0299nobodyさん
2006/03/20(月) 17:41:52ID:???> まず、実行予定時間の書き換えしてから、引き続き処理なら問題なさそうに感じるけど、
nfs 上にファイルがあったらどうなるだろう。
0300nobodyさん
2006/03/20(月) 17:47:20ID:???だけど、考慮しないといけないものなの?
普通にデータをtmpに出力して入れ替えるなら気にしなくて良さそうに感じるけど。
0301nobodyさん
2006/03/20(月) 17:48:10ID:???0302nobodyさん
2006/03/20(月) 17:50:41ID:???0303290
2006/03/20(月) 18:30:28ID:f3pQ7Duw>>296
>>298
の両氏のやり方でも、機能上は構わないと思うのですが、
なんかお客さんにケチつけられそうなので、
できればユーザー任せなやり方は避けたいのです。
また>>297氏のようなパターンも考えなくてはいけないので・・・。
0304nobodyさん
2006/03/20(月) 18:37:31ID:???藻前が VMware Player で実験環境作れば済むはなししではないよね。
Perl on Windows なり Cygwin でどれだけ工夫するかってのが争点だもんね。w
0305nobodyさん
2006/03/20(月) 19:59:01ID:???アクセスがあったときにファイルロックする
データファイル読む
実行時日付と前回の日付が異なれば実行
処理
ロック解除
普通の処理ジャマイカ
0306nobodyさん
2006/03/20(月) 21:47:27ID:???0307nobodyさん
2006/03/20(月) 21:48:19ID:???そんなことも判断できない奴に委託しているとは、客が可哀想すぎる。
0308nobodyさん
2006/03/20(月) 21:57:43ID:???その一回の処理のときに複数実行されたらどうすんだヴァカ
0311nobodyさん
2006/03/21(火) 02:12:17ID:???説明希望されると居なくなったし。
0312nobodyさん
2006/03/22(水) 16:11:05ID:1dP8qtcFテストhttpサーバ上では問題なく動作したのですが、apacheで動作させようとしたところ
Internal Server Error が出ます。
原因は ./script/app_cgi.pl を起動すると
Use of uninitialized value in string ne at /Library/Perl/5.8.6/Catalyst/Engine/CGI.pm line 63.
Use of uninitialized value in numeric eq (==) at /Library/Perl/5.8.6/Catalyst/Engine/CGI.pm line 83.
Use of uninitialized value in pattern match (m//) at /Library/Perl/5.8.6/Catalyst/Engine/CGI.pm line 128.
がContent-type より先に出力されている模様。。。
どうすればこの「Use of uninitialized value」消せますか?教えてエロ委人。
0313nobodyさん
2006/03/22(水) 19:12:48ID:???もし -W で動作したいなら CGI.pm の該当行の初期化されてない変数への参照部分を
書き換えてやればいいかと思う
0314nobodyさん
2006/03/22(水) 19:53:47ID:???これらの環境変数が渡ってこないapacheも珍しい
気がする。
63 last PROXY_CHECK if $ENV{REMOTE_ADDR} ne '127.0.0.1';
83 if ( $ENV{SERVER_PORT} == 443 ) {
128 last PROXY_CHECK if $host !~ /localhost|127.0.0.1/;
$hostの値を入れてるのは
113 my $host = $ENV{HTTP_HOST} || $ENV{SERVER_NAME};
実行環境おかしくない?
0315nobodyさん
2006/03/22(水) 20:12:30ID:???0316nobodyさん
2006/03/22(水) 20:37:57ID:???0317nobodyさん
2006/03/22(水) 22:05:59ID:???internal server errorになってる原因は別にあると見た。
apacheのエラーログをちゃんとさらした方が回答つきやすいと思われる。
コンソールで実行してもいいけどうまく環境あわせて作ってやらないと
意味ないよ。
0318nobodyさん
2006/03/23(木) 18:41:32ID:b3UifQ+V<weblog name="ほげ山ほげ男" url="http://hoge.com" where="saitama" />
<weblog name="ほげ川ほげ子" url="http://hoge.com/hoge/hoge.html" where="nagano" />
<weblog name="ほげ本ほげ太" url="http://hoge.com/hoge3/hoge.html" where="gunma" />
</weblog1>
↑から、name(氏名)とurlのみを抽出するようにするにはどのように書いたらよいでしょうか?
具体的には、一行ごとに読み込んで↓のような形にしたいのですが。
ほげ山ほげ男 → http://hoge.com<br>
ほげ川ほげ子 → http://hoge.com/hoge/hoge.html<br>
ほげ本ほげ太 → http://hoge.com/hoge3/hoge.html<br>
0319nobodyさん
2006/03/23(木) 19:07:35ID:???$weblog_name = $1;
$weblog_url = $2;
$weblog_where = $3;
すげぇ適当w
0321nobodyさん
2006/03/23(木) 20:35:16ID:???#!/usr/bin/perl
m|^\s*<weblog\s+name="([^"]*)"\s+url="([^"]*)"\s[^>]*/>|
&& print "$1 → $2<br>\n" while <DATA>;
__DATA__
<weblog1>
<weblog name="ほげ山ほげ男" url="http://hoge.com" where="saitama" />
<weblog name="ほげ川ほげ子" url="http://hoge.com/hoge/hoge.html" where="nagano" />
<weblog name="ほげ本ほげ太" url="http://hoge.com/hoge3/hoge.html" where="gunma" />
</weblog1>
0322318
2006/03/23(木) 20:36:55ID:???馬鹿ばっかりですね。ここ。
0324nobodyさん
NGNG0325nobodyさん
2006/03/23(木) 21:54:35ID:???長くてもいいんならホレ
while (<DATA>) {
@pair = split / /;
foreach (@pair) {
s/"//g;
($name, $value) = split /=/;
print "$value → " if ($name eq "name");
print "$value<br>\n" if ($name eq "url");
}
}
exit;
__DATA__
<weblog1>
<weblog name="ほげ山ほげ男" url="http://hoge.com" where="saitama" />
<weblog name="ほげ川ほげ子" url="http://hoge.com/hoge/hoge.html" where="nagano" />
<weblog name="ほげ本ほげ太" url="http://hoge.com/hoge3/hoge.html" where="gunma" />
</weblog1>
0326nobodyさん
2006/03/23(木) 21:59:32ID:???0327nobodyさん
2006/03/23(木) 23:05:38ID:???わざわざ小一時間かけなくともすべて解決なのでは。
0328nobodyさん
2006/03/23(木) 23:07:22ID:???0329nobodyさん
2006/03/23(木) 23:19:38ID:???俺は幼稚園児だから、このスレの内容は役に立つぜ
0331ヽ(´ー`)ノ ◆.ogCuANUcE
2006/03/24(金) 00:14:44ID:???my $xml = XMLin('test.xml');
my %hash = map { $_ => $xml->{'weblog'}->{$_}->{'url'} } keys %{$xml->{'weblog'}};
これでいいんか。
0332nobodyさん
2006/03/24(金) 01:37:23ID:???普通に読めません
解説おながいm(_ _)m
0333ヽ(´ー`)ノ ◆.ogCuANUcE
2006/03/24(金) 04:53:24ID:???何が分かんないの?
0334nobodyさん
2006/03/24(金) 07:11:35ID:???0335nobodyさん
2006/03/24(金) 08:44:36ID:???/^<weblog .*\/>/ or next;
my ($name) = /name="([^"]+)"/;
my ($url) = /url="([^"]+)"/;
print "$name → $url<br>\n";
}
こんなのでいいじゃん。
0336nobodyさん
2006/03/24(金) 14:43:34ID:???0337nobodyさん
2006/03/24(金) 15:23:55ID:FdXgD3Atprint "A:".$num."\n";
$num = int($num);
print "B:".$num."\n";
上記のスクリプトの出力が
A:115
B:114
になってしまうのですが
どうしてでしょうか?
0338ヽ(´ー`)ノ ◆.ogCuANUcE
2006/03/24(金) 15:33:13ID:???そういうもん。これが一番良くまとまってるかな。
ttp://d.hatena.ne.jp/babie/20051212
0339337
2006/03/24(金) 15:40:10ID:FdXgD3Atサンクスです
use Math::BigFloat;
を使うことにしました
0340nobodyさん
2006/03/24(金) 16:27:21ID:vZMLwEvxmy $random_code = shift @lines;
chomp $random_code;
# 投稿コードとログのコードを比較して合ってなければ
if ($FORM{'submit_code'} ne $random_code) {
&Error("Error: あなたの直前に書き込んだ人がいるため,投稿コードが更新されています。<BR>リロードしてからもう一度書き込んで下さい。");
}
# 新しい投稿コードを生成。srand は既にやってあるので省略
my $new_random_code = int(rand(100000));
これをkentweb対応にしたいんだけど何処を変えればいいんですか?
教えてください。
0341nobodyさん
2006/03/24(金) 17:25:06ID:???0342長猫@MFC屋さん
2006/03/25(土) 00:17:26ID:???直すポイントは3つです。
1.書き込みをログファイルに保存するとき
⇒ログファイルの先頭行に、ランダムな文字列の行(これを投稿コードとします)を保存するようにして下さい。
2.書き込みを画面に表示するとき
⇒ログファイルの先頭行から1.のランダムな文字列の行(投稿コード)を読み出し、
入力フォーム内にhiddenパラメータとして埋め込んで下さい。
3.書き込み実行して、フォーム内容をチェックするとき
⇒ログファイルの先頭行から投稿コードを読み出し、
2.で入力されたhiddenパラメータと一致するか判定して下さい。
一致しなかったら
"Error: あなたの直前に書き込んだ人がいるため,投稿コードが更新されています。
リロードしてからもう一度書き込んで下さい。"
等のエラー画面を表示するようにして下さい。
一致したら、また新たな投稿コードを作成して、ログファイルの先頭行に保存して下さい。
以上。
0343nobodyさん
2006/03/25(土) 05:40:14ID:???・ほにゃらら
<input type="test" name="ほにゃらら" size="30" value="">
</FORM>
-----------------------------------------
shtml(SSI)に、フォームメールのスキンを書いてます。
<!--#echo var="環境変数"-->これを、valueの中に
入れたいんですが、そのまま書いたらエラーでました。
perlだとvalue=$ENV{'環境変数'}でいけるんですが。
よろしくお願いします。
0345nobodyさん
2006/03/25(土) 12:00:18ID:???0347nobodyさん
2006/03/28(火) 12:50:58ID:???0348nobodyさん
2006/03/28(火) 16:29:29ID:giiJxdDY<input type=checkbox name=ch2 value="2,">い
<input type=checkbox name=ch3 value="3,">い
<input type=checkbox name=ch100 value="100,">ん
このような感じで沢山のチェックボックスを元に、formでPOSTした時、
チェックされている全てのチェックボックスのvalue値を繋げて、
"1,2,3,4,〜100,"のような形で、$strにいれたい場合、
$str = $in{'ch1'}.$in{'ch2'}.$in{'ch3'}.…$in{'ch100'};
のような表記しかないのでしょうか?
チェックボックスの数は変動するので、
forを使って、もっと綺麗に書けないものかな?と、思いましたので。
■ このスレッドは過去ログ倉庫に格納されています