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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/07/24 19:48ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

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

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

関連スレ
【Perl上級者コーナーPart01】
http://pc2.2ch.net/test/read.cgi/php/1024741312/
CGI: Common Gateway Interface part 11
http://pc2.2ch.net/test/read.cgi/php/1055597189/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/

過去ログやお勧めサイトは >>2-10
0175nobodyさん03/07/28 13:21ID:ZypqctSD
変数はmyで局所化するのが基本みたいなんでそうしていますが、
例えば同じ変数をどこのサブルーチンで使いたい場合はどうするんでしょうか。
いちいち変数の受け渡しをしないといけないんでしょうか。
0176nobodyさん03/07/28 13:45ID:???
>>175
局所化しなきゃいい。
0177nobodyさん03/07/28 13:47ID:???
>>168
174が言ってるように、ファイル名に.gz追加
logfile1.html.gz
HTTP_ACCEPT_ENCODING見てサーバがファイルを選んでくれる。
0178nobodyさん03/07/28 13:49ID:mZs5gojb
>>175
our。バージョン古くて使えなければuse vars。
0179nobodyさん03/07/28 13:52ID:???
>>175
妙な静的変数

{
my $static;
sub hoge {
}
sub hogehoge {
}
sub hagehage {
}
}
0180nobodyさん03/07/28 14:33ID:MPvwsvte
画像掲示板をつくっています。参照ボタンでローカルパソコン内の画像を選んだあと、
確認ボタンでその画像がブラウザで確認出来るようにしたいのですが、
良い方法ないでしょうか?
0181nobodyさん03/07/28 14:34ID:???
>>180
帰れ。
0182nobodyさん03/07/28 14:41ID:???
>>167
> 16[4-5]のモジュールは使い方よくわかりませんでした。

使えるようになると便利だぞ。
面倒かもしれんけど、ぐぐってみるなりして使いこなせ。


>>180
送信する前にプレビューってことか?
JavaScriptでフォームからファイルパス取って、IMGに埋め込むとか。
できるかわからんけど。
とりあえずスレ違いなので詳細はそれ系スレで。
0183nobody03/07/28 21:25ID:0jEUdWDa
ス…スマン。大学のperlの課題で四苦八苦している者です。
「じゃんけん」ができるプログラムを作りたいんだけど
何かいい方法ありますか?
当方かなり初心者なんで
print"〜";#って文字を出力することしかできないんですけど。
えーと質問の意味がわからなかったらスルーしてもらってもかまいません。
0184あぼーんNGNG
あぼーん
0185nobodyさん03/07/28 21:53ID:???
>183
まずフローチャートを書け。
それ以降は大学で聞け。
0186nobodyさん03/07/28 21:58ID:???
>>183
宿題は自分でやろうね。
0187nobodyさん03/07/28 22:03ID:???
print "じゃんけん\n";
sleep(1);
print "ぽん\n";
0188あぼーんNGNG
あぼーん
0189nobodyさん03/07/28 22:10ID:TipKdKzd
じゃんけん・・・
ランダムに3つの中から選ぶプログラムを作って
自分で入力した文字と比較。
結果を出力。でいいんじゃない?
0190あぼーんNGNG
あぼーん
0191nobodyさん03/07/28 22:25ID:???
>>183

print "じゃんけん(1=ぐー、2=ぱー、3=ちょき)\n";
<>;chop;
$a = int rand(3)+1;
$hoge = (($a == 1 && $_ == 2) || ($a == 2 && $_ == 3) || ($a == 3 && $_ == 1)) ? '勝ち' : '負け';
print $hoge,"\n";

