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
0855848
03/07/21 13:07ID:???実際問題としてperlでOOPな書き方すると、なんとなく直感に反するんですよね・・・
片方でuse strict;して汚染しないようにがんばってるのに、モジュール内では$self->{key}なんかで簡単に読み込めてしまう。
main的にはスパゲティにならないと思うけど、モジュール内ではもうすごい事になりそう。
まだ勉強途中なので、思い切り的外れな考えかとは思いますが・・・
>>853
動くかどうかは分かりませんが、参考までに。
#!/usr/bin/perl
use strict; &main; exit;
sub main{
my $id = 'abc';
my %cook;
if ($ENV{'HTTP_COOKIE'} =~ /$id/i){ %cook = getcookie($id); }
else { print "Location: http://aaa/cookie.html\r\n\r\n"; }
}
sub getcookie{
my %cook;
my $cookie = $ENV{"HTTP_COOKIE"};
$cookie =~ tr/+/ /;
$cookie =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2',$1)/eg;
foreach (split /;/, $cookie){ my ($key,$value) = split /=/; $key =~ tr/ //d; $cook{$key} = $value; }
foreach (split /,/, $cook{$_[0]}){ my ($key,$value) = split /:/; $cook{$key} = $value; }
%cook
}
0857nobodyさん
03/07/21 13:24ID:???OOPって?
オブジェクト指向プログラミングの略?
0858848
03/07/21 13:31ID:???そうですか。
オブジェクト間はいくらでも絡まっていいけど、それが外からカプセル化して見えないようにすればいいと。
ますます難しくなってきました。
>>587
です。
0860nobodyさん
03/07/21 14:02ID:???0862nobodyさん
03/07/21 14:06ID:???my ($member1,$member2,$menber3);
my $this={
func1 => sub{$member1++;print "${member1}func1\n";},
func2 => sub{$member1++;print "${member1}func2\n";},
func3 => sub{$member1++;print "${member1}func3\n";},
};
return $this;
}
my $obj=new();
$obj->{func1}->();
$obj->{func1}->();
$obj->{func2}->();
$obj->{func3}->();
見たいにC++のprivateメンバーみたいなのも作れる。
protectedは作れなさそうだけど。
通常のprelのOOPと組み合わせることも出来るだろうし。
通常の方法以外のOOPを考えてみた
0864nobodyさん
03/07/21 14:40ID:???#!/usr/bin/perl
@a = ( '1aa', '2aa', '3aa', '4aa', '5aa', '6aa',);
$b = 'hello!!';
foo( @a, $b );
exit;
sub foo
{
my ( @one ) = @_;
my ( $two ) = pop( @one );
print "one = @one\n";
print "two = $two\n";
}
foo 内で @one, $two を分ける方法は上記の様なコードで正しいでしょうか?
0865nobodyさん
03/07/21 14:41ID:???OOの考え方ができていればそれなりに利点はある。
責任をはっきりさせるように作れば保守性もあがるしね。
ただ、perlはもともとOOするためのスクリプトじゃないので
OOには不向き。
完璧なOOをしようとしても、いろいろと不都合がでて、結局
ぐちゃぐちゃなソースになってしまう。
ちなみに、モジュール内で
$self->{'key'}でアクセスできるのはOOとして正しい。
Javaでもthis.keyとかってアクセスできるしね。
ただ、問題なのがモジュールの外からでも
$object->{'key'}でアクセスできちゃうこと・・・・・
まぁ、所詮perlなのでその辺はあまり深く考えないほうがいいっす。
0866nobodyさん
03/07/21 14:44ID:???どうなんだろう?うまくいくならいいんじゃない?
もれだったら以下のようにする
foo($b,@a);
sub foo {
my $b = shift;
my @a = @_;
・・・・・
}
もしくは
foo(\@a, $b);
sub foo {
my $aRef = shift;
my $b = shift;
my @a = @$a;
・・・・・
}
引数で渡した値はすべて@_に詰め込まれるので
確か
sub foo{
my @a = @_:
した時点で、$bも@aに入っちゃう気がする・・・・
0867848
03/07/21 14:54ID:???>$object->{'key'}でアクセスできちゃうこと・・・・・
やっぱりこれが納得できなかったんですよ・・・
でもかなりなぞが解けてきました。
後はいかにOOPっぽく書くかだけです!
勉強になりました。
>>864
私も@aと$bは逆にします。
ちなみに確か$bはソートの時に使う変数なのであまり使わないほうがいいかもです。
0868nobodyさん
03/07/21 14:54ID:???foo($b,@a);
sub foo {
my $b = shift;
my @a = @_;
・・・・・
}
0870ともちゃん
03/07/21 15:33ID:O4IhS66K> 動くかどうかは分かりませんが、参考までに。
> #!/usr/bin/perl
> use strict; &main; exit;
〜
色々変更したのですが、残念ながら動かなかったんです。(T_T)
なので、その前にセットできているか確かめてみました。
そしたら、書き込めていないらしいのです。
#!/usr/bin/perl
use strict; &main; exit;
sub main{my $id = "abc";
my $value = "def";
print "Set-Cookie: ".setcookie($id,\$value);
print "Content-Type: text/plain\n\n";
print "Welcome !";}
sub setcookie{
my ($id,$cookie) = @_; my $expires = ""; my $day ="";
$$cookie =~ s/([^\w ])/'%'.unpack('H2',$1)/eg;
$$cookie =~ tr/ /+/;
if ($day > 0){
my ($mday,$month,$year,$youbi) = (localtime(time + (7200)));
$youbi = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat')[$youbi];
$month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$month];
$year += 1900;
$mday = sprintf("%02d",$mday);
$expires = " expires=$youbi, $mday-$month-$year 00:00:00 GMT";}
return "$id=$$cookie;$expires\n";}
これで書き込めるはずだという事です。
こっちは変じゃないですよね?
0871nobodyさん
03/07/21 15:45ID:???君の頭が変
変っていうかおめでたいね。
できるかできないか実際やってみればいいだろ
ヴォケ!
それで、書き込めなかったらどっか悪いんだよHAGE!
そもそも、Cookieについて理解してるのか???ぁあん(゚Д゚#)
my $day = "";してて
if($day > 0)
ってのがわけわからんけど
0874nobodyさん
03/07/21 18:35ID:???0876nobodyさん
03/07/21 19:35ID:???重要なことは、知りたい物をはっきり目に見える形にすること。
やり方はいろいろあるけどね。
>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:???と書く香具師は誰もいないのか鬱。
0879nobodyさん
03/07/21 19:57ID:SiseSbMQ0881nobodyさん
03/07/21 20:09ID:???このスレは「perlコーディング初心者」の質問スレなので、レスキューやKENT等の
ヘボスクリプトをいじれないウルトラボは経験値上げてから来てください。
0882nobodyさん
03/07/21 20:27ID:???0884nobodyさん
03/07/21 21:33ID:7NpeSLR0値を取り出すことは不可能でしょうか?
$nedan = $F_NEDAN{$name};
これでやってみると
$nedanは空でした。
0885nobodyさん
03/07/21 21:46ID:???はいはい、良かったね。氏ねバカ。
print $F_NEDAN{hoge},"\n";
$name = "hoge";
print $name,"\n";
print $F_NEDAN{$name},"\n";
0887nobodyさん
03/07/21 22:28ID:???0891ともちゃん
03/07/22 01:21ID:U6Ps44rqmy $day = "";のif($day > 0)ですがif($day = 0)にしました。
でも、my $dayの記述はやめてしまいました。
日時の取得も{}から外に出して時間も取得する事にしました。(^_^)v
わたし馬鹿ですから・・・
876番さん、ありがとうございます。
時間の取得に関係する事は前にも書いたみたいにして
クッキーが入っているか試してみましたよ。
abc=defってアラートが出てきたので、書き込まれている事になると思います。
だから、それに対してのクッキーの読み込みの部分がうまくいかないみたいです。
私の最初の書き方がダメだったのかしら・・・(;_;)
855番さんにせっかく教えてもらえたのに〜。
分からなくて困ってしまいました。
0892nobodyさん
03/07/22 02:02ID:???0893nobodyさん
03/07/22 02:04ID:???cookieの読み書き使ってるスクリプトなんかいくらでもあるんだから、
それでも参考にしたほうが早い
0894nobodyさん
03/07/22 03:10ID:???タイムアウトさせたいのですが、
どう書いたらいいですか?
0895nobodyさん
03/07/22 04:20ID:???クッキーを見えるようにスクリプトを書きかえて確認しる。
難しい所はないでしょ?
>>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$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;
と書く以外に方法ってあるでしょうか?
ちょと面倒くさいなと思いまして。
レス数が950を超えています。1000を超えると書き込みができなくなります。