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

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん03/06/28 01:18ID:???
いらっしゃーい、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
0871nobodyさん03/07/21 15:45ID:???
>>870
君の頭が変
変っていうかおめでたいね。

できるかできないか実際やってみればいいだろ
ヴォケ!
それで、書き込めなかったらどっか悪いんだよHAGE!
そもそも、Cookieについて理解してるのか???ぁあん(゚Д゚#)

my $day = "";してて
if($day > 0)
ってのがわけわからんけど
0872nobodyさん03/07/21 15:49ID:???
>>871
病院いったほうがいいよ。
087387103/07/21 15:53ID:???
>>872
明日いってくる
0874nobodyさん03/07/21 18:35ID:???


























0875nobodyさん03/07/21 18:48ID:???
>>874
は?そりゃお前が悪いだけだろ。
3行目にprint $count;を入れてみろ。
0876nobodyさん03/07/21 19:35ID:???
>>870
重要なことは、知りたい物をはっきり目に見える形にすること。
やり方はいろいろあるけどね。

>print "Content-Type: text/plain\n\n";
>print "Welcome !";}

の部分を以下に書き換えで、クッキーを見る。

print <<'EOF';
Content-type: text/html

<html><head><title>check</title></head><body>
<script language="JavaScript"><!--
alert("Cookie=\""+document.cookie+"\"");
//--></script>
</body></html>
EOF
}
0877nobodyさん03/07/21 19:54ID:???
<script type="text/javascript"
と書く香具師は誰もいないのか鬱。
0878nobodyさん03/07/21 19:56ID:???
>>877
Perlスレでわざわざ嘆くことでも無かろう。
0879nobodyさん03/07/21 19:57ID:SiseSbMQ
ネットサーフレスキューの簡易データベースの項目を増やすにはどうすればいいですか?
0880nobodyさん03/07/21 20:00ID:???
>>879
死ね。
0881nobodyさん03/07/21 20:09ID:???
>>879
このスレは「perlコーディング初心者」の質問スレなので、レスキューやKENT等の
ヘボスクリプトをいじれないウルトラボは経験値上げてから来てください。
0882nobodyさん03/07/21 20:27ID:???
ウルトラボ?
0883nobodyさん03/07/21 20:30ID:???
>>877
何を考えてんだか
0884nobodyさん03/07/21 21:33ID:7NpeSLR0
連想配列からキーをスカラー変数で指定して
値を取り出すことは不可能でしょうか?

$nedan = $F_NEDAN{$name};
これでやってみると
$nedanは空でした。
0885nobodyさん03/07/21 21:46ID:???
>>884
はいはい、良かったね。氏ねバカ。

print $F_NEDAN{hoge},"\n";

$name = "hoge";
print $name,"\n";
print $F_NEDAN{$name},"\n";
0886nobodyさん03/07/21 21:46ID:???
>>884
それはお前がミスしてるだけ。
$nameにブツが入っているのかどうかよく確認しろ。
0887nobodyさん03/07/21 22:28ID:???
おまえらイライラすんなって。
0888nobodyさん03/07/21 22:48ID:???
>>885
カルシウム タリナイナ (´д)ヒソ(´д`)ヒソ(д` )
0889nobodyさん03/07/21 23:05ID:???
>>860
は本当?
0890nobodyさん03/07/21 23:50ID:???
>>889
本当。使ってみればわかることじゃん。
0891ともちゃん03/07/22 01:21ID:U6Ps44rq
871番さん
my $day = "";のif($day > 0)ですがif($day = 0)にしました。
でも、my $dayの記述はやめてしまいました。
日時の取得も{}から外に出して時間も取得する事にしました。(^_^)v
わたし馬鹿ですから・・・

876番さん、ありがとうございます。
時間の取得に関係する事は前にも書いたみたいにして
クッキーが入っているか試してみましたよ。
abc=defってアラートが出てきたので、書き込まれている事になると思います。
だから、それに対してのクッキーの読み込みの部分がうまくいかないみたいです。
私の最初の書き方がダメだったのかしら・・・(;_;)
855番さんにせっかく教えてもらえたのに〜。