# お粗末
0192nobodyさん03/07/28 22:47ID:???
183は課題がでるたびにここで聞くのかね。
0193nobodyさん03/07/28 22:53ID:???
print "じゃんけん(1=ぐー、2=ぱー、3=ちょき)\n";
<>;
print ('勝ち', '負け')[int rand 2];
0194nobodyさん03/07/28 23:08ID:???
>>193

   /⌒ヽ
  / ´_ゝ`)時間的に、ここ笑わないといけないので、笑いますよ・・・
  |    /
  | /| |
  // | |
 U  .U
019518303/07/28 23:46ID:xYLAJnZK
課題今日中にメールで提出ということだったんで…出しました。
みなさんいろいろ案出していただいてありがとうございます。
結局自分の力不足で課題内容変えちゃいましたけど。
(みなさんの案は今後参考にさせてもらいます)
>192
今日始めてここに来たんですけど
まぁ課題が出るたびにここで聞くのと同じような根性の持ち主です。

とにかく…評価はCにケテーイぽ(つД`)
0196あぼーんNGNG
あぼーん
0197nobodyさん03/07/28 23:49ID:???
>>183 っていうか、おまえ。答え丸写しじゃねぇかw
0198nobodyさん03/07/28 23:56ID:???
あいこが出ないコードを提出。-10点
0199あぼーんNGNG
あぼーん
020018303/07/29 00:01ID:BcdoPCM8
>197
いやしてないし。むしろじゃんけんにしなかったし。
ウザイのでそろそろ逝きます。
0201nobodyさん03/07/29 00:03ID:???
まあ、はじめから丸写しするつもりで聞いたんだろう。
自分の期待する答えがなかったからしなかった(というかできなかった)だけで。
0202nobodyさん03/07/29 00:25ID:???
そういうやつのためにも時々ウソを教えないとね
試したらわかる程度に軽いやつで
0203nobodyさん03/07/29 01:49ID:???
それにしても 183 よ。そんな事を2ちゃんねるで聞くのもどうかと思うぞw
020416803/07/29 07:41ID:???
>>174
ありがとうございました。

Content Negotiationというのがあるとは全く知らず、そのまま表示できたのでびっくりです。
板違いでしたね(汗)
全部圧縮して、リンク先のアドレス変えるだけで問題はすべて解決しました。

大変感謝しております。
0205nobodyさん03/07/29 08:56ID:pmxt/hz7
crontabで、AM6:00,AM7:00に1回起動設定しているとして、
cgiの中でlocaltimeで、6:00と7:00で処理を分けているんですけど、
crontabの時計とlocaltimeの時計は完全に一致しているんでしょうか?
スクリプトの中で6:00丁度だったらA、7:00丁度だったらBとやっても
crontabが起動した時間が5:58とかだったらAの処理が行われないと思うんです。
0206nobodyさん03/07/29 10:14ID:???
cgiがperlで書かれているとすれば。
perldoc を調べなさい。
それから
man crontab。
0207nobodyさん03/07/29 10:15ID:???
ちがう。
crontabはcrontableのことだ。
要するにcronの設定ファイル(といっていいかどうかわからんが)

man cron
をすべき。
0208nobodyさん03/07/29 10:21ID:???
ついでにいうと、localtimeじゃなくてtimeだよな。
0209nobodyさん03/07/29 10:39ID:???
>>205
6:00丁度に起動されたとしてもlocaltimeとるまでにタイムラグがある。
ちょっと考えればわかりそうなもんだが。
0210nobodyさん03/07/29 10:52ID:???
man cron ってヤラスィ〜響き

