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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
0243nobodyさん04/04/16 03:45ID:5vM41xl8
>>242
役立たずですね
0244nobodyさん04/04/16 03:56ID:???
まじめに答えてるわけじゃないしな
暇つぶしなだけ
0245nobodyさん04/04/16 03:59ID:2Due2Uz0
>>244
早く寝ろ
0246nobodyさん04/04/16 04:03ID:???
おはよ
漏れは今起きた
0247nobodyさん04/04/16 04:03ID:???
はいはい、寝ますよ( ´,_ゝ`)プッ
0248nobodyさん04/04/16 05:09ID:5vM41xl8
>>247
自力で解決しました。
役立たずさんは早く寝てください。
0249nobodyさん04/04/16 06:03ID:???
どうやって解決したかは書かないのな(プゲラ
0250nobodyさん04/04/16 06:56ID:???
>グローバル変数の値が初期値に戻ってしまいます
>なぜでしょう?

これでどう解決すればいいんだよ
き違いはイラク行ってろ
0251nobodyさん04/04/16 09:58ID:???
Perlって変わってるよね。
0252nobodyさん04/04/16 10:28ID:???
そこがいいよね
0253nobodyさん04/04/16 10:33ID:???
解決してないけど苦し紛れに書いちゃったんだよ。察してやれよ
025422904/04/16 10:48ID:???
>>232
>>233
>>234
みなさん、ありがとうございました。うまく出力できるようになりました。
あれから起動hddが逝って換装後os再インストなどでご報告遅れてしまいました。

>>232
ん〜そうですねぇ。間が抜けてみえちゃいますねぇ。
一応管理用のデータ表示程度に出力させたかったので御の字なんですが
本当はこれ以外の出力のさせ方しらなかったのです。
純粋にプログラム初心者なperl初心者なのでhtmlタグの知識などもほとんどなかったり。
ほかにも出力の出し方探してみようと思います。どうもでした。
0255nobodyさん04/04/16 11:25ID:???
239 名前:nobodyさん 投稿日:04/04/16 03:19 ID:5vM41xl8
グローバル変数の値が初期値に戻ってしまいます
なぜでしょう?


240 名前:nobodyさん 投稿日:04/04/16 03:24 ID:???
>>239
そうなるようなコード部分があるから


241 名前:nobodyさん 投稿日:04/04/16 03:27 ID:5vM41xl8
>>240
どのような記述をすると初期値に戻ってしまうのか
教えて下さいませ


242 名前:nobodyさん 投稿日:04/04/16 03:35 ID:???
初期値を代入した部分が再度実行されれば戻るでしょ。
そもそもそういう質問をすることからして何か勘違いしてる可能性もあるが。


243 名前:nobodyさん 投稿日:04/04/16 03:45 ID:5vM41xl8
>>242
役立たずですね
0256nobodyさん04/04/16 11:39ID:TQSKBaOO
該当スレが見当たらなかったのでこちらに投稿させていただきます。
http://anonymouse.ws/anonwww.html
↑これみたいに、URLクリックしたら串刺さった状態で該当サイトに飛ぶようなスクリプト探してるんですが、
こんなのって普通に配布されてるんでしょうか?
だとしたらどういう検索ワードで探せばよいか教えてほしいんですけど・・・
0257nobodyさん04/04/16 12:35ID:???
>>256
>>1
http://pc5.2ch.net/test/read.cgi/php/1078568723/
0258nobodyさん04/04/16 12:37ID:???
>>252
いいこといった!
0259nobodyさん04/04/16 22:59ID:???
すみません、225です。解決したので報告です。

お恥ずかしい初歩的なミスですが、?の後のクエリーを全角文字で書いてました。

受け側もデコードとかしてなくて、それでもクエリーはちゃんと読めて、思ったとおりの
HTMを出力していたのですが、その時点で正常ではなかったようで、そこから飛ぶ
先の環境変数が壊れていました。

誘導してもらった先でも報告しました。報告ですのでマルチポスト御容赦。
0260nobodyさん04/04/17 00:14ID:???
plファイルに対してショートカットを作ってそのショートカットのリンク先の欄に
コマンドラインオプションをつけてplファイルを起動したいのですが
perlでコマンドラインオプション引数を受け取る方法がわからないのです。

たとえばデバック用にコマンドラインオプションであらかじめpl内の変数を
設定しておいてフラグを立てたり、logファイルの読み込みディレクトリを
変更したりしたいのです。

そういうことはできないのでしょうか?アドバイスいただければ幸いです。
0261nobodyさん04/04/17 00:25ID:???
>>260
@ARGVに入ってる
026226004/04/17 01:16ID:???
返答どもです。
さっそくやってみます。
0263nobodyさん04/04/17 08:40ID:???
掲示板のlogファイルなどを相対パスではなく絶対パスで設定したいのですが
掲示板のファイル名取得コードが
$file =~ /\/([\s\S]*)\./;
となっている為、相対パスでlog/log.txtなどの場合は正常に取得できるのですが
絶対パスでH:/bbs/log/log.txtなどの場合は正常に取得できません。
正規表現を調べて
$file =~ /*\/([\s\S]*)\./;
$file =~ /*.\/([\s\S]*)\./;
$file =~ /.*\/([\s\S]*)\./;
$file =~ /.\/([\s\S]*)\./;
みたいな事もやってみたのですが文法エラーだったり目的通りに動いてくれなかったりで
気づけば朝。
こういった場合どういうようにしたらいいのでしょうか?
0264nobodyさん04/04/17 10:15ID:???
なぜ絶対パスで設定したいのか理由を述べよ。
絶対パスが他のサーバのファイルだとしたら笑いますよ。
0265nobodyさん04/04/17 10:16ID:???
>>263
正規表現を勉強する。
http://www5a.biglobe.ne.jp/~n_rieko/perl/8.htm
026626304/04/17 10:34ID:???
>>264
今自鯖立てていろんな掲示板設置して掲示板弄ったりして
変数やら制御構文やら関数やらを覚えてるんですがその過程で
掲示板のファイル名やlogなどのファイル名を一括表示できる
cgiを作りたいなと思いまして。

>>265
まさに今そのHP見ながら勉強させてもらってるんですが
無い知恵絞って出てきたのが上の文です。
これでいけるはずだ!と思って書いてみてもミスると次どうすればいいのかも
思いつけなくて・・。
0267nobodyさん04/04/17 10:42ID:???
>>266
プログラミングは
1 これでいけるはずだ
2 やっぱ駄目。
3 直して1に戻る。
の繰り返しなので、2で止まってしまう人は、お金出して他人に任せなさい。
026826304/04/17 10:55ID:???
>>267
分かりました。お金出して他人に任せ・・たくないので1にもどります。
とりあえず寝ます。ありがとうございました。また何か詰まったら質問させてください。
0269nobodyさん04/04/17 11:07ID:???
Perl勉強するなら、Perlの気持ちにならなきゃね。。。

最近、Perlの気持ちになってないヤシが多いよ。
0270nobodyさん04/04/17 11:19ID:???
喪前ら書き込むなら何かヒントくらい書かないとこのスレの趣旨として機能しないんじゃねぇの?
そんなことない?
$file =~ /.*\/([\s\S]*)\./;
俺ならこれに何か付け足す。
あとはガンガレ。
0271nobodyさん04/04/17 11:29ID:???
ヒントか?

$
0272nobodyさん04/04/17 11:34ID:???
>>263
そのすぐ下の行に、
$file = $1;
っていう感じの記述は無いか?
そのコードの意味から調べてみろ。
0273nobodyさん04/04/17 12:31ID:???
あたしゃ適当にこんな感じ。
$file =~ /.*\/(.+)\./;

/だけならいいけど、\まで対応すると一気に面倒なんだよなぁ。
全角とか半角カナが。(SJISね)
0274nobodyさん04/04/17 14:20ID:ksEVTWBi
GETやPOSTでデータを渡すとき、通常だと
「&」 … @pairs = split(/&/,$buffer);
と
「=」 … ($name,$value) = split(/=/,$pair);
でデータ切ると思いますが、これを別の文字にできますか?

「&」を「<>」とかに替えてみて、GETだと出来たんですが
POSTで渡すとき強制的に「&」になるようでデータを渡せませんでした。

POSTの時「&」意外にする方法はあるのでしょうか。
お願いします。
0275nobodyさん04/04/17 14:58ID:???
>>274
http://pc5.2ch.net/test/read.cgi/php/1055597189/
0276nobodyさん04/04/17 20:32ID:???
./Hoge.pm
./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:???
>>276
#--- ./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:???
>>276
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 Hoge::Foo;
が
package Foo;
となっていました…。
フルパスというか、祖先も全部書かないと駄目なんですね。
ありがとうございました。
0280nobodyさん04/04/17 22:33ID:???
>>279
./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:???
>>281
ちなみに、まったく同じHTMLタグで.htmlファイルとしてアップすると
背景は表示されるんです
それが、掲示板などのCGIファイルになると表示されません
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 になりそうな
■ このスレッドは過去ログ倉庫に格納されています