Perl コーディング初心者質問コーナー Part34
■ このスレッドは過去ログ倉庫に格納されています
0001前スレの連投で気分崩したので後よろ
04/04/05 16:01ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0267nobodyさん
04/04/17 10:42ID:???プログラミングは
1 これでいけるはずだ
2 やっぱ駄目。
3 直して1に戻る。
の繰り返しなので、2で止まってしまう人は、お金出して他人に任せなさい。
0268263
04/04/17 10:55ID:???分かりました。お金出して他人に任せ・・たくないので1にもどります。
とりあえず寝ます。ありがとうございました。また何か詰まったら質問させてください。
0269nobodyさん
04/04/17 11:07ID:???最近、Perlの気持ちになってないヤシが多いよ。
0270nobodyさん
04/04/17 11:19ID:???そんなことない?
$file =~ /.*\/([\s\S]*)\./;
俺ならこれに何か付け足す。
あとはガンガレ。
0271nobodyさん
04/04/17 11:29ID:???$
0273nobodyさん
04/04/17 12:31ID:???$file =~ /.*\/(.+)\./;
/だけならいいけど、\まで対応すると一気に面倒なんだよなぁ。
全角とか半角カナが。(SJISね)
0274nobodyさん
04/04/17 14:20ID:ksEVTWBi「&」 … @pairs = split(/&/,$buffer);
と
「=」 … ($name,$value) = split(/=/,$pair);
でデータ切ると思いますが、これを別の文字にできますか?
「&」を「<>」とかに替えてみて、GETだと出来たんですが
POSTで渡すとき強制的に「&」になるようでデータを渡せませんでした。
POSTの時「&」意外にする方法はあるのでしょうか。
お願いします。
0275nobodyさん
04/04/17 14:58ID:???http://pc5.2ch.net/test/read.cgi/php/1055597189/
0276nobodyさん
04/04/17 20:32ID:???./Hoge/Foo.pm
というモジュールを作り、
package Foo;
use strict;
@ISA = qw(Hoge);
としたのですが、
Can't locate Hoge.pm in @INC (@INC contains: /usr/...とか色々
と怒られてしまいます。また、
use Hoge;
としている./aho.plでも、useの行で
BEGIN failed--compilation aborted at …
と怒られてしまいます。
おそらくHoge.pmの位置というか、そのような物が悪いのだと思うのですが、
どう直せばいいんでしょうか?
らくだ本では、Hoge::Fooは./Hoge/Foo.pmを表すって書いてあったと思うんですが…。
0277nobodyさん
04/04/17 21:01ID:???#--- ./Hoge.pm ---
package Hoge;
sub new { return bless {}, shift }
1;
#--- ./Hoge/Foo.pm ---
package Hoge::Foo;
use base 'Hoge'; # base.pm のヴァージョンが古いとコケる場合がある
# use Hoge; push @ISA, 'Hoge'; # その場合の代替策
sub foo { print 'foo!' }
1;
#--- ./script ---
#!/usr/bin/perl
BEGIN { print map "[$_]\n", @INC } # @INC に . が存在するか確かめる
use Hoge::Foo;
Hoge::Foo->new->foo;
__END__
0278nobodyさん
04/04/17 21:08ID:???http://www.kt.rim.or.jp/~kbk/perl5.005/perlfaq8.html#How_do_I_add_a_directory_to_my_i
0279nobodyさん
04/04/17 22:03ID:???が
package Foo;
となっていました…。
フルパスというか、祖先も全部書かないと駄目なんですね。
ありがとうございました。
0280nobodyさん
04/04/17 22:33ID:???./Hoge/Foo.pm の中身は package Foo; でも package Bar; でも
構わないが、use は実際のディレクトリ構造に従って Foo.pm を
探すので、./Hoge 内に置いている限り use Hoge::Foo; とする
必要がある。
0281nobodyさん
04/04/18 16:47ID:P05Ai4P1当方レンタルCGIを運営しておりまして
某スクリプトを使用させていただいているんですが(現在配布中止)
なんか背景に画像を設定しても出ないというバグが発生してるんです。
$btagu = '<BODY BGCOLOR="' . $para[8] . '" BACKGROUND="' . $bground . '" TEXT="' . $para[10] . '" LINK="' . $para[11] . '" ALINK="' . $para[12] . '" VLINK="' . $para[12] . '">';
画像はちゃんとアップされてて、画像を背景にしたはずのページのタグにも
ちゃんと画像のファイル名が入っているのですが画像が表示されないで
色が出てきてしまうんです
この状態だと、画像が入ってた場合色よりも画像のほうが優先されるはずなんですが
されないんです。
画像ファイルが入ってた場合に色よりも画像を優先させることはできませんか??
0282nobodyさん
04/04/18 16:52ID:???ちなみに、まったく同じHTMLタグで.htmlファイルとしてアップすると
背景は表示されるんです
それが、掲示板などのCGIファイルになると表示されません
0283nobodyさん
04/04/18 16:59ID:gbPENzjB0284nobodyさん
04/04/18 17:06ID:???>281-282
パーミッション関係が怪しいと見た。
>282は全く同じフォルダで試してる?
0285nobodyさん
04/04/18 17:07ID:???全く同じHTMLで結果が異なるなら、Perlのコーディングの問題じゃありません。
Web製作板向けですのでお帰りください。
0287nobodyさん
04/04/18 17:54ID:wgfpZXEV一定時間(24時間とか1週間とか)ごとにスクリプトを自動実行させたいんですが、
perlから可能なんでしょうか。
ここかモジュールスレかCGIか迷ったんですが、perlからの呼び出しなので
とりあえずここで。
0288nobodyさん
04/04/18 17:58ID:???アクセスがあった時に前回の自動実行から一定時間以上過ぎていたら実行をさせる。
これを聞いてイメージが湧かないなら無理。
0289nobodyさん
04/04/18 18:04ID:???レスありがと。
静的なHTMLに一定期間ごとに情報を負荷していくCGIなので、CGI呼び出しは
一般ユーザーからは行われない。自分でCGI叩くなら自動じゃなくて手動だ(笑)。
サーバーの負荷のことを考えると、SSI埋め込みとかimg埋め込みで毎回CGI
起動するのはやりたくない。
放置しておいても更新されていくようにしたいんだけど・・・無理かな。
0291nobodyさん
04/04/18 18:13ID:???perlから呼び出したいし、自宅のレスト環境はWindowsだから、環境にあまり依存
しない汎用モジュールでもないかな・・・モジュールスレいったほうがいいですか?。
0292nobodyさん
04/04/18 18:18ID:???レンタルサーバじゃまず無理。
どうしてもやりたければ、Windowsにタイマー仕込んで、一定期間ごとにCGI呼びにいかせろ。
0294nobodyさん
04/04/18 18:30ID:???・・・ないよなあ。そうは思ったが、この世界、物好きが組んでたりするんで、
わずかな可能性にかけたかった(笑)。
おとなしく別の手を考えます。
でも「いや、できるぞ」って方がいらっしゃったら情報よろしく。
0295nobodyさん
04/04/18 18:33ID:???自動実行の定番ぐらい(ry
0296nobodyさん
04/04/18 19:25ID:???my $time = time();
while(1){
if((time() - $time) >= 3600){
処理;
$time = time();
sleep 3599;
next;
}
sleep 1;
}
# 共有鯖でやるべからず
0297nobodyさん
04/04/18 19:39ID:???0298nobodyさん
04/04/18 19:46ID:2RoBAPGK0299nobodyさん
04/04/18 19:46ID:???0300nobodyさん
04/04/18 20:18ID:???0302nobodyさん
04/04/18 21:13ID:gbPENzjBなんつースクリプトや…
0304nobodyさん
04/04/19 09:42ID:???0305nobodyさん
04/04/19 11:29ID:???表示させる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 になるだろうな
0308nobodyさん
04/04/19 11:55ID:???何を見て書いたコードなのかは知らないが、せめてエラーメッセージの確認ができる環境で試すべし。
0309305
04/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:???俺のところではそのコードでちゃんと動く。
コーディング以外の部分を疑うべきだろうな。
例えばディレクトリのパーミッションとか。
0312305・309
04/04/19 15:44ID:???フォルダ名間違ってた・・・。
ごめんなさい。逝ってきます。
0313nobodyさん
04/04/19 16:06ID:???〜 or die; とするぐらいならどうしてもう一歩すすめて 〜 or die "適当なメッセージ: $!"
としないのか...
0314nobodyさん
04/04/19 16:46ID:???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:???0317nobodyさん
04/04/19 17:07ID:???>@array を : で2つに分けて
意味がわからん
>while (@array){
>($hour, $min) = split (/./, "$array[$_]");
>}
これはどういう処理してるつもり?
0318nobodyさん
04/04/19 17:17ID:ZjO/sTltたかし
たろう
こういち
さぶろう
よしゆき
みたいなテキストファイルがあって、
それを読み込んで
「ぬるぽ」をHTMLから送信すると
ぬるぽ
たかし
たろう
こういち
さぶろう
よしゆき
見たいな感じにテキストファイルの一番上の列に
書き出すことはできますか?
またできるのでしたらその方法を教えていただけますか?
0319nobodyさん
04/04/19 17:21ID:???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:???http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlfaq5.html#How_do_I_change_one_line_in_a_fi
0322nobodyさん
04/04/19 20:05ID:FJ2iv18Nそのまま標準出力にバイナリーデータとして返すにはどうすればよいのでしょうか。
読み込むにはbinmodeを呼び、通常通りreadにて$???で受け取ってよいのでしょうか、
またバイナリーをアウトプットする関数名を教えて下さい。
0323nobodyさん
04/04/19 20:14ID:???0325nobodyさん
04/04/19 20:22ID:???とりあえずパスワードを変えることでしのいだのですが、
管理画面のログをとりたいと思っています。
CGIをいじったことはあまりないのですが、
管理画面(admin.cgi)の2行目くらいにreqireでアクセス解析のCGIを指定してやればいいのでしょうか?
よろしくお願いします。
0327323
04/04/19 20:29ID:???誤爆した
0328nobodyさん
04/04/19 21:10ID:BDbOGV6Pperlで掲示板を作成しました。
掲示板の内容はログに書込まずにDB(PostgreSQL)に書込まれるようにしました。
出力するときにDBから取り出して、値を $変数 =~ s/\r/<br>/g;
という処理にして表示させると、改行はされますが、改行位置に<br>が付いた状態で表示されて
しまいます。<br>を非表示にして表示できないものでしょうか?
0329nobodyさん
04/04/19 21:13ID:???open(FILE,"ファイル名");
binmode(FILE);
binmode(STDOUT);
print <FILE>;
close(FILE);
0331nobodyさん
04/04/19 21:53ID:???とりあえず、アクセス解析ぐらい(admin.cgi)とやらに自力で書き加えれる程度の知識つけて
実際に書き加えてみろ。
そんで、うまく動かないとか、なんか困っ時にまた来なさい。
話はそれからだ。
0334nobodyさん
04/04/20 20:34ID:???あいまいだな
0335nobodyさん
04/04/20 21:07ID:???$変数 =~ s/\r/<br>/g;
$変数 =~ s/</</g;
$変数 =~ s/>/>/g;
ってなってて <pre> で囲まれてるんじゃない?
0336nobodyさん
04/04/20 21:56ID:yCtk22ceをperlで書く場合は
( x >= 1) and ( x <= 100 )
と書けば動きますが、もっとスマートな書き方ってあります?
0337nobodyさん
04/04/20 22:14ID:Z+bRhQSh0338nobodyさん
04/04/20 23:56ID:???控え用にあるccが機能しません。
管理者用に届くメールのccに書いたほうのメールアドレスが
書いてあることには書いてあるんですが届かないのは
どんな理由が考えられますでしょうか?
0339nobodyさん
04/04/21 00:36ID:???0342nobodyさん
04/04/21 02:51ID:???0343nobodyさん
04/04/21 03:12ID:???0344nobodyさん
04/04/21 03:23ID:???0345nobodyさん
04/04/21 03:40ID:???0346nobodyさん
04/04/21 13:55ID:hvmubjIuopen 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:???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:???カウンタファイルを読むのと書くのをそれぞれ別のロックにしたら
相手の操作に割り込まれ放題だから2000にならないのは不思議
でもなんでもないが、seekを入れただけで2000になるのはとても
不思議だ。オレにはわからん。
0349nobodyさん
04/04/21 15:45ID:???my $fh = 'FILE';
open($fh, '< file.txt') or die $!;
のように。
0350nobodyさん
04/04/21 15:58ID:???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$data = "example";
この時にprint "$change";とすると$dataと出力されてしまうのですが、
この時exampleを出力させる様にするにはどのようにしたら良いでしょうか?
どなたかご教授お願い致します。
0352351
04/04/21 22:29ID:???0353336
04/04/21 22:30ID:???( $x >= 1) and ($x <= 100 )
に関して言えば、可読性からもこれでいいのかな。
レスくれたひとサンクス。
0354nobodyさん
04/04/21 22:30ID:???0355レファランス使え
04/04/21 23:08ID:???$change = "data";
$data = 'example';
print $$change,"\n";
$change = \$data;
$data = 'example';
print $$change,"\n";
0356nobodyさん
04/04/21 23:21ID:???$change = '$data';
$data = "example";
print eval $change;
0357nobodyさん
04/04/21 23:23ID:???0358351
04/04/22 00:03ID:???早速組み込んでみた所、期待通りの動作をしました。Perlにもポインタの様な物が実装されているんですね。
これを機にevalの使い方も覚えました。ありがとうございました。
0359nobodyさん
04/04/22 00:20ID:???いくつかのファイルをループ処理でまとめて読み取り、
$dat[ファイルNo.][n行目]
のように一つの2次元配列に格納しようとしています。
@dat[$i] = <FH>;
openした直後に上記のようなコードを入れましたが、
どうも配列は1次元のままで、各ファイルの一行目しか配列に格納してくれませんでした。
どなたか2次元で格納させるヒントをご教授ください。
0360nobodyさん
04/04/22 00:27ID:???0361nobodyさん
04/04/22 00:29ID:???関数やサブルーチンからの戻り値をそのまま return する時に
return \(value()) とかやっているのですが、
例えば複数の値の場合に return [values()] で配列のリファレンスを返せるように、
無名スカラーがあれば良いのになあと。
0363361
04/04/22 00:31ID:???0364nobodyさん
04/04/22 02:12ID:???かな?
0365nobodyさん
04/04/22 09:00ID:???無名スカラーって無名スカラーリファレンスってことか?
ハッシュや配列と違って、無名スカラーリファレンスをを作る構文的なサポートは無い。
苦肉の策だが my $anon_sref = do{ my $o; \$o } などとしているな。
しかしこの場合は\(value())ではいけないのか?何か不満か?
0366nobodyさん
04/04/22 12:18ID:???無いのであれば、今まで通りにする事にします。
■ このスレッドは過去ログ倉庫に格納されています