68user's page 掲示板

Prev< No. 100〜108> Next  [最新発言に戻る] [過去ログ一覧]
No. 100 # M.Masuda [E-mail] 1999/01/29 (金) 15:52
>たぶんセオリーはあるんでしょうけど、僕が知らないだけです(^^;
いやいや、これだけ知ってれば十分じゃ....この概念は私的でした
ね(^^ゞ

私のプログラミングは、BASICから入ってるのでいまだに構文の書
き方は、BASIC風です。(^^;
しかも、Perlもフリーで配布しているCGIを解析して構文の記述を
勉強したりしてるので、Perl4やそれ以前の頃からプログラミング
している人から比べたら、恥ずかしくって自分のプログラムなんて
公開できない。(T_T)

まだまだ奥が深いPerlは、これだけを勉強して立派なPerl使いにな
りたいんだけど、仕事柄これだけをやってるわけにいかないのが辛
いところです。(^^;

今同時進行で勉強してるのが、Perl,JavaScript,DHTNL,ネットワーク
関連、最近勉強を始めたDHTMLは、IEとネスケの互換性の無さにあき
れています、ページを2重化したくないので同じページ内でIE・ネス
ケそれぞれ3と4のバージョンで無難に表示させるのにてこずってま
す。(^^;

ところで以下の構文がまだよく分からないので、教えて下さい(T_T)
【1】
$SIG{HUP}=$SIG{INT}=$SIG{QUIT}=\&finish;
↑何をしているのか解からない(恥)
シグナルハンドラをいじっているのは解かるんだけど、
hoge=foo=fuge=booの '=' の使い方の意味と、\&finishの'\'がリファ
レンスを指す事は解かるんだけど、なぜ'\'そうするのかが解からない
【2】
my $lock_flg = 0; ←localとmyの使い分けがまだ理解できない

アー恥ずかしかった。(^^ゞ


この使い方は勉強になりました。
>$lock_flg = symlink("$$",$lockfile);
>if ( $lock_flg ){ last LOOP; }
こんなに簡単に書けるんですね!φ(._.)

># CGIの場合、排他処理の失敗自体がたまにしか起きないので、
># 動作チェックしにくいですよね。
早いマシンより、遅いマシンに負荷が集中する時にエラーが出やす
いんでしょうね。

ちなみに私の試験方法は、同じページ上に同じカウンタのURLを沢山
書いて、ブラウザのキャッシュを無効にしてリロードです。
#本当にこれでいいのか解からないけど、他に手段を知らない(^^ゞ

ではまた。

No. 101 # 68user 1999/01/29 (金) 17:23
>> $SIG{HUP}=$SIG{INT}=$SIG{QUIT}=\&finish;
    $a=$b=$c=100;
    print "$a,$b,$c\n";
の結果は100,100,100となります。つまり$a=100;$b=100;$c=100;と
等価なわけですね。そもそもperlの(Cもそうですが)代入文自体は
値を持っています。
    print $a=100;
の結果は100です。また=(イコール)演算子は右から順に
評価されますので、
    $a=$b=$c=100;

    $a=($b=($c=100));
と等価です。というわけで、
    $a=($b=($c=100));
        ↓$cに100を代入
    $a=($b=100);
        ↓$bに100を代入
    $a=100;
という流れになっているはずです(たぶん)。

シグナルハンドラですが、perl4なら $SIG{HUP}="finish"
ですけど、この書き方では 関数finishが別ファイルにあった
場合(それをrequireやuseで使っている場合)は呼べません。
というわけで、\&finishと書くわけです…と青ラクダ本に
書いてありました(^^;

あとlocalとmyは
    local $local=1;
    my $my=2;
    &f;
    sub f {
        local $local=3;
        my $my=4;
        print "f: \$local=$local\n";
        print "f: \$my=$my\n";
        &g;
    }
    sub g {
        print "g: \$local=$local\n";
        print "g: \$my=$my\n";
    }
実行結果:
    f: $local=3
    f: $my=4
    g: $local=3
    g: $my=2
ということでどうでしょう?

> IEとネスケの互換性の無さにあきれています

DHTMLはわかりませんが、Javascriptを使っていて、
Winでは動くのだろうけど FreeBSD+NetscapeNavigatorでは
エラーが出まくるようなページが たくさんあるので、
こんな変なものには絶対手を付けまいと誓いました(笑)

というわけで僕はJavascript、DHTMLに関しては全くの素人です(^^;

No. 102 # M.Masuda [URL] 1999/01/29 (金) 21:21
詳しい解説ありがとうございます。

いまいちおバカな頭で理解できないけど、
local と my の違いは、

サブルーチンからさらにサブルーチンに呼ばれた時に。
local = 前のルーチンの値を保持する。
my = 最初のサブルーチンを呼ばれた時(定義した時)の値を示す。
と、解釈していいのかなぁ?

もしそうなら、具体的に使う時は再帰呼び出しの様な使い方を
した時に違いが出る。ということでしょうか?
それならmainルーチンから普通にサブルーチンを呼び出した時
(初期化ルーチンの様な)さらにルーチンを呼び出さなければ、
同じ結果ですね。

#localやmyで指定されたサブルーチン内の変数に当てられた分の
#メモリは、そのルーチンが終了すれば開放されるのだろうか?

>$a=$b=$c=100; は理解できました。
やっぱBASICが最初だと、Perlの構文は簡単に記述できるけど、
理解に時間がかかる!、単におバカなだけだったりして((((^^;

>というわけで、\&finishと書くわけです…と青ラクダ本に
何ページに載ってます?
よく言う青ラクダ本は持ってますが、あんまり読んでると眠く
なるので、必要な部分だけ拾い読みしてます。(^^;
#にしてもラクダ本って、何が何処に書いてあるのか解かりづら
#い...、しかもたまに書いてある英語のジョークが、真剣に読む
#と腰を砕くし....(; ;)

私は、恥ずかしいけど請け負いでホームページ製作をしてるんで
すが、製作作業と勉強に掛る時間が同じ位です。(>_<)

>こんな変なものには絶対手を付けまいと誓いました(笑)
すいませんこんな変なもの作ってます(爆)

Javascriptは、クライアント側のプログラムなんで、アクセス環
境で動いたり動かなかったりなので、大手サイトやアメリカのH
サイトで使用している物を、見ながら使ってます。
これは無断コピーの意味ではなく、「沢山のアクセスのあるサイ
トで使われているコードはエラーが少ないだろう」を前提にして
ます。もちろんそのまま使うのではなくコマンドの使われかたを
流用するだけだけど。

一応ネスケとIEは、3と4のバージョンで動作確認しながら作
ってますが、他のOSは環境が無いのでどうにもならないし..。

私のページも、68userさんの環境からアクセスすると、最悪かも
しれない。(^^ゞ

暇なら来た時BBSに書込みでもしていって下さい。

No. 103 # mm 1999/01/30 (土) 02:43
ちょっと横ヤリです(^o^;ゞ
local も my も、その宣言位置から、これを囲む最も内側のブロックの最後までが有
効範囲であるという点は同じです。ただし、この「ブロックの最後まで」というのが、
localの場合が時系列的に判断されるのに対して、my はスクリプトの見た目上のブロッ
クの階層構造で判断されます。
つまり、my は、C言語などと同じで、ブロックの異なる階層に同じ名前の変数が my
で宣言されている場合、その変数が現れた位置の最も内側のブロックで宣言されたも
のが参照されます(ブロックスコープ)。
これに対して、local は、LISPなどと同じで(これはちょっと?)、系列や階層が異
なるブロックに同じ名前の変数が local で宣言されている場合、プログラムの実行に
伴って、この実行のステップがどのブロック内にあるか(また、どのブロック内から
呼び出されたか)ということによって有効範囲が判断され、既に有効範囲を外れたも
のを除いて、現在有効である最も最近宣言されたものが参照されます(動的スコープ)。

なお、自分自身を呼ぶだけの単純な再帰呼び出しでは、myもlocalも変わりないと思い
ます(たぶん)。
ただ、perl4の解説では、localをループ内で使うと、ループのたびにスタックが消費
されると書いてあったのですが、perl5ではこの説明がなくなってました。なんでかな
ぁ…?

a=b+c などは、一般のプログラム言語では文(代入文)となりますが、Cやperlなどで
は単なる式となります( = は b+c の値を返すだけの演算子で、副作用としてこの値
を a に代入します)。で、どちらの場合も = の右側には式が書けるので、Cやperlな
どの場合にのみ x=(a=b+c) というような記述が可能になります。また、= は右結合の
演算子なので、68userさんの仰るように ( ) が不要になります。

No. 104 # 68user 1999/01/30 (土) 06:07
手元の青ラクダ本では、6.2.1 シグナル(P.389)に書いてありました。

あとmmさん、どうもです。

ああ、もうちょい長く書きたいけれど、風邪がつらいです。
時期が時期だけにインフルエンザかなぁ…。発熱・頭痛・
体の節々の痛み・せき、などなどフルコースです。

というわけで、今日はこの辺で…。

No. 105 # mm 1999/01/30 (土) 06:32
あっ、おだいじに>68user さん

…のいぬ間に、ちょっと訂正(^^;
副作用という用語は、単純な代入式では使わないようです。
また、「= は b+c の値を返す」と書きましたが、正確には a に代入した値を返すようです。
つまり、a と b+c の型が違う場合は、a の型になるそうです。

No. 106 # M.Masuda [E-mail] 1999/01/30 (土) 14:49
う〜ん....
やばい!あたまが...
ばくはつしそうぅ...

Perlだけでも、CぢゃなくてBASICから入ったので混乱してるのに、
やれJavaScriptだ、DHTMLだと私の頭はいま、知恵熱で300度位です。(笑)
もう少し時間を掛けて、勉強してみます。(>_<)

mmさんありがとう。
#名前が似てますねぇ(^_^)V
ここの常連さんは、レベルが非常に高いのでお勉強には最適です。
言い訳だけど、青ラクダ本はホント辞書の様なので、初心者には
何かの事をさせたい時に、それがどこに書いてあるのか探すのが
一苦労です。(国外のジョークはそれを理解するのにエネルギーが
必要なので、訳者に削除して欲しいと思うのは私だけ?)

やっぱ一度、全部を時間を掛けて読破しないと.....
う〜ん時間が無い...
誰か一日を30時間にするライブラリ知りませんか?(爆)

ちょっと忙しくなってきたのでしばらく来ないかもしれないけど
しばらくしたら、またわからない所教えて下さい。>ALL
それでは。

68userさんお大事に!

No. 107 # M.Masuda [E-mail] 1999/01/30 (土) 21:38
ちょっと変な質問ですが、解かれば教えて下さい。

IE2(win)とApache/1.2.6なんですが。
サーバーネームは、www.web.domain.co.jp バーチャルでは、
www.damain.co.jpです。
サーバーの設定は、バーチャルをメインのwebとして使用していま
す。つまり一つのIPで2つのwebを運営してます。

なにが起こるかというと、IE3,IE4,ネスケ3,ネスケ4で、
www.domain.co.jpにアクセスすると、コンテンツ内容は正常に
www.domain.co.jpで設定した内容を返すのですが、IE2のアクセス
の時だけ www.web.domain.co.jpに指定した内容を返します。

関係無いかもしれないですけど、hostコマンドで、2つのネームを
叩くと同じIPを返します。
今度は、そのIPを調べるとwww.web.domain.co.jpを返します。

ネーム解決は、ドメイン名→ネームサーバーにIPを問い合わす→
TCPの通信はそのIPで行なう。(解釈が違ってたらごめんなさい)
この際に、もしかしてIE2は単純にIPの指すサーバーにリクエスト
を発行してドキュメントを取得する。
推測ですがこういう手順なら納得いきます。

現にIPをhostコマンドで調べると、www.web.domain.co.jp を返し
ます。
でもそんなことあるのでしょうか、もしそうならIE2はバーチャル
サーバーのドキュメントを参照できない事になります。
サーバーの設定がが悪いのか、IEが悪いのか、それともネーム解決
が悪いのか私には解かりません。(^^ゞ

もしこの現象が解かれば教えて下さい。
サーバー設定が原因でありませんように...アーメン(^^)

No. 108 # mm 1999/01/30 (土) 23:16
>IE2のアクセスの時だけ www.web.domain.co.jpに指定した内容を返します。

私は、Apacheはよく知らないので、68userさんの方が専門だと思いますが…(^^;
寝込んでらっしゃるかも知れないので…、とりあえず、
↓の「さらなる改善点・バーチャルホストに対応」が参考になるんじゃないでしょうか。
http://X68000.startshop.co.jp/~68user/net/http-5.html

原因は、IE2 だけが Host: ヘッダを送ってないということかな…?
Apacheにとっては、ブラウザがwww.web.domain.co.jp と www.damain.co.jp の
どちらで接続して来たかの区別はないハズです。ただ、ブラウザから送られて来る
HTTPヘッダが
Host: www.web.domain.co.jp
Host: www.damain.co.jp
のどちらになっているかで、送り返すページを区別しているのだと思います。
IE2が使えるのなら、一度送信ヘッダを調べてみてはいかがでしょう。
↓で環境変数を調べて、HTTP_HOST がちゃんと設定されているかどうかを見てみて下さい。
http://X68000.startshop.co.jp/~68user/Cgi-room/printenv.cgi


それから、my と local の件ですが、perl5 しか使わないというのであれば、
local は忘れてもいいんじゃないでしょうか( local は古いバージョンとの
互換性のために残ってるだけだと思います)。

↓でブロックスコープの基本が理解できるんじゃないかなぁ…?
Algol系の言語(Pascal,C,awk,perl,Java,JavaScript..)の有効範囲の基礎に
なると思います(たぶん(^^;)。

$a = 0;
{ my $a = 1;
        { my $a =2;
                { my $a = 3; print "$a\n"; }
                print "$a\n";
        }
        print "$a\n";
        { my $a = 666; print "$a\n"; }
        print "$a\n";
}
print "$a\n";

↓実行結果です(なお、この場合は、myをlocalに替えても同じです)。
3
2
1
666
1
0

>やっぱ一度、全部を時間を掛けて読破しないと.....

えっ? 私は、全然読破してませんです(^^;
参照用と、項目別にその部分だけを読んでます。


>#名前が似てますねぇ(^_^)V

すいません、面倒なんでイニシャルの mm にしてしまってます(^^;


★再度訂正(^^;
LISPが動的スコープと書きましたが、Common Lisp は動的はありませんでした。
でも、確か動的スコープの Lisp もあるハズです(^o^;ゞ

Prev< No. 100〜108> Next  [最新発言に戻る] [過去ログ一覧]