分からなくて困ってしまいました。
0892nobodyさん03/07/22 02:02ID:???
めちゃくちゃだな。if($day = 0)
0893nobodyさん03/07/22 02:04ID:???
まだやってんのか・・・
cookieの読み書き使ってるスクリプトなんかいくらでもあるんだから、
それでも参考にしたほうが早い
0894nobodyさん03/07/22 03:10ID:???
GETしに行って、デッドロックを避ける為に
タイムアウトさせたいのですが、
どう書いたらいいですか?
0895nobodyさん03/07/22 04:20ID:???
>>891
クッキーを見えるようにスクリプトを書きかえて確認しる。
難しい所はないでしょ?

>>894
alarmとシグナルの使い方なら、
Perl クックブックのレシピ16.21
もしくは perldoc perlipc
http://www.kt.rim.or.jp/~kbk/perl5.005/perlipc.html#Signals
もしくは
http://pc2.2ch.net/test/read.cgi/php/1044717887/879-886
辺りで。
0896nobodyさん03/07/22 08:49ID:I6YqyoJP
今、htmlファイルを読み込み、そこに新たなデータを付け加えてまたhtmlに書き出すスクリプトを作っています。

$name3 = '../../name.html';

open IN,"$name3";
@UP = <IN>;
close IN;

$temp = <<"TEMP";
<!--NEW UP-->
<div>
<p>$date</p>
<p>$name1</p>
<p>$name2</td>
</div>
TEMP

foreach $upd (@UP){
$upd =~ s/<!--NEW UP-->/$temp/;
}

open IN, ">$name3";
print IN @UP;
close IN;

というように書いてみたのですが、name3.htmlに書き出してくれません。
どう書いたら、htmlを書き出してくれるでしょうか?
0897nobodyさん03/07/22 09:44ID:???
ActivePerl5.8を入れてPerl/tk使ってみますた。
Dos窓がビロビロと出てくるのが気になりイライラがつのります。
Perl/tkを何に使うおうか小一時間かんがえますた。

答え(妄想してください。): ・・・・・・・・・・・・・
0898nobodyさん03/07/22 10:22ID:???
>>896
> $name3 = '../../name.html';
name3.html が定義されていません。

> <p>$name2</td>
</p>がありません。

> $upd =~ s/<!--NEW UP-->/$temp/;
$upd =~ s/<\!--NEW UP-->/$temp/;
と描くべきでしょう。

> print IN @UP;
print IN join("\n",@UP);
ではないでしょうか?

>>897
板違い。
電波・お花畑
http://etc.2ch.net/denpa/
0899nobodyさん03/07/22 10:29ID:???
>>898
! はメタ文字じゃないぞ。
0900nobodyさん03/07/22 10:47ID:???
>>896
はいはい、良かったね。氏ねバカ。

1.name.htmlに書き出しているのに、name3.htmlに書き出されると勘違いしている。

2.書き込み権限が無い
open IN, ">$name3" or die $!;

