Perl コーディング初心者質問コーナー Part25
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん
03/06/28 01:18ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
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$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:???Dos窓がビロビロと出てくるのが気になりイライラがつのります。
Perl/tkを何に使うおうか小一時間かんがえますた。
答え(妄想してください。): ・・・・・・・・・・・・・
0898nobodyさん
03/07/22 10:22ID:???> $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/
0900nobodyさん
03/07/22 10:47ID:???はいはい、良かったね。氏ねバカ。
1.name.htmlに書き出しているのに、name3.htmlに書き出されると勘違いしている。
2.書き込み権限が無い
open IN, ">$name3" or die $!;
質問がめちゃくちゃだからこれ以上書き込みするな。礼も何もいらん。
質問すらまともにできないのは初心者未満だ。もう一度小学校行って来い。
0904nobodyさん
03/07/22 13:09ID:???>>896
name3.htmlに>>で書き出さないとだめじゃないの?
それと書き出しただけじゃだめじゃないの?
クライアントのブラウザの更新をjavascriptでやったら?
0906nobodyさん
03/07/22 13:59ID:???0907nobodyさん
03/07/22 14:10ID:???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;
0909904
03/07/22 16:57ID:???>そこに新たなデータを付け加えて
なんて書いてあったから・・・
そうか、サーバ上のファイルに変更を加えないのか。
>またhtmlに書き出す
なんて書いてあったから・・・
でも、「もちつけ」はよかったでそ
0911nobodyさん
03/07/22 20:35ID:???0913nobodyさん
03/07/22 21:09ID:???0915nobodyさん
03/07/22 21:23ID:???そういう意味じゃなくて
perl/tkつかったプログラム実行すると
tkウインドウの後ろでDos窓がずっとでてる。
どうやればDos窓を表示せずにtkウインドウだけ表示するか
ということを質問してるんじゃないかな。
0918ともちゃん
03/07/22 21:42ID:U6Ps44rqそれができなくて困っているんですー。(~_~;)
どこか他の質問掲示板で良い場所ご存知ですか?
色々な場所で聞いてみたいのです。
0919あぼーん
NGNG0920あぼーん
NGNG0923あぼーん
NGNG0924nobodyさん
03/07/22 22:31ID:???環境は、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:???自分で何もやらない・言われたことを何もやらない。
そんな態度ではどこの掲示板へ行っても同じこと。
2ちゃんを特別だと思うなよ。モニタの前にいるのは人間だ。
0927nobodyさん
03/07/22 22:41ID:???>どこか他の質問掲示板で良い場所ご存知ですか?
>色々な場所で聞いてみたいのです。
ともちゃん、おもしろすぎ。みんなイライラするから、どっかいき。
0928nobodyさん
03/07/22 23:04ID:???DOS窓も【コマンドプロンプト】も表示されないぞ。
って言うか、何も表示されないまま終わった
※DOS窓 = 95/98/Me
※コマンドプロンプト = NT/2000/Xp
0929nobodyさん
03/07/22 23:13ID:???#!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窓で通じないのか。ごめんよ。
0931nobodyさん
03/07/22 23:33ID:???どうやって呼び出すのですか?
perl.exeのかわりにwperl.exeを使えばいい。
でもあなたの態度はよくないよ。
質問する側が煽ってどうすんのさ。
もう少し礼儀を身に付けたほうがいい。
0933nobodyさん
03/07/22 23:38ID:???use Tk;
$top = MainWindow->new();
#$button = $top->Button( -text => 'EXIT', -command => \&exit );
#$button->pack();
MainLoop();
こうだろ?
Win2000だが起動時にちょっとDos窓が表示されるな。
0934nobodyさん
03/07/22 23:40ID:???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:???0936nobodyさん
03/07/22 23:46ID:???Dos窓上でtk使ったプログラムを動かしたときじゃなくて
tk使ったプログラムのアイコンをダブルクリックしたときに
Dos窓がでてくるのが気になるんだと思う。
0938nobodyさん
03/07/22 23:50ID:???そりゃ、当然だろ。tk でウィンドウ表示する前に perl 起動してるんだから、
コマンドプロンプトウィンドウ出るのはしょうがないと思うが…
0939nobodyさん
03/07/22 23:51ID:???0940nobodyさん
03/07/22 23:56ID:???>>933
ありがとう。そうそう同症状です、納得しました。
>>934
ありがとう。Perl5.8から標準だそうで、
MainLoop がないとtk自体もですね。
>>932
ご指摘ありがとう。
ここ>>897 質問でなく、もともとネタだったりするから。
0941nobodyさん
03/07/23 00:10ID:???#!C:/Perl/bin/perl #いらないかも
use Tk;
$top = MainWindow->new();
$button = $top->Button( -text => 'EXIT', -command => \&exit );
$button->pack();
MainLoop;
>>936
どうもです。そうです。そういうことです。
>>938
どもです。確かにしょうがないとも思います。(w
>>939
どもです。できれば出て来ない方がね。(w
0943nobodyさん
03/07/23 00:55ID:???932さんが答え教えてくれてるじゃん。
{$Perlのインストールディレクトリ}\bin\wperl.exeを.plファイルに
関連付ければ、エクスプローラからダブルクリックで窓は開かないはず。
0944896
03/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:???0948946
03/07/23 10:16ID:???この時、ある参加者の特定の行動により「参加者が保有するファイル」を書き換えたい場合があります。
↓
この時、ある参加者の特定の行動により「他の参加者が保有するファイル」を書き換えたい場合があります。
0949nobodyさん
03/07/23 12:20ID:???0951nobodyさん
03/07/23 12:57ID:???ならない構造が誤りの気がする
データベース使うならそれもありだろうけど
0952nobodyさん
03/07/23 13:50ID:???0953nobodyさん
03/07/23 14:29ID:???HTMLを出力した後に一度バッファをフラッシュしてから
時間のかかる処理をしたいのですが
どのように書けばよいのでしょうか?
0954953
03/07/23 14:37ID:V4h+SVeUついでにもう一つお伺いしたいんですが
複数の変数やら配列を undef する場合
一個づつ
undef $val; undef @array; undef %hash;
と書く以外に方法ってあるでしょうか?
ちょと面倒くさいなと思いまして。
0955あぼーん
NGNG0956nobodyさん
03/07/23 15:18ID:???0958953
03/07/23 15:46ID:???ありがとです。
>>957
print $HTML;
$|=1;
sleep 5;
とやると出力を拝む前にシッカリ sleep していて
何だかフラッシュされていない気がするんですが
どういうコトなんでしょう?
0961967
03/07/23 16:48ID:???$|=1;
print $HTML;
sleep 5;
ってしなきゃ。
0962953
03/07/23 16:59ID:???print の前に書くんですね。
皆さんアリガトでした!
0963nobodyさん
03/07/23 22:08ID:???>>942
ありがとう:こんな方法もあるんですね。勉強になりました。
>>943
ありがとう:バッチリ!です。スッキリ!です。感謝です。
気になるのは wperl.exe でも支障はないのでしょうか?
0964nobodyさん
03/07/24 00:15ID:???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;
}
0967nobodyさん
03/07/24 02:58ID:???表示するようになったけど、全部同じデータでしかも、"3" というデータしかない…。
俺が思っているデータイメージは
$group = (
[ 'name', [ 1, 2, 3 ] ], # name はグループ名で、1,2,3 ... のリストがグループの記事番号とかのデータ
・
・
・
(以下略)
);
と、思ってるんだけど、間違いないカナ?
0968nobodyさん
03/07/24 03:05ID:???0969nobodyさん
03/07/24 03:21ID:???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完全にランダムにするか、2回連続で
同じ数字は出ないようにする方法は?
0971nobodyさん
03/07/24 16:40ID:???0972nobodyさん
03/07/24 16:48ID:???0974nobodyさん
03/07/24 16:56ID:???( ´,_ゝ`)プッ マニュアルシラナイナンテ
http://www.perldoc.com/
Perl Manpage - Reference Manual
0977nobodyさん
03/07/24 17:18ID:???http://www.perldoc.com/perl5.8.0/pod/func/rand.html
どこに時間で決まるなんて書いてあるんだ?
0979nobodyさん
03/07/24 17:28ID:MQ0CG0OjなんでID出てないの
0980nobodyさん
03/07/24 17:43ID:???$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:???srand(time)が自動的に実行されるってことだろ
>>970
完全にランダムも続けて同じ数字が出ないようにするのも
なんらかで出た値を保持する以外にないよ
0983nobodyさん
03/07/24 18:08ID:???0984nobodyさん
03/07/24 18:32ID:???<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:???0992nobodyさん
03/07/24 19:01ID:???同じIP && 異なるマシン(同じ世帯の別マシン) → IPと日付を使った数字をsrandの種にする
異なるIP && 同じマシン(ダイヤルアップ接続) → クッキーを使う
異なるIP && 異なるマシン(誰が見ても変わらない) → 日付をsrandの種にする
0994nobodyさん
03/07/24 19:08ID:???0995nobodyさん
03/07/24 19:12ID:???srandが実行されていない場合、最初に一度だけ初期化される。
実際にはpidやら色々な値を足してる。
あと、/dev/randomが使えるなら、timeよりそっちを優先して使うようになってるぽい。
rand自体はCライブラリのrand()を呼び出したりしてる。
オーバーライドできるので、実装によって違いがあるかも。
http://pc2.2ch.net/test/read.cgi/php/1042260745/9
乱数ならこの辺りを参照。
レス数が950を超えています。1000を超えると書き込みができなくなります。