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

Perl コーディング初心者質問コーナー Part34

■ このスレッドは過去ログ倉庫に格納されています
0001前スレの連投で気分崩したので後よろ04/04/05 16:01ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0283nobodyさん04/04/18 16:59ID:gbPENzjB
結局背景を画像にしたいなら、わざわざ色を指定する必要なくね?
0284nobodyさん04/04/18 17:06ID:???
画像オフにされている時に影響するから、背景画像も背景色もつけておくのがエチケット。

>281-282
パーミッション関係が怪しいと見た。
>282は全く同じフォルダで試してる?
0285nobodyさん04/04/18 17:07ID:???
tu-ka,Perlのコーディングと関係ないじゃん。
全く同じHTMLで結果が異なるなら、Perlのコーディングの問題じゃありません。
Web製作板向けですのでお帰りください。
0286nobodyさん04/04/18 17:47ID:???
>>281
お前か。
bodyタグを二つも書いてたやつだろ?
帰れ帰れ。
0287nobodyさん04/04/18 17:54ID:wgfpZXEV
環境はレンタルサーバーで、おそらくLinux+Apache+perl5です。
一定時間(24時間とか1週間とか)ごとにスクリプトを自動実行させたいんですが、
perlから可能なんでしょうか。

ここかモジュールスレかCGIか迷ったんですが、perlからの呼び出しなので
とりあえずここで。
0288nobodyさん04/04/18 17:58ID:???
>287
アクセスがあった時に前回の自動実行から一定時間以上過ぎていたら実行をさせる。
これを聞いてイメージが湧かないなら無理。
0289nobodyさん04/04/18 18:04ID:???
>>288
レスありがと。

静的なHTMLに一定期間ごとに情報を負荷していくCGIなので、CGI呼び出しは
一般ユーザーからは行われない。自分でCGI叩くなら自動じゃなくて手動だ(笑)。

サーバーの負荷のことを考えると、SSI埋め込みとかimg埋め込みで毎回CGI
起動するのはやりたくない。