質問がめちゃくちゃだからこれ以上書き込みするな。礼も何もいらん。
質問すらまともにできないのは初心者未満だ。もう一度小学校行って来い。
0901nobodyさん03/07/22 11:13ID:???
>>899
すまぬ。
?<! と勘違いしていたようだすた。∧||∧
0902nobodyさん03/07/22 12:21ID:???
>>895
げ。windowsでは使えないって書いてある、、、
0903nobodyさん03/07/22 12:26ID:???
>>900
おまえ病院はいった?
0904nobodyさん03/07/22 13:09ID:???
みんなもちつけ
>>896
name3.htmlに>>で書き出さないとだめじゃないの?
それと書き出しただけじゃだめじゃないの?
クライアントのブラウザの更新をjavascriptでやったら?
0905nobodyさん03/07/22 13:56ID:???
>>896で問題なく動く
単に書き込まれるファイル名を勘違いしてるだけ
0906nobodyさん03/07/22 13:59ID:???
おっと、あくまで元ファイルに上書きで更新ね
0907nobodyさん03/07/22 14:10ID:???
>>896
open NAME3, '+<' . $name3 or die;
{
  local $/ = "<!--NEW UP-->\n";
  <NAME3>; # NEW UP まで移動
  my $pos = tell; # NEW UP 直後のファイルポインタ
  my $old = <NAME3>; # NEW UP より下のデータ
  seek NAME3, $pos, 0; # NEW UP 直後まで戻る
  print NAME3 <<"NEW";
<div>
<p>$date</p>
<p>$name1</p>
<p>$name2</p>
</div>
NEW
  print NAME3 $old;
}
close NAME3;
0908nobodyさん03/07/22 14:53ID:???
>>907
へそ曲がりだなw
090990403/07/22 16:57ID:???
そうか、上書きでいいのか。
>そこに新たなデータを付け加えて
なんて書いてあったから・・・
そうか、サーバ上のファイルに変更を加えないのか。
>またhtmlに書き出す
なんて書いてあったから・・・
でも、「もちつけ」はよかったでそ

0910nobodyさん03/07/22 20:06ID:???
>>897
Dos窓を消す方法はあるぞ。
0911nobodyさん03/07/22 20:35ID:???
DOS窓って、まだ95/98使ってるのか?
0912nobodyさん03/07/22 20:50ID:???
>>911
Meでも。
0913nobodyさん03/07/22 21:09ID:???
Dos窓消す方法ってないでしょ・・・。
0914nobodyさん03/07/22 21:12ID:???
>>913
exitと入力。
0915nobodyさん03/07/22 21:23ID:???
>>914
そういう意味じゃなくて
perl/tkつかったプログラム実行すると
tkウインドウの後ろでDos窓がずっとでてる。
どうやればDos窓を表示せずにtkウインドウだけ表示するか
ということを質問してるんじゃないかな。
0916nobodyさん03/07/22 21:31ID:???
>>915
いいや、きっと閉じられなくなったんだ。
0917nobodyさん03/07/22 21:40ID:???
>>916
はぁ・・・
0918ともちゃん03/07/22 21:42ID:U6Ps44rq
895番さん
それができなくて困っているんですー。(~_~;)
どこか他の質問掲示板で良い場所ご存知ですか?
色々な場所で聞いてみたいのです。
0919あぼーんNGNG
あぼーん
0920あぼーんNGNG
あぼーん
0921nobodyさん03/07/22 22:14ID:???
>>918
ずいぶん失礼な態度だな。
ここの人間が役に立たないと思うんなら早いとこ出て行ってくれ。
0922nobodyさん03/07/22 22:15ID:???
第三者だが他の奴はともかく>>921が役に立つとは到底思えない。

0923あぼーんNGNG
あぼーん
0924nobodyさん03/07/22 22:31ID:???
897っす。 Dos窓が使えない奴もいるのね。
環境は、xp で、ActivePerl5.8 で、Perl/tk試しです。板違いで、ごめんよ。

use Tk;
$top = MainWindow->new();
$button = $top->Button( -text => 'EXIT', -command => \&exit );
$button->pack();

例えば、上のコードをtest.pl として起動すると、
tkウィンドウが表示される前に、
DOS窓が一瞬表示されフェードアウトするようにビロビロと消える動作をし、
それが、ただイライラすると書いた分けです。

誰か試さないかい?
0925nobodyさん03/07/22 22:32ID:???
>>918
自分で何もやらない・言われたことを何もやらない。
そんな態度ではどこの掲示板へ行っても同じこと。
2ちゃんを特別だと思うなよ。モニタの前にいるのは人間だ。
0926nobodyさん03/07/22 22:32ID:???
>>922
普通はわざわざ第三者を名乗らないと思うが。
0927nobodyさん03/07/22 22:41ID:???
897っす。

