トップページ⇒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
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回連続で
同じ数字は出ないようにする方法は?
0971nobodyさん03/07/24 16:40ID:???
rand が時間によって乱数を生成するとはマニュアルのどこにも載ってないが?
0972nobodyさん03/07/24 16:48ID:???
srandしてねーだろ。
0973nobodyさん03/07/24 16:50ID:???
>>971
( ´,_ゝ`)プッ マニュアルダッテ
0974nobodyさん03/07/24 16:56ID:???
>>973
( ´,_ゝ`)プッ マニュアルシラナイナンテ
http://www.perldoc.com/
Perl Manpage - Reference Manual
0975nobodyさん03/07/24 17:03ID:???
>>974
( ´,_ゝ`)プッ ジカンデキマルノハマチガイナイヨ
      モットベンキョウシヨウナ… 
0976nobodyさん03/07/24 17:12ID:???
>>975
( ´,_ゝ`)プッ マニュアルシラナイヤツニイワレタクナイヨ
         アトオレ971ジャナイカラ。モウソウハ ヤメヨウネ
0977nobodyさん03/07/24 17:18ID:???
( ´,_ゝ`)プッ
http://www.perldoc.com/perl5.8.0/pod/func/rand.html
どこに時間で決まるなんて書いてあるんだ?
0978nobodyさん03/07/24 17:22ID:???
>>970 ID:kzmo+pjp ヴァカ丸だし晒しあげ
0979nobodyさん03/07/24 17:28ID:MQ0CG0Oj
>>978
なんでID出てないの
0980nobodyさん03/07/24 17:43ID:???
>>967
$group はハッシュリファレンスだろ?
$group = { name1 => [ ... ], name2 => [ ... ], ... } じゃねーの?

> print に渡した時にはスカラー値として、リストのデータが 3 あるから、
自分で . 演算子使ってスカラーコンテキストにしてるだけじゃん。

while (my($name, $num) = each %$group) {
print "N=[$name] ", 'V=[ ', join(' / ', @$num), " ]\n";
}

この辺しっかり読め。
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perldata.html
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perldsc.html
0981nobodyさん03/07/24 18:02ID:???
次スレまだぁ〜?
0982nobodyさん03/07/24 18:02ID:???
randが時間で決まると言うか、perl5.004以降はsrandを省略すると
srand(time)が自動的に実行されるってことだろ

>>970
完全にランダムも続けて同じ数字が出ないようにするのも
なんらかで出た値を保持する以外にないよ
0983nobodyさん03/07/24 18:08ID:???
次スレ立てないなら埋めるぞ
0984nobodyさん03/07/24 18:32ID:???
>>982
<q cite="http://www.kt.rim.or.jp/~kbk/perl5.doc/perldelta.html">
srandのデフォルトの種はtimeが使われていましたが、これは変更され
ました。現在では、予測するのが困難なシステム依存な値の激しい
(heady)組み合わせで、大部分の everyday purpose に十分なものです。

5.004以前では、srandを最初に呼ぶことなしに引数なしでrandを 呼んだ
場合、ほとんど、ひょっとしたらすべてのマシンで同じ乱数列を得ること
になっていました。現在、perlがそれ以前にsrandを呼び出 していないのに
randを呼び出しているのを検出したときに、perlは デフォルトの種を使って
srandを呼びます。5.004以前のシステムで実行するかもしれないような
プログラムでは、今でも srand を手作 業で呼び出すべきですし、あなたが
デフォルト以外のものを種としたい場合にももちろんそうすべきなのです。
</q>
0985nobodyさん03/07/24 18:34ID:???
うめ
0986nobodyさん03/07/24 18:35ID:???
梅。
0987nobodyさん03/07/24 18:36ID:???
うめー
0988nobodyさん03/07/24 18:38ID:???
おっぱい
0989nobodyさん03/07/24 18:46ID:???
ランダムに文を表示するやつを持ってるんだけど
その文章をリロードしても変わらないようにしたい。1日くらい。
そういうのって出来ませんかね。
↓今の状態
#! c:/perl/bin/perl

# おみくじを引く
$role = int(rand 6);

if($role == 0) {
$kuji = '大吉';
}
(略)
else {
$kuji = '凶';
}

# CGIヘッダの出力
print "Content-type: text/html\n\n";

# HTMLの出力
print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n";
print "<html>\n";
print "<head><title>Perlおみくじ</title></head>\n";
print "<body><p>今日のあなたの運勢は……<big>$kuji</big>です。</p>\n";
print "</html>";
0990nobodyさん03/07/24 18:52ID:???
なんだ、ばかばかしい・・・
0991nobodyさん03/07/24 18:57ID:???
>>989
クッキー
0992nobodyさん03/07/24 19:01ID:???
>989
同じIP && 異なるマシン(同じ世帯の別マシン) → IPと日付を使った数字をsrandの種にする
異なるIP && 同じマシン(ダイヤルアップ接続) → クッキーを使う
異なるIP && 異なるマシン(誰が見ても変わらない) → 日付をsrandの種にする
0993nobodyさん03/07/24 19:02ID:???
>>991
レス番がくっくいー
0994nobodyさん03/07/24 19:08ID:???
梅
0995nobodyさん03/07/24 19:12ID:???
>>982
srandが実行されていない場合、最初に一度だけ初期化される。
実際にはpidやら色々な値を足してる。
あと、/dev/randomが使えるなら、timeよりそっちを優先して使うようになってるぽい。

rand自体はCライブラリのrand()を呼び出したりしてる。
オーバーライドできるので、実装によって違いがあるかも。

http://pc2.2ch.net/test/read.cgi/php/1042260745/9
乱数ならこの辺りを参照。
レス数が950を超えています。1000を超えると書き込みができなくなります。