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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/03/01(水) 15:39:31ID:???
Perlのコーディングで困ってる人のスレです。 

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

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

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

過去ログやお勧めサイトは >>2-10 
0249nobodyさん2006/03/19(日) 15:23:23ID:???
RSSの取得がうまくいかない

ttp://allabout.co.jp/career/cgiperl/closeup/CU20050131A/index3.htm

ここ参考にしてそのままコピペしてもエラーになるのはなんで?
モジュールはちゃんとインストールされてる
0250nobodyさん2006/03/19(日) 15:47:58ID:???
>>1

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
0251nobodyさん2006/03/19(日) 15:56:26ID:???
>>244-248
よーしパパ暇だから両者の言い分を解説しちゃうぞー

>>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:???
そもそも文字列処理の速度で悩むような案件に perl なんか使うのかなぁと思う。
0255nobodyさん2006/03/19(日) 18:10:48ID:???
でも規模が大きいとか、処理が重いとか、ゲームCGIだったりとかで、
負荷が馬鹿にならないレベルだと、ちょっとの差が大きな違いになりそうじゃない?
0256nobodyさん2006/03/19(日) 18:12:55ID:???
あと、セキュリティの問題からmod_php使ってるレン鯖は少ないらしいから、
モジュール同士、CGIで動作のどちらでやっても速度はperl>phpになるだろうし、
perl以外に良い選択肢ってそもそも有るんだろうか。
Cは流石にだるいし。
0257nobodyさん2006/03/19(日) 18:15:33ID:???
お前らおもしろいな
0258nobodyさん2006/03/19(日) 18:15:59ID:3oCqRbiL
ならない。
0259nobodyさん2006/03/19(日) 18:22:14ID:???
>セキュリティの問題からmod_php使ってるレン鯖は少ないらしいから、

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:???
ま、初心者でもできると言う意味じゃお手軽だし別に気にしてもいいとは思うがねw
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:???
水泳選手はすね毛とかの体毛全部剃るけどなw
0267nobodyさん2006/03/19(日) 21:27:36ID:???
で、水泳初心者がすね毛とかの体毛全部剃るのに意味があるのかと
0268nobodyさん2006/03/19(日) 21:28:35ID:???
きもちぃぞ
0269nobodyさん2006/03/19(日) 21:41:19ID:???
>>268
結局、そういうことだよね。

' ' の方が速くなる気がして気持ちぃー (気のせい) って香具師はそうすりゃいいし、
開発効率&可読性を取るぜー (現実的) って香具師はそうすりゃいい。
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:???
mod_perl使えってことでは
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:???
>>275
mod_perlも用意してなかった環境でチャットスクリプトを動かすときに一度だけ実際にやったことがある。
もう忘れたけどtimeを取ってみたら確か200ms位が80ms位になったと思った。
0280nobodyさん2006/03/19(日) 22:57:07ID:???
>>256
ヒント:海外鯖
つか日本でもいっぱいあるのにな。
0281nobodyさん2006/03/19(日) 23:04:07ID:???
>>279
ふーん。
0282nobodyさん2006/03/20(月) 05:37:24ID:???
>>280
他の人のデータ見れちゃうのにいいの?
自分のも見られちゃうよ?
0283nobodyさん2006/03/20(月) 10:59:07ID:???
>>282
mod_php = 他の人のデータ見れちゃう
という事なのですか?
0284nobodyさん2006/03/20(月) 11:06:50ID:???
ユーザごとに apache を独立して動かせば問題ないよ。
0285nobodyさん2006/03/20(月) 11:19:22ID:???
ユーザーごとにマシンを独立して割り当てればもっといいよ。
0286nobodyさん2006/03/20(月) 11:32:49ID:???
それ何て専用サーバ?
0287nobodyさん2006/03/20(月) 12:26:15ID:???
mod_perlとmod_phpの区別がついていない奴がいるな。
0288nobodyさん2006/03/20(月) 12:34:37ID:???
open FILE,"<","hoge.cgi";
と
open FILE,"< hoge.cgi";
の違いはないみたいだけど正しいのはどっち?
0289nobodyさん2006/03/20(月) 13:19:12ID:???
>>288
つ perldoc -f open
0290nobodyさん2006/03/20(月) 16:59:39ID:f3pQ7Duw
すみません、お聞きしたいのですが、