>どこか他の質問掲示板で良い場所ご存知ですか?
>色々な場所で聞いてみたいのです。

ともちゃん、おもしろすぎ。みんなイライラするから、どっかいき。
0928nobodyさん03/07/22 23:04ID:???
>>924
DOS窓も【コマンドプロンプト】も表示されないぞ。
って言うか、何も表示されないまま終わった

※DOS窓 = 95/98/Me
※コマンドプロンプト = NT/2000/Xp
0929nobodyさん03/07/22 23:13ID:???
>>928
#!C:/Perl/bin/perl
use Tk;
$top = MainWindow->new();
$button = $top->Button( -text => 'EXIT', -command => \&exit );
$button->pack();

でどう?

>※DOS窓 = 95/98/Me
>※コマンドプロンプト = NT/2000/Xp

ああ、DOS窓で通じないのか。ごめんよ。
0930nobodyさん03/07/22 23:22ID:???
>>929
3.1、3.0、2.0、1.0とCEが抜けてるぞ。
0931nobodyさん03/07/22 23:33ID:???
うちのMeにはDOS窓という項目がありませんが、
どうやって呼び出すのですか?
0932 ◆hMJAPH9PWA 03/07/22 23:34ID:???
>>DOS窓が残ってイライラしてるやつ

perl.exeのかわりにwperl.exeを使えばいい。

でもあなたの態度はよくないよ。
質問する側が煽ってどうすんのさ。
もう少し礼儀を身に付けたほうがいい。
0933nobodyさん03/07/22 23:38ID:???
>>929
use Tk;
$top = MainWindow->new();
#$button = $top->Button( -text => 'EXIT', -command => \&exit );
#$button->pack();
MainLoop();

こうだろ?
Win2000だが起動時にちょっとDos窓が表示されるな。
0934nobodyさん03/07/22 23:40ID:???
>>929
Tkのウィンドウ表示しないよ

環境は w2k + perl v5.6.1

Tk 使ったことないから解らんけど、site/lib/Tk.html 見ると
そのサンプル、MainLoop が無いから、「一瞬」だけ表示して
すぐ終わっちゃうから、表示されてないようにみえるんだな

use Tk;
$top = MainWindow->new();
$button = $top->Button( -text => 'EXIT', -command => \&exit );
$button->pack();
MainLoop;
0935nobodyさん03/07/22 23:46ID:???
俺の環境(w2k)だと、「DOS窓」も「コマンドプロンプト」も表示されないよ。
0936nobodyさん03/07/22 23:46ID:???
>>932
Dos窓上でtk使ったプログラムを動かしたときじゃなくて
tk使ったプログラムのアイコンをダブルクリックしたときに
Dos窓がでてくるのが気になるんだと思う。
0937nobodyさん03/07/22 23:49ID:???
>>935

最後にMainLoop();
0938nobodyさん03/07/22 23:50ID:???
>>936
そりゃ、当然だろ。tk でウィンドウ表示する前に perl 起動してるんだから、
コマンドプロンプトウィンドウ出るのはしょうがないと思うが…
0939nobodyさん03/07/22 23:51ID:???
どうにかしてでてこないようにはできないものか。
0940nobodyさん03/07/22 23:56ID:???
ごめん、MainLoop();が落ちてました。

>>933
ありがとう。そうそう同症状です、納得しました。

>>934 
ありがとう。Perl5.8から標準だそうで、
MainLoop がないとtk自体もですね。

>>932
ご指摘ありがとう。
ここ>>897 質問でなく、もともとネタだったりするから。
0941nobodyさん03/07/23 00:10ID:???
>>935
#!C:/Perl/bin/perl #いらないかも
use Tk;
$top = MainWindow->new();
$button = $top->Button( -text => 'EXIT', -command => \&exit );
$button->pack();
MainLoop;

