|
ちょっと横ヤリです(^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さんの仰るように ( ) が不要になります。 |
|
手元の青ラクダ本では、6.2.1 シグナル(P.389)に書いてありました。 あとmmさん、どうもです。 ああ、もうちょい長く書きたいけれど、風邪がつらいです。 時期が時期だけにインフルエンザかなぁ…。発熱・頭痛・ 体の節々の痛み・せき、などなどフルコースです。 というわけで、今日はこの辺で…。 |
|
あっ、おだいじに>68user さん …のいぬ間に、ちょっと訂正(^^; 副作用という用語は、単純な代入式では使わないようです。 また、「= は b+c の値を返す」と書きましたが、正確には a に代入した値を返すようです。 つまり、a と b+c の型が違う場合は、a の型になるそうです。 |
|
う〜ん.... やばい!あたまが... ばくはつしそうぅ... Perlだけでも、CぢゃなくてBASICから入ったので混乱してるのに、 やれJavaScriptだ、DHTMLだと私の頭はいま、知恵熱で300度位です。(笑) もう少し時間を掛けて、勉強してみます。(>_<) mmさんありがとう。 #名前が似てますねぇ(^_^)V ここの常連さんは、レベルが非常に高いのでお勉強には最適です。 言い訳だけど、青ラクダ本はホント辞書の様なので、初心者には 何かの事をさせたい時に、それがどこに書いてあるのか探すのが 一苦労です。(国外のジョークはそれを理解するのにエネルギーが 必要なので、訳者に削除して欲しいと思うのは私だけ?) やっぱ一度、全部を時間を掛けて読破しないと..... う〜ん時間が無い... 誰か一日を30時間にするライブラリ知りませんか?(爆) ちょっと忙しくなってきたのでしばらく来ないかもしれないけど しばらくしたら、またわからない所教えて下さい。>ALL それでは。 68userさんお大事に! |
|
ちょっと変な質問ですが、解かれば教えて下さい。 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が悪いのか、それともネーム解決 が悪いのか私には解かりません。(^^ゞ もしこの現象が解かれば教えて下さい。 サーバー設定が原因でありませんように...アーメン(^^) |
|
>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^;ゞ |
|
★再再訂正(^^;;; JavaScript の var って、ブロックスコープじゃないんですね。 試してみたら、単に関数内でローカルなだけでした(^^; それと、awk も、仮引数リストの変数が関数内でローカルなだけで、 これも関係ありませんでした(^^;; マジメな話に慣れてないので、訂正が多くってスミマセンですm(_o_)m |
|
どもども。なんとか熱も下がったのですが、もうちょい安静にしときます。 > あとlocalとmyは > (snip!) > ということでどうでしょう? 実は言葉でうまく説明することができなかったので、 サンプルソースでごまかしたというのはナイショです(笑) M.Masudaさんからメールをいただきましたが(500エラーで 書き込みできなかったそうで)やはり >> IE2はバーチャルサーバーのドキュメントを参照できない事になります。 ということのようですね。 メールからの引用ですが、 > 「もうIE2なんて使ってる人いないよ」と言っても、それを実現して > くれなきゃ困るなんて言われるんで、とほほ状態です....。 社会とは理不尽なところですね(^^; ところでM.Masudaさんのwebですが、奥深くまで入っていったわけ ではないですけど、FreeBSD2.2.7+NC4.04で、Javascriptのエラーはでませんでした。 > 私のページも、68userさんの環境からアクセスすると、最悪かも > しれない。(^^ゞ というわけでご安心を。まぁ もしエラーになったとしても、minorityの 宿命ということであきらめてます。 # 別にわざとエラー起こしているわけではないですし。 |
|
500エラーで書けなかった内容です。 ====================================== どうもありがとう。影の68userさん(^^)/ ブロック...そう今日読んでたとこに有りました。 ああいった使い方は、Cとかに多いみたいですね。 なんかPerlて、底無し沼の様に奥が深くって、ちょっとビビッてま す。(笑) 個人的には、プログラミング好きなんでいろいろ試したいし、構文 の柔軟さは、すごくうれしい!\(^O^)/ だけど、ホント誰かrequireできる、一日を30時間いや48時間くら いにするルーチン書いてくれないかな(笑) 【86.9%本気】←どっかで見たなぁ Webで使うCGIでする事なんて割と簡単なので、今のレベルで良いか もしれないけど、この業界で生き残るにはちゃんと勉強せねば! と、最近つくづく感じてます。 #最終的にはDBとの絡みが有るだろうし IEの件はちょっと情報が入ったのですが、やはりだめブラウザのレ ッテルが張られているようですね。 まだ確認は取ってないですが、IE2はどうもバーチャルが見れない バグがあるらしいです。(未確認なので信用しないように!) サーバーを管理している人と連絡をとって、いくつか対応策を思案 中です。 「もうIE2なんて使ってる人いないよ」と言っても、それを実現して くれなきゃ困るなんて言われるんで、とほほ状態です....。 JavaScriptも結構面白いんだけど、環境によってブラウザの対応レ ベルが違うので、バージョンが違うとエラーが出たりはよくありま すね。 そろそろインターネット界も仕様をもっと統一してくれると、私み たいにこの世界で生きている人もやりやすいんだけどなぁ。 ブラウザ毎のルーチンって具合で、各ブラウザに合わせたスクリプ トを作ってると、たまに暴れたくなります。(^^ゞ でもこういう場所があって、私みたいな人間にはとても助かります。 なんか愚痴っぽくなってしまいましたがご勘弁を!(^^)/ ==================================================== なんで500エラーが出たんでしょうか? >というわけでご安心を。まぁ もしエラーになったとしても、minorityの >宿命ということであきらめてます。 私のページは、右側の部分(個人的な内容)でスクリプトを多用しています。 特にMusicとFavoriteのなかの部分で使ってますが、くだらないから見る 価値ないかも?(^^ゞ >原因は、IE2 だけが Host: ヘッダを送ってないということかな…? 通信パケットを見たら、全くそのとおりでした。 IE2のバカ! でもこれで、私の範疇では無い事が解かりましたので一安心です。 でわまた。 |
|
@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とかと異なり、関数や手続きを入れ子にできるんで、 親のローカル変数との衝突を避けるために、もっと積極的に利用してるかも知れません。 |
|
>> 500エラーで 書き込みできなかったそうで > あれま…そんなことが… ログを見ると、ここのwwwboard.cgiは最近2ヵ月で20回くらい 500エラーが起こってます。ここは無改造なのですが、ロック用 ディレクトリが残ってしまうと500エラーになってしまうので、 はやいとこ改造せねばいかんなと思いつつ…めんどくさいし〜。 # ログがどんどん増えていくのもなんとかしないと。 > perl の場合は、foreach $i (LIST) の $i がループ内でローカルになりますね。 それは foreach my $i (LIST) とかの場合では?と思いつつ試してみたところ… foreach $i (LIST) でも $i はローカル変数扱いなんですねぇ。知らなかったっす。 |
|
> 500エラーが起こってます。ここは無改造なのですが、ロック用 > ディレクトリが残ってしまうと500エラーになってしまうので、 他のスクリプトで、ロックファイルのタイムスタンプを調べて、 10分以上前なら削除、てな方法がありましたよ。 ># ログがどんどん増えていくのもなんとかしないと。 レスキューさん所みたくページ表示行数を決めて、[次ページ] なんてしたら? #言うだけは簡単なんだよな〜(^^; >でも $i はローカル変数扱いなんですねぇ。知らなかったっす。 自分もさっき実験してはじめて知りました。(*_*) >JavaScript は、私も、IE/NN間の相違に加えてバージョン間の違いも多いので、 >自分でちょっと使うとき以外は、あまり深入りしないようにしてます。 >でも、M.Masudaさんの場合は、そんな悠長なコトも言ってられないのかな(^^; 本来ちゃんとした手続をすればある程度、エラーを減らしたり出来るらしいですが 、私もそこまで出来てませんし今のところクライアントにはわざといろいろと難し い説明で逃げ回ってます。(^^ゞ #でもDHTMLのスタイルシートやレイヤーの方がもっとたちが悪いですよ(互換性で) 厳密な処理を必要とする部分はCGIを利用して、それ以外の処理をJavaScript等に 行なわせる。といったところでしょうか。 ところでmmさんて何者?(^^ゞ >ワタシの文章も分かりにくいとは思いますが、実は最初に書いた初版は >もっとひどくて、自分で読んでもワケ分からんモノでした(^^; >(一応、アレは改定第2版(^^;) 何か執筆していらっしゃるんですか? |
|
BBSに関しては、本気でちゃんとしたシステム作るつもりは ないんで、まぁ…こんなもんで(笑) # 引用の色変えはmmさんとこのBBSのマネ(^^; あとは何かありますかねぇ…。タグの自動補完とか二度書き禁止とか… うーん、いまいちそそる機能がない。 |
|
もいっちょテスト! |
|
ああやっぱりやだなぁ。 メッセージ数はいつでも変更可能にしたいなぁ。 …よく考えずにいじると後悔するという、いい例でした(^^; |
|
>68user さん >はやいとこ改造せねばいかんなと思いつつ…めんどくさいし〜。 ワタシも、flockに書き換えるつもりで、ロック部分をコメントアウトしたんですが、 未だにそのままになってます…(^o^;ゞ > foreach $i (LIST) >でも $i はローカル変数扱いなんですねぇ。知らなかったっす。 こちらは、C++の場合もループ内ローカルだと思い込んでて、 perlの場合と並べて書いてたんですが、調べてみると違ってたので、 ちょっとヘンな文章になってしまいました(^^; >M.Masuda さん >他のスクリプトで、ロックファイルのタイムスタンプを調べて、 >10分以上前なら削除、てな方法がありましたよ。 とほほさんのコードも ($mtime) = (stat("lock/wwwboard.loc"))[9]; if ($mtime < time() - 600) { rmdir("lock/wwwboard.loc"); } となっていて、10分以上前なら削除されるハズなんだけど、 利いてないのかな? >本来ちゃんとした手続をすればある程度、エラーを減らしたり出来るらしいですが >、私もそこまで出来てませんし今のところクライアントにはわざといろいろと難し >い説明で逃げ回ってます。(^^ゞ ウチの場合は、手元にNN4とIE3しかないってのが一番問題になるようです。 でも、NN2,3やIE2,4があっても、やっぱり面倒そうではありますね(^^; >#でもDHTMLのスタイルシートやレイヤーの方がもっとたちが悪いですよ(互換性で) そのヘンは、もはや別物って気がします(^o^;ゞ もっとも、ウチでも簡単なスタイルシートは使ってますが… >何か執筆していらっしゃるんですか? ん? 「第何版」ってのは、単なる冗談です(^o^;ゞ ワタシは、単なるパソコン好きの素人にすぎません(^^; >68user さん ># 引用の色変えはmmさんとこのBBSのマネ(^^; ウチのも、他所のマネです(^^;;; でも、おかげで、空行を入れずに済みます。 >あとは何かありますかねぇ…。タグの自動補完とか二度書き禁止とか… >うーん、いまいちそそる機能がない。 タグの補完は、前にちょっと考えたことがありますが、面倒ですよね。 <TABLE>タグの<TR>とかが入れ子にならないし、引用符の中で ">" を使われると、 正規表現でのタグの切り出しができないし… |
|
> <TABLE>タグの<TR>とかが入れ子にならないし おろ、TABLEまで何とかしようという魂胆で? 志が高いですね(笑) 僕が昔に書いたのは http://X68000.startshop.co.jp/~68user/tmp/tag.txt です。今考えると、element(って言うのかな?)とか全く考えて ないんで、ヘボヘボですね。 うーん、でも真面目に実装したら、 TABLE-TAG := <TABLE> TR-TAG </TABLE> TR-TAG := <TR> [TD-TAG] [</TR>] TD-TAG := <TD> <chars> [</TD>] なんてBNF式に定義して、それに基づいてparseさせなきゃダメなのかしら。 # 昔 yaccとlexで組もうとした事があるけど、エラーから回復させる事が # できずに(=文法エラーにぶつかると止まってしまう)挫折しました(^^; |