24時間(0時)に一度処理を行うというcgiを作りたいのですが、
どうすればいいでしょうか?

多分スレッドなどを使うことになるとは思うのですが、
その処理が動いている間は、同じ処理が二重で動かないようにしたいです。

シーケンスとしては以下のようなものをイメージしているのですが・・・。

main {
ボタンを押す;
if(既にスレッドが立ち上がってなかったら){
スレッドで th 実行;
}else{
print "既に起動中です。";
}
}

sub th{
while(1){
if(0時になったら){
処理実行;
}
}
}

よろしくお願いします・・・m(_ _)m
0291nobodyさん2006/03/20(月) 17:04:05ID:???
>>290
つ cron
0292nobodyさん2006/03/20(月) 17:14:33ID:f3pQ7Duw
>>291
どもです!

すみません、環境を書いていませんでした・・・。
環境が開発がWindows環境で、実際に稼動させるのがLinuxなんですよね。
テストの面などからできれば、環境に依存しない方法はないでしょうか?
0293nobodyさん2006/03/20(月) 17:18:02ID:???
Windows でも cron 使えますよ。
ただ、あなたの現状では使えるようになるまで莫大な時間を要するでしょうけど。
0294nobodyさん2006/03/20(月) 17:26:03ID:???
Windows なら「タスク」とかも使えるんじゃないかな。
いずれにしろCGI&スレッドでやるべき仕事じゃあないでしょ。
0295nobodyさん2006/03/20(月) 17:28:55ID:???
> テストの面などからできれば、環境に依存しない方法はないでしょうか?

ってことで、

> Windows なら「タスク」とかも使えるんじゃないかな。

ってのはだめだとおもう。
0296nobodyさん2006/03/20(月) 17:30:39ID:???
cgiでやるべき仕事じゃないと言うけど、
アクセスした時にtimeで時間取得して、設定時間以上経ってたら
実行+次回の実行時間(全開の実行時間+間隔)に書き換えでダメなん?
0297nobodyさん2006/03/20(月) 17:32:24ID:???
> アクセスした時にtimeで時間取得して、設定時間以上経ってたら
> 実行+次回の実行時間(全開の実行時間+間隔)に書き換えでダメなん?

それって、0 時に複数のアクセスがあった場合どうなる?

やっぱ初心者が初心者の質問に初心者知識で答えるスレだね。
0298nobodyさん2006/03/20(月) 17:38:18ID:???
まず、実行予定時間の書き換えしてから、引き続き処理なら問題なさそうに感じるけど、
そんなにシビアに考えないといけないもの?
0299nobodyさん2006/03/20(月) 17:41:52ID:???
>>298
> まず、実行予定時間の書き換えしてから、引き続き処理なら問題なさそうに感じるけど、

nfs 上にファイルがあったらどうなるだろう。
0300nobodyさん2006/03/20(月) 17:47:20ID:???
nfs使った事無いのでどんな影響が出るかはいまいち判らないや。
だけど、考慮しないといけないものなの?
普通にデータをtmpに出力して入れ替えるなら気にしなくて良さそうに感じるけど。
0301nobodyさん2006/03/20(月) 17:48:10ID:???
感じるのは自由です。
0302nobodyさん2006/03/20(月) 17:50:41ID:???
どんな問題があるのか説明希望ー!
03032902006/03/20(月) 18:30:28ID:f3pQ7Duw
うーむ。なかなかムズかしそうですねぇ・・・困った・・・。

>>296
>>298
の両氏のやり方でも、機能上は構わないと思うのですが、
なんかお客さんにケチつけられそうなので、
できればユーザー任せなやり方は避けたいのです。