>>936
どうもです。そうです。そういうことです。

>>938
どもです。確かにしょうがないとも思います。(w

>>939
どもです。できれば出て来ない方がね。(w
0942nobodyさん03/07/23 00:42ID:???
>>941
plへのショートカット作って「プロパティ」で「起動時のウィンドウの大きさ」を「最小」にすれば?
0943nobodyさん03/07/23 00:55ID:???
>>941
932さんが答え教えてくれてるじゃん。
{$Perlのインストールディレクトリ}\bin\wperl.exeを.plファイルに
関連付ければ、エクスプローラからダブルクリックで窓は開かないはず。
094489603/07/23 01:45ID:???
ありがとうございました。
無事、動くようになりました。
お礼が遅くなりまして、すみませんでした。
とんちんかんな質問にも回答くださった皆様に、感謝しています。
もっと勉強してから出直します。
0945nobodyさん03/07/23 02:00ID:???
原因言わねーのかよ。回答する価値の無い人間だな。
0946nobodyさん03/07/23 05:51ID:???
質問させてもらいに来ました。
記述その物ではありませんが、構成的なアルゴリズムの質問です。

初めに-----
CGIのゲーム
IDを用いて個人登録
参加者一名につきtxtFileが一つ
ゲーム全体のtxtFileが一つ(頻繁に書き換え)


この時、ある参加者の特定の行動により「参加者が保有するファイル」を書き換えたい場合があります。
1:そう言った時は、全体の情報ファイルになんらかの記録を残しておき「参加者がアクセスした時」に書き換えたほうが良いでしょうか?
2:それとも、書き換える原因となった処理の時、「その場で」全参加者のファイルを書き換えたほうが良いでしょうか?

前者の場合は実現が困難で、またバグも出そうな気がします。
また効率の良さそうなやり取りもピンと浮かびません(俺の実力では)

後者の場合は、実現が簡単そうで管理も比較的容易な気がしますが、
参加者が増えた時は多量のファイルを一気に検索&書き換えで微妙にコワイです。
それと、A君のアクセスにより、直でB君所有のデータファイルが書き換えられるのはなんか個人的に抵抗があります。


こんな場合、普通、プログラマーはどちらの処理方式を取るのでしょうか?
もしよろしければ、理由もつけて回答してくれると嬉しいです。
0947nobodyさん03/07/23 09:11ID:???
好きな様にすればぁ?
094894603/07/23 10:16ID:???
すみません、今見なおしたら文書が変だったので訂正します。

この時、ある参加者の特定の行動により「参加者が保有するファイル」を書き換えたい場合があります。
↓
この時、ある参加者の特定の行動により「他の参加者が保有するファイル」を書き換えたい場合があります。

0949nobodyさん03/07/23 12:20ID:???
太いものには巻かれろ。
0950nobodyさん03/07/23 12:42ID:???
>>946
データベース使え。
あと微妙にスレ違いかもしれん(・・・そうでもないか?
0951nobodyさん03/07/23 12:57ID:???
ある参加者のイベントによって他の全参加者のファイルを扱わなければ
ならない構造が誤りの気がする
データベース使うならそれもありだろうけど
0952nobodyさん03/07/23 13:50ID:???
で、それのどこが【Perl コーディング】と関係ある訳?
0953nobodyさん03/07/23 14:29ID:???
ちょっち質問です。
HTMLを出力した後に一度バッファをフラッシュしてから
時間のかかる処理をしたいのですが
どのように書けばよいのでしょうか?
095495303/07/23 14:37ID:V4h+SVeU
ageわすれますた。

ついでにもう一つお伺いしたいんですが
複数の変数やら配列を undef する場合
一個づつ
undef $val; undef @array; undef %hash;
と書く以外に方法ってあるでしょうか?
ちょと面倒くさいなと思いまして。
0955あぼーんNGNG
あぼーん
0956nobodyさん03/07/23 15:18ID:???
undef $val @array %hash;
0957nobodyさん03/07/23 15:32ID:???
>>953\
$| = 1; # flushする
095895303/07/23 15:46ID:???
>>956
ありがとです。

>>957
print $HTML;
$|=1;
sleep 5;

とやると出力を拝む前にシッカリ sleep していて
何だかフラッシュされていない気がするんですが
どういうコトなんでしょう?
0959nobodyさん03/07/23 16:22ID:???
>>958
httpサーバが処理が全部終わるまで待ってる。
Perlが終了した時点で出力する。
0960nobodyさん03/07/23 16:27ID:???
>>958
オートフラッシュはprintするより前で
場合によってはソースの先頭でもいいし
096196703/07/23 16:48ID:???
そだよ、960さんの言うように
$|=1;
print $HTML;
sleep 5;
ってしなきゃ。
096295303/07/23 16:59ID:???
なるほど。
print の前に書くんですね。
皆さんアリガトでした!
0963nobodyさん03/07/23 22:08ID:???
Perl/tk[試し中]

>>942
ありがとう:こんな方法もあるんですね。勉強になりました。

>>943
ありがとう:バッチリ!です。スッキリ!です。感謝です。
気になるのは wperl.exe でも支障はないのでしょうか?
0964nobodyさん03/07/24 00:15ID:???
>>6 の http://www.bekknet.ad.jp/~bero/docj/module_/ って消滅したの?
0965nobodyさん03/07/24 02:04ID:???
リファレンス(?)で悩んでます

ニュースグループのグループリスト取得するものですが、$nntp->list の所の説明を読むと
> アクティブなすべてのニュースグループについての情報を取得する。戻り値は、
> グループ名をキー、配列へのリファレンスを値とする、ハッシュへのリファレンスである。
> 値が指す配列は、グループの最初の記事番号、グループの最後の記事番号、
> グループについての情報フラグを要素に持つ。

と、あるのですが @$group{$_} を print すると ARRAY(0x33174ec) とか表示されてしまいます
イメージ的に 最初の記事番号 最後の記事番号 フラグ と表示されると思ったんですが…

use strict;
use Net::NNTP;
{
my ( $nntp, $group );

$nntp = Net::NNTP->new( 'some.what.news', Debug => 1 );
$nntp->reader;

$group = $nntp->list;
foreach ( keys %$group ) {
print "N=$_ " . "V=" . @$group{$_} . "\n";
}
$nntp->quit;
}
0966nobodyさん03/07/24 02:09ID:???
>>965
@{$group->{$_}}ちゃうんか。
0967nobodyさん03/07/24 02:58ID:???
>>966
表示するようになったけど、全部同じデータでしかも、"3" というデータしかない…。
俺が思っているデータイメージは

$group = (
[ 'name', [ 1, 2, 3 ] ], # name はグループ名で、1,2,3 ... のリストがグループの記事番号とかのデータ
 ・
 ・
 ・
 (以下略)
);

と、思ってるんだけど、間違いないカナ?
0968nobodyさん03/07/24 03:05ID:???
その語尾はやめれ
0969nobodyさん03/07/24 03:21ID:???
なんで 3 というデータしか表示されないか解った。
print に渡した時にはスカラー値として、リストのデータが 3 あるから、
3 としか表示されなかった。foreach でもう一回ループを廻すか、
join とか使うしかないのね…。

# 青らくだ本買わないと駄目だぁ…。

$group = $nntp->list;
foreach $name ( keys %$group ) {
print "N=$name\n";
foreach ( @{$group->{$name}} ) {
print "\t$_\n";
}
}

# それにしても、グループの数が物凄いんですが…。
0970nobodyさん03/07/24 16:26ID:kzmo+pjp
rand は時間で数字が決まります。
完全にランダムにするか、2回連続で
同じ数字は出ないようにする方法は?
レス数が950を超えています。1000を超えると書き込みができなくなります。