68user's page 掲示板

Prev< No. 102〜112> Next  [最新発言に戻る] [過去ログ一覧]
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^;ゞ

No. 109 # mm 1999/01/30 (土) 23:56
★再再訂正(^^;;;
JavaScript の var って、ブロックスコープじゃないんですね。
試してみたら、単に関数内でローカルなだけでした(^^;
それと、awk も、仮引数リストの変数が関数内でローカルなだけで、
これも関係ありませんでした(^^;;

マジメな話に慣れてないので、訂正が多くってスミマセンですm(_o_)m

No. 110 # 68user 1999/02/01 (月) 00:47
どもども。なんとか熱も下がったのですが、もうちょい安静にしときます。

> あとlocalとmyは
> (snip!)
> ということでどうでしょう?

実は言葉でうまく説明することができなかったので、
サンプルソースでごまかしたというのはナイショです(笑)

M.Masudaさんからメールをいただきましたが(500エラーで
書き込みできなかったそうで)やはり

>> IE2はバーチャルサーバーのドキュメントを参照できない事になります。

ということのようですね。

メールからの引用ですが、
> 「もうIE2なんて使ってる人いないよ」と言っても、それを実現して
> くれなきゃ困るなんて言われるんで、とほほ状態です....。

社会とは理不尽なところですね(^^;

ところでM.Masudaさんのwebですが、奥深くまで入っていったわけ
ではないですけど、FreeBSD2.2.7+NC4.04で、Javascriptのエラーはでませんでした。

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

というわけでご安心を。まぁ もしエラーになったとしても、minorityの
宿命ということであきらめてます。
# 別にわざとエラー起こしているわけではないですし。

No. 111 # M.Masuda [E-mail] 1999/02/01 (月) 15:36
500エラーで書けなかった内容です。
======================================
どうもありがとう。影の68userさん(^^)/

ブロック...そう今日読んでたとこに有りました。
ああいった使い方は、Cとかに多いみたいですね。
なんかPerlて、底無し沼の様に奥が深くって、ちょっとビビッてま
す。(笑)
個人的には、プログラミング好きなんでいろいろ試したいし、構文
の柔軟さは、すごくうれしい!\(^O^)/

だけど、ホント誰かrequireできる、一日を30時間いや48時間くら
いにするルーチン書いてくれないかな(笑)
【86.9%本気】←どっかで見たなぁ


Webで使うCGIでする事なんて割と簡単なので、今のレベルで良いか
もしれないけど、この業界で生き残るにはちゃんと勉強せねば!
と、最近つくづく感じてます。
#最終的にはDBとの絡みが有るだろうし


IEの件はちょっと情報が入ったのですが、やはりだめブラウザのレ
ッテルが張られているようですね。
まだ確認は取ってないですが、IE2はどうもバーチャルが見れない
バグがあるらしいです。(未確認なので信用しないように!)

サーバーを管理している人と連絡をとって、いくつか対応策を思案
中です。
「もうIE2なんて使ってる人いないよ」と言っても、それを実現して
くれなきゃ困るなんて言われるんで、とほほ状態です....。


JavaScriptも結構面白いんだけど、環境によってブラウザの対応レ
ベルが違うので、バージョンが違うとエラーが出たりはよくありま
すね。
そろそろインターネット界も仕様をもっと統一してくれると、私み
たいにこの世界で生きている人もやりやすいんだけどなぁ。
ブラウザ毎のルーチンって具合で、各ブラウザに合わせたスクリプ
トを作ってると、たまに暴れたくなります。(^^ゞ

でもこういう場所があって、私みたいな人間にはとても助かります。

なんか愚痴っぽくなってしまいましたがご勘弁を!(^^)/
====================================================
なんで500エラーが出たんでしょうか?

>というわけでご安心を。まぁ もしエラーになったとしても、minorityの
>宿命ということであきらめてます。

私のページは、右側の部分(個人的な内容)でスクリプトを多用しています。
特にMusicとFavoriteのなかの部分で使ってますが、くだらないから見る
価値ないかも?(^^ゞ

>原因は、IE2 だけが Host: ヘッダを送ってないということかな…?
通信パケットを見たら、全くそのとおりでした。
IE2のバカ!

でもこれで、私の範疇では無い事が解かりましたので一安心です。
でわまた。

No. 112 # mm 1999/02/02 (火) 00:57
@68userさん
>500エラーで 書き込みできなかったそうで

あれま…そんなことが…

>サンプルソースでごまかしたというのはナイショです(笑)

ワタシの文章も分かりにくいとは思いますが、実は最初に書いた初版は
もっとひどくて、自分で読んでもワケ分からんモノでした(^^;
(一応、アレは改定第2版(^^;)

JavaScript は、私も、IE/NN間の相違に加えてバージョン間の違いも多いので、
自分でちょっと使うとき以外は、あまり深入りしないようにしてます。
でも、M.Masudaさんの場合は、そんな悠長なコトも言ってられないのかな(^^;


@M.Masudaさん
>>原因は、IE2 だけが Host: ヘッダを送ってないということかな…?
>通信パケットを見たら、全くそのとおりでした。

やはりそうでしたか…
いや、もしそうだとすると、IE2ではバーチャルホストにアクセスできない
ことになるので、まさかそんなことが?…って思ってたんです(^^;

>ブロック...そう今日読んでたとこに有りました。
>ああいった使い方は、Cとかに多いみたいですね。

うーん、あまり積極的に使うことはないような気はしますが…?
せいぜいループカウンタくらいかなぁ…、
カウンタは慣習的に i を使うので、不要な衝突を避けるために便利かな…とは思います。
perl の場合は、foreach $i (LIST) の $i がループ内でローカルになりますね。
C++ の for( int i = 0; ... でも、ループの直ぐ外のブロック内にローカルなので、
こういう場合には有用かもしれません。
ただ、Pascalは、Cとかと異なり、関数や手続きを入れ子にできるんで、
親のローカル変数との衝突を避けるために、もっと積極的に利用してるかも知れません。

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