また>>297氏のようなパターンも考えなくてはいけないので・・・。
0304nobodyさん2006/03/20(月) 18:37:31ID:???
>>303
藻前が VMware Player で実験環境作れば済むはなししではないよね。
Perl on Windows なり Cygwin でどれだけ工夫するかってのが争点だもんね。w
0305nobodyさん2006/03/20(月) 19:59:01ID:???
データには前回実行した日付を記録
アクセスがあったときにファイルロックする
データファイル読む
実行時日付と前回の日付が異なれば実行
処理
ロック解除


普通の処理ジャマイカ
0306nobodyさん2006/03/20(月) 21:47:27ID:???
1 日一回の処理のために毎回ロックとかウケル。
0307nobodyさん2006/03/20(月) 21:48:19ID:???
それのどこがPerlのコーディングに関する質問なんだ?
そんなことも判断できない奴に委託しているとは、客が可哀想すぎる。
0308nobodyさん2006/03/20(月) 21:57:43ID:???
>306
その一回の処理のときに複数実行されたらどうすんだヴァカ
0309nobodyさん2006/03/20(月) 22:02:30ID:???
>>308
もの凄い馬鹿はスルー汁
0310nobodyさん2006/03/21(火) 00:35:15ID:???
>>297
>>299
いよう、久しぶり。
0311nobodyさん2006/03/21(火) 02:12:17ID:???
凄い難癖のつけ方だったな。
説明希望されると居なくなったし。
0312nobodyさん2006/03/22(水) 16:11:05ID:1dP8qtcF
Catalyst 5.66 をインストールして、チュートリアル通りにテストスクリプトを作成。
テスト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 付で実行してないかい?

もし -W で動作したいなら CGI.pm の該当行の初期化されてない変数への参照部分を
書き換えてやればいいかと思う
0314nobodyさん2006/03/22(水) 19:53:47ID:???
-w外せば出なくはなると思うが、該当行を見た感じ
これらの環境変数が渡ってこない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:???
みんなで、Catalyst 使って遊ぼうぜ。

0317nobodyさん2006/03/22(水) 22:05:59ID:???
警告はSTDERRに出るので、apacheのエラーログに書かれるだけだし、
internal server errorになってる原因は別にあると見た。

apacheのエラーログをちゃんとさらした方が回答つきやすいと思われる。
コンソールで実行してもいいけどうまく環境あわせて作ってやらないと
意味ないよ。
0318nobodyさん2006/03/23(木) 18:41:32ID:b3UifQ+V
<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>

↑から、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="(.*)[^"]" url="(.*)[^"]" where="(.*)[^"]" \/>/i
$weblog_name = $1;
$weblog_url = $2;
$weblog_where = $3;

すげぇ適当w
0320nobodyさん2006/03/23(木) 20:28:26ID:???
>>319
初心者乙。
0321nobodyさん2006/03/23(木) 20:35:16ID:???
>>318
#!/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>
03223182006/03/23(木) 20:36:55ID:???
属性が増えたら、そのたびに正規表現書き換えるんでしょうか?
馬鹿ばっかりですね。ここ。
0323nobodyさん2006/03/23(木) 20:39:22ID:???
>>322
だったら書き込むな
0324nobodyさんNGNG
この流れwebprogらしくてイイヨイイヨー
0325nobodyさん2006/03/23(木) 21:54:35ID:???
>>322はニセじゃないの?

長くてもいいんならホレ
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:???
なんで素直にXML*を使わないのかと小一時間
0327nobodyさん2006/03/23(木) 23:05:38ID:???
素直にXML*を使ったお手本を書けば、
わざわざ小一時間かけなくともすべて解決なのでは。
0328nobodyさん2006/03/23(木) 23:07:22ID:???
それだとXMLLLLLLとかにしかマッチしないからです。
0329nobodyさん2006/03/23(木) 23:19:38ID:???
お前らホントに小学生レベルだな