放置しておいても更新されていくようにしたいんだけど・・・無理かな。
0290nobodyさん04/04/18 18:08ID:???
>>289
perlには関係ありません。
Linux板でも行って聞いてください。
0291nobodyさん04/04/18 18:13ID:???
>>290
perlから呼び出したいし、自宅のレスト環境はWindowsだから、環境にあまり依存
しない汎用モジュールでもないかな・・・モジュールスレいったほうがいいですか?。
0292nobodyさん04/04/18 18:18ID:???
ないって。
レンタルサーバじゃまず無理。
どうしてもやりたければ、Windowsにタイマー仕込んで、一定期間ごとにCGI呼びにいかせろ。
0293nobodyさん04/04/18 18:29ID:???
>>289>>291
(´-`).。oO(お前は誰だよ・・・)
0294nobodyさん04/04/18 18:30ID:???
>>292
・・・ないよなあ。そうは思ったが、この世界、物好きが組んでたりするんで、
わずかな可能性にかけたかった(笑)。
おとなしく別の手を考えます。

でも「いや、できるぞ」って方がいらっしゃったら情報よろしく。
0295nobodyさん04/04/18 18:33ID:???
バカだねぇ・・・
自動実行の定番ぐらい(ry
0296nobodyさん04/04/18 19:25ID:???
>289
my $time = time();
while(1){
  if((time() - $time) >= 3600){
    処理;
    $time = time();
    sleep 3599;
    next;
  }
  sleep 1;
}

# 共有鯖でやるべからず
0297nobodyさん04/04/18 19:39ID:???
っていうか判定つけずに sleep 3599 しとくだけでええやん。
0298nobodyさん04/04/18 19:46ID:2RoBAPGK
ある変数が無名ハッシュかどうか判定するにはどうすればいいのでしょうか?
0299nobodyさん04/04/18 19:46ID:???
レンタルサーバだと、1分くらいで強制終了させられるところも少なくないと思われ。
0300nobodyさん04/04/18 20:18ID:???
ref();
0301nobodyさん04/04/18 20:46ID:???
>>299
いや30秒程度だろ

まぁ普通は>>296みたいなキティなソースは頭に浮かばんね
cron使えよ
0302nobodyさん04/04/18 21:13ID:gbPENzjB
>>296
なんつースクリプトや…
0303nobodyさん04/04/18 23:26ID:???
>>298
無名かどうかを判定することは出来ない。
0304nobodyさん04/04/19 09:42ID:???
ロクに意見も出ないのに、口先だけは一人前のスレですね。
0305nobodyさん04/04/19 11:29ID:???
1. フォルダの中身にあるファイル名を
  表示させるcgiをつくりたいのですが。
2. こんな風にやってみた。

#!/usr/local/bin/perl
$folder = ./hoge/
opendir(DIR, '$folder') or die;
@file = sort readdir(DIR);
closedir(DIR);
print "Content-type: text/html\n\n";
print "<HTML>\n";
print "<P> フォルダの中身 </P>\n";
foreach (@file){
print $_, '<BR>';
}
print "</HTML>\n";
exit(0);

3.普通にエラーになる・・。

改善方法ありますでしょうか・・。
0306nobodyさん04/04/19 11:47ID:???
どんなエラーが出たかわからないのでカンだけで回答するが

とりあえず2行目はいきなり syntax error になるだろうな
0307nobodyさん04/04/19 11:47ID:???
>>305
そりゃあエラーになるわな。
基本からやり直してください。
0308nobodyさん04/04/19 11:55ID:???
とりあえず2行目にエラー、3行目にミス(エラーは出ないが期待通り動かない)がある。
何を見て書いたコードなのかは知らないが、せめてエラーメッセージの確認ができる環境で試すべし。
030930504/04/19 14:24ID:???
えっと、エラー確認してみたんですが
これで一応syntaxはOKになるんですが表示されません。。
#!/usr/bin/perl
$folder = "./hoge/";
opendir(IN, "$folder") or die;
@file = sort readdir(IN);
closedir(IN);
print "Content-type: text/html\n\n";
print "<HTML>\n";
print "<P>フォルダの中身</P>\n";
foreach (@file){
print $_, '<BR>';
}
print "</HTML>\n";
exit(0);
0310nobodyさん04/04/19 15:01ID:???
>>309
俺のところではそのコードでちゃんと動く。

コーディング以外の部分を疑うべきだろうな。
例えばディレクトリのパーミッションとか。
0311nobodyさん04/04/19 15:14ID:???
>>309
俺のところでもちゃんと動く。
0312305・30904/04/19 15:44ID:???
ごめん。まじで聞いてくれますか?
フォルダ名間違ってた・・・。
ごめんなさい。逝ってきます。
0313nobodyさん04/04/19 16:06ID:???
>>305
〜 or die; とするぐらいならどうしてもう一歩すすめて 〜 or die "適当なメッセージ: $!"
としないのか...
0314nobodyさん04/04/19 16:46ID:???
>>313
print "Content-type: text/html\n\n";
の前に鰓が出て、「ぷりめちゃ〜」って出るからなんじゃなぁい?(w
0315nobodyさん04/04/19 17:03ID:???
初心者的質問です、すいません!

@array を : で2つに分けて片方だけ表示したいのですが。
下記のように記述してみましたが、できませんでした。
書き方が違うのだと思います。
教えていただけませんか?

while (@array){
($hour, $min) = split (/./, "$array[$_]");
}
print "Content-type: text/html\n\n";
print "<HTML><BODY>\n";
foreach (@array){
print $hour[$_],\n;
}

今のままだと動作がものすごく遅くて
結局最後にエラー表示がでてしまいます。
一応、文法的な間違いはないようですが・・・・・・。
0316nobodyさん04/04/19 17:05ID:???
あ。1箇所入力間違えていました。split の区切り文字は「:」です。
0317nobodyさん04/04/19 17:07ID:???
>>315
>@array を : で2つに分けて
意味がわからん

>while (@array){
>($hour, $min) = split (/./, "$array[$_]");
>}
これはどういう処理してるつもり?
0318nobodyさん04/04/19 17:17ID:ZjO/sTlt
例えば、

たかし
たろう
こういち
さぶろう
よしゆき

みたいなテキストファイルがあって、
それを読み込んで
「ぬるぽ」をHTMLから送信すると

ぬるぽ
たかし
たろう
こういち
さぶろう
よしゆき

見たいな感じにテキストファイルの一番上の列に
書き出すことはできますか?
またできるのでしたらその方法を教えていただけますか?
0319nobodyさん04/04/19 17:21ID:???
>>315
print "Content-type: text/html\n\n";
print "<HTML><BODY>\n";
foreach (@array){
($hour, $min) = split (/:/);
print $hour,"<br>\n";
}
0320nobodyさん04/04/19 17:26ID:???
>>318
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlfaq5.html#How_do_I_change_one_line_in_a_fi
0321nobodyさん04/04/19 18:07ID:???
>>318
ガッ
0322nobodyさん04/04/19 20:05ID:FJ2iv18N
cgiが起動したら、カレントディレクトリにあるバイナリーファイルを読み込んで、
そのまま標準出力にバイナリーデータとして返すにはどうすればよいのでしょうか。
読み込むにはbinmodeを呼び、通常通りreadにて$???で受け取ってよいのでしょうか、
またバイナリーをアウトプットする関数名を教えて下さい。
0323nobodyさん04/04/19 20:14ID:???
つーかよ、GETしたhtmlを分解して調べるなんて、なんつーか原始的(アナログ的)だよな
0324nobodyさん04/04/19 20:18ID:???
>>322
よい。
print
0325nobodyさん04/04/19 20:22ID:???
最近掲示板のパスが漏れて(?)改ざんされました。
とりあえずパスワードを変えることでしのいだのですが、
管理画面のログをとりたいと思っています。

CGIをいじったことはあまりないのですが、
管理画面(admin.cgi)の2行目くらいにreqireでアクセス解析のCGIを指定してやればいいのでしょうか?

よろしくお願いします。
0326nobodyさん04/04/19 20:28ID:???
>>325
>>1
032732304/04/19 20:29ID:???
スマン・・・
誤爆した
0328nobodyさん04/04/19 21:10ID:BDbOGV6P
初心者質問です。
perlで掲示板を作成しました。
掲示板の内容はログに書込まずにDB(PostgreSQL)に書込まれるようにしました。
出力するときにDBから取り出して、値を $変数 =~ s/\r/<br>/g;
という処理にして表示させると、改行はされますが、改行位置に<br>が付いた状態で表示されて
しまいます。<br>を非表示にして表示できないものでしょうか?

0329nobodyさん04/04/19 21:13ID:???
>>322

open(FILE,"ファイル名");
binmode(FILE);
binmode(STDOUT);
print <FILE>;
close(FILE);
0330nobodyさん04/04/19 21:29ID:???
>>328
それはperlに関係ないだろ。
HTMLレベルの話だし、自分で作った掲示板ならわかるはず。
0331nobodyさん04/04/19 21:53ID:???
>>325
とりあえず、アクセス解析ぐらい(admin.cgi)とやらに自力で書き加えれる程度の知識つけて
実際に書き加えてみろ。
そんで、うまく動かないとか、なんか困っ時にまた来なさい。
話はそれからだ。

0332nobodyさん04/04/20 00:36ID:???
>>324
>>329
どうもありがとうございマス
目的のものが完成しました
0333nobodyさん04/04/20 18:10ID:???
>>328
WINDOWSの改行コードは\r\n

\r\n → s/\r/<BR>/g; → <BR>\n
もう解るね?
0334nobodyさん04/04/20 20:34ID:???
>WINDOWSの改行コードは\r\n

あいまいだな
0335nobodyさん04/04/20 21:07ID:???

$変数 =~ s/\r/<br>/g;
$変数 =~ s/</&lt;/g;
$変数 =~ s/>/&gt;/g;

ってなってて <pre> で囲まれてるんじゃない?


0336nobodyさん04/04/20 21:56ID:yCtk22ce
x between 1 and 100

をperlで書く場合は

( x >= 1) and ( x <= 100 )

と書けば動きますが、もっとスマートな書き方ってあります?
0337nobodyさん04/04/20 22:14ID:Z+bRhQSh
()はいらねー
0338nobodyさん04/04/20 23:56ID:???
FREEであったフォームメールのcgiを利用しようと思ったんですが
控え用にあるccが機能しません。
管理者用に届くメールのccに書いたほうのメールアドレスが
書いてあることには書いてあるんですが届かないのは
どんな理由が考えられますでしょうか?
0339nobodyさん04/04/21 00:36ID:???
メール鯖の管理者に聞いてみたら?
0340nobodyさん04/04/21 01:10ID:???
>>338
作者に聞いたら?
このスレの話題じゃない
0341nobodyさん04/04/21 02:17ID:???
>>336
$x and $x <= 100
0342nobodyさん04/04/21 02:51ID:???
それだと $x = -1 のときも true になりそうな
0343nobodyさん04/04/21 03:12ID:???
int(($x-1)/100) == 0
0344nobodyさん04/04/21 03:23ID:???
&between(x,0,100)
0345nobodyさん04/04/21 03:40ID:???
1と100の間;
0346nobodyさん04/04/21 13:55ID:hvmubjIu
for (1..1000){
open F,'test.txt';
flock F, 1;
$data = <F>;
close F;

$data++;

open F,"+<test.txt";
flock F, 2;
truncate F, 0;
print F $data ;
close F;
}

これを、2プロセスで実行すると、+2000になる予定ですが、+2000になりません。
printの前に seek F,0,0; を入れると期待通り+2000になるのですが・・・。
どうしてでしょうか?
0347nobodyさん04/04/21 14:26ID:???
>>346
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlfaq5.html#I_still_don_t_get_locking_I_jus
0348nobodyさん04/04/21 15:41ID:???
>>346
カウンタファイルを読むのと書くのをそれぞれ別のロックにしたら
相手の操作に割り込まれ放題だから2000にならないのは不思議
でもなんでもないが、seekを入れただけで2000になるのはとても
不思議だ。オレにはわからん。
0349nobodyさん04/04/21 15:45ID:???
use strict refs 下で open() に渡すファイルハンドルに変数を使うにはどうしたら良いのでしょうか。

my $fh = 'FILE';
open($fh, '< file.txt') or die $!;

のように。
0350nobodyさん04/04/21 15:58ID:???
>>349
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlfaq5.html#How_can_I_use_a_filehandle_indir
0351nobodyさん04/04/21 22:29ID:dqfm18bp
$change = '$data';
$data = "example";

この時にprint "$change";とすると$dataと出力されてしまうのですが、
この時exampleを出力させる様にするにはどのようにしたら良いでしょうか?
どなたかご教授お願い致します。
035235104/04/21 22:29ID:???
すみません、$changeを使ってです。
035333604/04/21 22:30ID:???
んー、Perlだと結構いろんな書き方があるから油断できないんだけど、
( $x >= 1) and ($x <= 100 )
に関して言えば、可読性からもこれでいいのかな。

レスくれたひとサンクス。
0354nobodyさん04/04/21 22:30ID:???
釣堀はここではありませんよ
0355レファランス使え04/04/21 23:08ID:???
>>351
$change = "data";
$data = 'example';
print $$change,"\n";

$change = \$data;
$data = 'example';
print $$change,"\n";
0356nobodyさん04/04/21 23:21ID:???
素直に eval 使えばいいんじゃないだろうか。

$change = '$data';
$data = "example";
print eval $change;
0357nobodyさん04/04/21 23:23ID:???
馬鹿に危険な事教えるなよ
035835104/04/22 00:03ID:???
>>355-356
早速組み込んでみた所、期待通りの動作をしました。Perlにもポインタの様な物が実装されているんですね。
これを機にevalの使い方も覚えました。ありがとうございました。
0359nobodyさん04/04/22 00:20ID:???
質問です。

いくつかのファイルをループ処理でまとめて読み取り、
$dat[ファイルNo.][n行目]
のように一つの2次元配列に格納しようとしています。

@dat[$i] = <FH>;
openした直後に上記のようなコードを入れましたが、
どうも配列は1次元のままで、各ファイルの一行目しか配列に格納してくれませんでした。

どなたか2次元で格納させるヒントをご教授ください。
0360nobodyさん04/04/22 00:27ID:???
@{$dat[$i]} = <FH>;
0361nobodyさん04/04/22 00:29ID:???
Perl に無名スカラーってありますか?

関数やサブルーチンからの戻り値をそのまま return する時に
return \(value()) とかやっているのですが、
例えば複数の値の場合に return [values()] で配列のリファレンスを返せるように、
無名スカラーがあれば良いのになあと。
036235904/04/22 00:30ID:???
>>360
動作確認しました!
即レスありがとうございました!
では再び勉強ROMに戻ります。
036336104/04/22 00:31ID:???
戻り値のリファレンス返すのでそのままではありませんね……。
0364nobodyさん04/04/22 02:12ID:???
return \@{[values %ハシュ変数名]};
かな?
0365nobodyさん04/04/22 09:00ID:???
>>361
無名スカラーって無名スカラーリファレンスってことか?
ハッシュや配列と違って、無名スカラーリファレンスをを作る構文的なサポートは無い。
苦肉の策だが my $anon_sref = do{ my $o; \$o } などとしているな。
しかしこの場合は\(value())ではいけないのか?何か不満か?
0366nobodyさん04/04/22 12:18ID:???
いえ、機能的な不満は全く無いですが、個人的な好みの問題のようなものです。
無いのであれば、今まで通りにする事にします。
0367nobodyさん04/04/23 20:15ID:???
$IMAGEに書かれている文字を、sprintfで文字を3つに(1.1.残り)に分けて、
はじめの文字がaだった場合とそれ以外で読み込むフォルダを分けたいと
思っています。
以下のように記述したのですが、エラーが出てしまいました・・。
どこ違っているのかわからないので、指導お願いします〜。。


$IMAGE = sprintf("%01d/%01d/%04d",$a,$b,$c);

if ($a eq a){print "<IMG src=\"image/$a$b$c.gif\">;
}else{print "<IMG src=\"img/$a$b$c.gif\">";}

また、1.1.残りと分けたいのですが、画像ファイルの名前が4〜6文字とランダムなのですが、上の書き方だとだめなんですよね・・?
どうすればいいんでしょうか?
0368nobodyさん04/04/23 20:17ID:???
>>325まだ見てるか?

最近アクセス解析CGI作ったから require で呼び出せるように書き換えて
提供してやろうか?

いるなら捨てアドさらせ。
さらしてから書き換えに2〜3日掛かるからその後送ってやる
0369nobodyさん04/04/23 21:00ID:???
>>367
print $IMAGE =~ /^A/ ? "<IMG src=\"image/$IMAGE.gif\">" : "<IMG src=\"img/$IMAGE.gif\">";
0370nobodyさん04/04/23 21:04ID:???
>>367
>$IMAGEに書かれている文字を、sprintfで文字を3つに(1.1.残り)に分けて
使う関数が目的に合っているかよく調べろ。

>$IMAGE = sprintf("%01d/%01d/%04d",$a,$b,$c);
これじゃあ$a,$b,$cを指定のフォーマットにして/をはさんだ文字列として
$IMAGEに代入する式だ。

こんなのでもいいだろ。
$a = substr($IMAGE,0,1);
$b = substr($IMAGE,1,1);
$c = substr($IMAGE,2);
037136904/04/23 21:12ID:???
あ、質問よく読んでなかった。
037236704/04/23 21:23ID:???
>>370
書きながら、これだけ代入が逆なのか・・と思いながら書いてました。

substrの意味を調べて納得です。
助かりました。。
0373nobodyさん04/04/24 12:42ID:ftCx7p61
Pod を書くのに日本語つかってもいいですか?
0374nobodyさん04/04/24 13:44ID:???
なんかその質問前にもあったぞ。
037537304/04/24 14:07ID:???
ポッキーあげるから、教えてくださいよ〜
0376nobodyさん04/04/24 15:41ID:???
>>373
自分で使う分には構わないって事でファイナルアンサーしてたような。
CPANに登録するのなら英語(Ascii?)で書かかないと。

http://www.perldoc.com/perl5.8.0/README.jp.html
http://search.cpan.org/~nwclark/perl-5.8.4/README.jp
EUC-JPで化けるみたいだしね。
# UTF-8だといけるのかな?
037737304/04/24 21:14ID:???
ありがとう!!!
お陰で彼女が出来ました
0378nobodyさん04/04/25 11:23ID:KCQtln8X
モジュールって、相互に宣言しても、大丈夫ですか??
例えば、MOD_A.pm と MOD_B.pm を自作して

MOD_A.pm 内のソースで use MOD_B; を宣言
MOD_B.pm 内のソースで use MOD_A; を宣言

cgiプログラムを作ってるんですが、そのcgiプログラムの中で
use MOD_A;
use MOD_B;

とかやりたいんですがどう?

もっとさらに言うと、MOD_A.pm の中で自分自身を
use MOD_A;

とかやっても大丈夫ですか?
0379nobodyさん04/04/25 11:41ID:???
そんなことを聞くようなやつがモジュールなんか作るな
0380nobodyさん04/04/25 11:42ID:???
やってみればわかることを聞くヤシっているよね
0381nobodyさん04/04/25 14:33ID:???
>378
相互 use、自己 use とも無限ループにはならない。
ttp://www.perldoc.com/perl5.8.0/pod/func/use.html
ttp://www.perldoc.com/perl5.8.0/pod/func/require.html
ただし、自己 use することに何の意味もない。
さらに、相互 use することにも意味がない。
>378 の例だと CGI の中の use MOD_B; と、MOD_B.pm の中の use MOD_A; は
あってもなくても変わらない。
とりあえず、相互に use するような設計がおかしいので考え直せ。
0382nobodyさん04/04/25 21:00ID:???
cgiにjava scriptを組み込もうとしているのですが、500エラーがでます。

HTMLでの " は \" になることは知っているので、そうしたのですが、
 ! や ? の記号の前にも \ が必要なのですか?それとも他の記号なのでしょうか?
0383nobodyさん04/04/25 21:06ID:???
まずはソースを出せ。
話はそれからだ。
■ このスレッドは過去ログ倉庫に格納されています