68user's page 掲示板

Prev< No. 101〜104> Next  [最新発言に戻る] [過去ログ一覧]
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さん、どうもです。

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

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

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