俺は幼稚園児だから、このスレの内容は役に立つぜ
0330nobodyさん2006/03/24(金) 00:14:01ID:???
>>329
w
0331ヽ(´ー`)ノ ◆.ogCuANUcE 2006/03/24(金) 00:14:44ID:???
use XML::Simple;

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:???
解説も何も、XML::Simple 使ってるだけなんだが…。
何が分かんないの?
0334nobodyさん2006/03/24(金) 07:11:35ID:???
なにがわかんないのかわかんない。
0335nobodyさん2006/03/24(金) 08:44:36ID:???
while(<DATA>){
/^<weblog .*\/>/ or next;
my ($name) = /name="([^"]+)"/;
my ($url) = /url="([^"]+)"/;
print "$name → $url<br>\n";
}

こんなのでいいじゃん。
0336nobodyさん2006/03/24(金) 14:43:34ID:???
WebProgってモジュール使えない奴ばっか
0337nobodyさん2006/03/24(金) 15:23:55ID:FdXgD3At
$num = 200 * 0.575;
print "A:".$num."\n";
$num = int($num);
print "B:".$num."\n";

上記のスクリプトの出力が
A:115
B:114
になってしまうのですが
どうしてでしょうか?
0338ヽ(´ー`)ノ ◆.ogCuANUcE 2006/03/24(金) 15:33:13ID:???
>>337
そういうもん。これが一番良くまとまってるかな。
ttp://d.hatena.ne.jp/babie/20051212
03393372006/03/24(金) 15:40:10ID:FdXgD3At
>>338
サンクスです
use Math::BigFloat;
を使うことにしました
0340nobodyさん2006/03/24(金) 16:27:21ID:vZMLwEvx
# ここは shift じゃないとダメ。
my $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:???
kent に教えてもらうと良いと思われ。
0342長猫@MFC屋さん2006/03/25(土) 00:17:26ID:???
>>340
直すポイントは3つです。

1.書き込みをログファイルに保存するとき
 ⇒ログファイルの先頭行に、ランダムな文字列の行(これを投稿コードとします)を保存するようにして下さい。

2.書き込みを画面に表示するとき
 ⇒ログファイルの先頭行から1.のランダムな文字列の行(投稿コード)を読み出し、
 入力フォーム内にhiddenパラメータとして埋め込んで下さい。

3.書き込み実行して、フォーム内容をチェックするとき
 ⇒ログファイルの先頭行から投稿コードを読み出し、
 2.で入力されたhiddenパラメータと一致するか判定して下さい。
 一致しなかったら
 "Error: あなたの直前に書き込んだ人がいるため,投稿コードが更新されています。
 リロードしてからもう一度書き込んで下さい。"
 等のエラー画面を表示するようにして下さい。
 一致したら、また新たな投稿コードを作成して、ログファイルの先頭行に保存して下さい。

以上。
0343nobodyさん2006/03/25(土) 05:40:14ID:???
<FORM method="POST" action="xxx.cgi">
・ほにゃらら
<input type="test" name="ほにゃらら" size="30" value="">
</FORM>
-----------------------------------------
shtml(SSI)に、フォームメールのスキンを書いてます。
<!--#echo var="環境変数"-->これを、valueの中に
入れたいんですが、そのまま書いたらエラーでました。
perlだとvalue=$ENV{'環境変数'}でいけるんですが。
よろしくお願いします。
0344nobodyさん2006/03/25(土) 06:34:14ID:???
>>343
それ、Perl の質問じゃなくて SSI の質問じゃん。スレ違い。
0345nobodyさん2006/03/25(土) 12:00:18ID:???
しかも、そんなことやったら、漏れみたいな XSS 指摘厨にさわがれる罠。
0346nobodyさん2006/03/26(日) 21:51:04ID:???
>>251
わぁ、ぱぱ凄いやぁ
0347nobodyさん2006/03/28(火) 12:50:58ID:???
月曜日質問なかったのか
0348nobodyさん2006/03/28(火) 16:29:29ID:giiJxdDY
<input type=checkbox name=ch1 value="1,">あ
<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を使って、もっと綺麗に書けないものかな?と、思いましたので。
■ このスレッドは過去ログ倉庫に格納されています