(*´Д`*) マンコロン・・・
0211あぼーんNGNG
あぼーん
0212nobodyさん03/07/29 11:44ID:pmxt/hz7
man cronってなんざんすか?
0213nobodyさん03/07/29 11:47ID:MFa+8P58
一定時間ごとにある処理をさせますが、特定のキー入力で抜けます。
<STDIN>; ではうまくいかないので下のコードのようにしましたが、
2つ目のwhileを無駄に回さなくてもいいようにする方法はありますかね?
今のところsleepを入れるくらいしか思いつかないです。

sub {
  my $sig = 0;
  local $SIG{INT} = sub {$sig = 1;};
  while (1) {
    # ここに$interval(分)ごとにする処理
    while (time() % ($interval * 60)) {
      sleep (1);
      return 1 if($sig);
    }
  }
}
0214あぼーんNGNG
あぼーん
0215nobodyさん03/07/29 12:00ID:???
>>213
1 TTYをnon-canonicalモードにする。
プラットフォーム依存。モジュールあるかも。
2 特定のキーでシグナル発生させる。
0216nobodyさん03/07/29 12:03ID:???
>>213
getc じゃ駄目なの?
0217nobodyさん03/07/29 15:52ID:???
今 ttp://x68000.startshop.co.jp/~68user/net/http-2.html
を参考にhttpクライアントを作ってみたんですが
どうも404が返ってくるところが多くて不思議なのですが
どういうことなのでしょう?
例えば参考にした上のページは見れるんですが
自分のISPのページは
Http://host/~user/index.html でリクエストすると404で
Http://host/~user/ なら大丈夫なんです。
(勿論ブラウザなら両方OKです。)

ソースへ
print SOCKET "Host:$host:$port\r\n";
を追加したら大抵取得できる様になったんですが
それでも100%でないので納得できないのです。
何が不足しているのでしょうか?
サッパリ意味が解らないのでご教授お願いします。
0218nobodyさん03/07/29 16:04ID:???
>>217
バーチャルホスト
021921703/07/29 16:39ID:???
>>218
バーチャルホストへは
print SOCKET "Host:$host:$port\r\n";
で対応できているんですよね?

何だか原因はスペルミスだけだった気がしてきました。
0220nobodyさん03/07/29 16:53ID:???
>>218 (゚Д゚)ハァ?

>>217 サーバーの DirectoryIndex (クライアントがディレクトリをリクエストしたときに調べるリソースのリスト)確認しろ。
0221nobodyさん03/07/29 17:35ID:???
>>220 (゚Д゚)ハァ?
>(勿論ブラウザなら両方OKです。)
0222nobodyさん03/07/29 19:38ID:71pkcqEp
>>220
(゚Д゚ )ハァ?
それで返ってくるのは403だろ。氏ねや
0223あぼーんNGNG
あぼーん
0224nobodyさん03/07/29 19:55ID:???
connect の後に SELECT してるけど、代わりに autoflush SOCKET (1); は?
0225nobodyさん03/07/29 21:36ID:???
>>213
alarm使って、キー待ちにしたらどう?
time値の0秒ジャストで動かせないけど。

local $SIG{ALRM} = sub { die 'timeout' };

...
my $c = &keywait(1);
...

sub keywait
{
my $interval = shift;

eval{
alarm($interval*60);
<>;
alarm(0);
};
if ($@){
alarm(0);
($@ =~ /timeout/) or die;
return(0);
}

return(1);
}
0226nobodyさん03/07/29 21:40ID:???
>>217
プロトコルをHTTP/1.1にしたら?
0227nobodyさん03/07/29 23:46ID:Y5f15xmJ
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
#$buffer = $ENV{'QUERY_STRING'};

@pairs = split(/&/, $buffer);
foreach (@pairs) {
($key, $val) = split(/=/);
$in{$key} = $val;
}

ここまでやった後で連想配列の中身を見る方法を教えてください。
どんなkeyが入ってるか知りたいのです。それによって処理を分岐するので。
初歩的な質問ですみません。
0228nobodyさん03/07/29 23:48ID:???
>>227
そのままだけど、keys。
0229nobodyさん03/07/29 23:48ID:???
keys
0230nobodyさん03/07/29 23:48ID:???
>>227
foreach $key ( sort( keys %ENV ) ) {
print "$key = $ENV{$key}\n";
}
0231nobodyさん03/07/29 23:49ID:???
>>230
ENV???
0232nobodyさん03/07/29 23:56ID:???
>>227
print map { "$_ : $in{$_}\n" } keys %in;
0233あぼーんNGNG
あぼーん
0234nobodyさん03/07/30 00:01ID:KKMTj9U0
分解数がわからないsplitの場合、

$name = 'c:\windows\system32';

$i = 0;

while($name =~ /\\/g){
$i+=1;
}

@match = ();
for($n=1; $n<=$i+1; $n++){
$a = '$path'.$n;
push(@match,"$a");
}

@match = split(/\\/,$name);

foreach $col (@match){
print "$col<br>";
}

がんばってこんな感じになりました。
けっこう長いです・・サブルーチンになりそう・・・
もっと簡潔な方法あれば教えてください。
023523403/07/30 00:06ID:KKMTj9U0
すんません。
$a = '$path'.$n;
push(@match,"$a");
これは、
push(@match,"%n");に変えます。

配列の全値をjoinでスカラ($match)に代入
そして、($match) =split・・・・
ってやるつもりだったんですが、$matchが展開されないってことに気づいて、
リファレンス良く見ると、そのまま配列でsplitできることがわかって、
$pathっての消すの忘れてました。
023623403/07/30 00:06ID:KKMTj9U0
× %n
○ $n
何回もすいません。
0237nobodyさん03/07/30 00:08ID:???
>>234

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

これを読め。結局何がしたのが伝わってこない
0238nobodyさん03/07/30 00:08ID:???
×結局何がしたのが伝わってこない
○結局何がしたいのか伝わってこない
023923403/07/30 00:09ID:KKMTj9U0
>>237
簡潔な方法がないか聞きたかったんです。
けっこう長いから・・・
0240nobodyさん03/07/30 00:10ID:???
>>239
簡潔な「何をする」方法なのか?
024123403/07/30 00:10ID:KKMTj9U0
ここは、エラーがどうしても消えなくて、助けをほしい人がくるスレなんですね。
簡略なソースを求めるスレでないんですね。
どうもすいませんでした。
0242nobodyさん03/07/30 00:12ID:???
>>241
分かればよろしい。
0243nobodyさん03/07/30 00:13ID:???
どんな結果を言葉で示してくれないと答えようがない。
ただ単にソースをダラダラ書かれても困るだけ。
このスレの解答者はソース解析屋でもないんだから
0244あぼーんNGNG
あぼーん
0245nobodyさん03/07/30 00:14ID:QkXS28T1
デバッガ付きのPerl処理系ありますか?
ErrorメッセージがInternal Server Errorだけじゃ捗りませんよね。
0246nobodyさん03/07/30 00:15ID:???
perl -d
024723403/07/30 00:17ID:KKMTj9U0
>>243
ええと、このソースは、フォームから「文字列」と、「分解の基準になる文字列」(なんか分かりにくいかな・・
split(/aa/,"")←ここのaaの部分です。
で、フォームからだと、だれがどんな文字列もってくるかわからないでしょ?
だから、当然分解数も違う。
それで、分解数がはじめから分からなくても、ちゃんとsplitで分解する
っていうのが上のスクリプトなんです。


あぁ、説明下手で伝わらなかったらゴメン
024823403/07/30 00:20ID:KKMTj9U0
なんかダラダラ書いてるから日本語おかしくなってる・・・
4行目の「で」は「受け取って、splitで分解するスクリプトなんです。」ですね・
なんか日本語変になってる
0249nobodyさん03/07/30 00:20ID:???
日本語の解析も必要みたいです。
0250nobodyさん03/07/30 00:22ID:???
>>248
とりあえず、年齢とPerl歴、日本語歴をお書きになってください。
025123403/07/30 00:24ID:KKMTj9U0
ごめんなさい。書き直します。


>>234のスクリプトは、フォームから「文字列」と「分解の基準になる文字」を受け取って、
それをsplitして表示する、というものです。

でも、フォームから送られてくるのは人によってまちまちだし、当然分解する数も違うので、はじめっから
($a,$b) = split(/$bunkaimojiretu/,"$mojiretu");なんてできません。
だから、上のようにまず、whileで「分解の基準になる文字列」の数を調べて、
次に、その数+1個分の値がある配列を作ります。
そして、その配列を分解

こうすれば、分解数がわからなくても、ちゃんとsplitしてくれる、そういうスクリプトです。
025223403/07/30 00:26ID:KKMTj9U0
それで、自分なりにがんばってみて>>234ができあがったわけなんですが、
どうもソースが長いなぁ、と思い、簡略化できないかと聞いてみた次第です。

お手数かけてすみません。これでマシな日本語になりましたか?
0253nobodyさん03/07/30 00:27ID:???
>>251
なんでそんなことをする必要があるのか全然わからん。

@pairs = split /\&/, $STDIN;
foreach ( @pairs ) {
($k, $v) = split /=/;
$form{$k} = $v;
}

これでは何故いかんのか?
0254nobodyさん03/07/30 00:29ID:???
>>234

$name = 'c:\windows\system32';

foreach (split(/\\/,$name)) {
print "$_<br>";
}

もう飽きた。
0255nobodyさん03/07/30 00:29ID:???
>>252
うん。よくわかった。
025623403/07/30 00:29ID:KKMTj9U0
$STDIN???
僕がやっているのは、ブラウザからなんですよ。DOS窓じゃないんです・・・
025721303/07/30 00:30ID:???
収束してから書き込もう…
0258nobodyさん03/07/30 00:30ID:???
split(/\\/,$name)は\で区切った配列になるのだ。
025923403/07/30 00:30ID:KKMTj9U0
>>254
えと、この場合は、フォームからの文字列が、たとえば「c:\windows\system32」の場合の話ですよ〜
ってことです。
なにも言ってなくてスイマセン。
026023403/07/30 00:31ID:KKMTj9U0
そうですね。この場合は、ちゃんと
split(/$cut/,$name)くらいにしておけばよかったです。
誤解を招くようなこと書いてすいません。
0261nobodyさん03/07/30 00:33ID:???
>>260
おまい、どんどん頭よくなっていくなぁ・・。
026223403/07/30 00:33ID:KKMTj9U0
すいません。
初めの一行に「フォームからの文字列(c:\windows\system32)、分解の基準の文字(\)の場合の例」
と、一言かいておければよかったです。
無駄なレスさしてほんとに申し訳ないです。。
0263nobodyさん03/07/30 00:34ID:???
>>256
その台詞で貴様の技能がどの程度かよくわかった。
標準入力からだろうがブラウザからだろうが入力は入力だろうが。応用の利かない阿呆が。
0264nobodyさん03/07/30 00:36ID:???
>>263
はぁ、アフォだ。STDINなんかcgiで使えるわけないだろ、氏ね
026523403/07/30 00:37ID:KKMTj9U0
>>263
え?STDINって、DOS窓じゃなかったんですか?
フォームのデータは、ReadParse使って、変数に格納してる状態なんですけど・・・
026623403/07/30 00:37ID:KKMTj9U0
もしかして、POSTの場合の、フォームの受け取りのことを言っていたんでしょうか?
0267nobodyさん03/07/30 00:38ID:???
264nobodyさんsage03/07/30 00:36 ID:???
>>263
はぁ、アフォだ。STDINなんかcgiで使えるわけないだろ、氏ね
0268nobodyさん03/07/30 00:40ID:???
234 の混乱ぶりが面白いw
026923403/07/30 00:43ID:KKMTj9U0
253の言いたいことがようやくわかりました。
標準入力、GETの場合は?以降を、分割するってことを言っていたんですね。
そういうことではないんです。
フォームから、好きな文字列とキーの文字を送ってもらって、
そのキーで「文字列」を分解するってことです。
GETの場合でいうと、
?moji=c:\windows\system32&key=\
それで、この「\」で「c:\windows\system32」を分解したいんです。
?moji=aiueo,kakikukeko,sasisuseso&key=,
こんなことです。
0270nobodyさん03/07/30 00:46ID:???
>>269
だから応用できるだろって言ってるだろ。
0271nobodyさん03/07/30 00:47ID:???
俺、未だに 234 が何をしたいのか良く解らないんだけど…

> 初めの一行に「フォームからの文字列(c:\windows\system32)、分解の基準の文字(\)の場合の例」

要は、ある文字列を分解の基準の文字で分解してリストにしたいって事?
split でいいんじゃねーの?って思うが、肝心な「期待しているリストにはこう入って欲しい」
みたいなこと書いてねーからさっぱり解らん
0272nobodyさん03/07/30 00:53ID:???
234のしゃべりとスクリプトがそっくりでおもしろい。
027323403/07/30 00:53ID:0qjcwLeT
>>271
そういうことです。
それで、「ある文字列」も、「基準の文字」も、「何分割される」かも、分からない、という状況で、
どういうスクリプトで処理したらいいかといろいろ試行錯誤して、上のスクリプトができました。
それで、このスクリプトは正しいのか?、もっと簡単にできるんではないか?と思いまして、聞いてみました。
0274nobodyさん03/07/30 00:56ID:???
で、@match にはどう入って欲しい訳?
君はその事について未だ何も記述してないね
■ このスレッドは過去ログ倉庫に格納されています