コンテキストの意味がさっぱりです。

[上に] [前に] [次に]
金銀パールくん。 1999/11/28(日) 17:35:13
コンテキストっていったいどういう意味ですか?

5冊程perlの本を読んでいるのですが、
(持っているのは9冊)
微妙にニュアンスが違うような気がして正確に理解出来ません。
ラクダの本に限っては難しすぎて腹が立ちます。

perl本を ぽっこぽこ出版する作者にも腹が立ちます。
自分が理解しているだけで、人に上手に説明が出来ないような
オナニー本を自己満足と金儲けの為に出さないで頂きたい。

私が認めた教本とは以下の1冊だけ。
後の本は絶対に、馬鹿本。

CGIプログラミング入門 秋本祥一・古川剛

話は戻りますが、すいませんが「コンテキスト」って
何でしょう?

金銀ぱーるくん 1999/11/28(日) 17:39:10
追伸です。

perlをマスターするには配列が一番のポイントであり
難関でもあると睨んでいるのですが、どうでしょう?
ちなみに僕の予想は結構当たります。

B-Cus 1999/11/28(日) 18:15:15
サンプル
 @buf=localtime;
 $buf=localtime;
 print "\@buf=@buf\n";
 print "\$buf=$buf\n";

実行結果
 @buf=32 4 18 28 10 99 0 331 0
 $buf=Sun Nov 28 18:04:32 1999

「@buf=」というのは、リスト(配列)を要求している。
「$buf=」というのは、スカラー(文字列や数値)を要求している。
# プログラマが「リスト(スカラー)を要求している」
# 「リスト(スカラー)が返されるものと思っている」ということ。
## 本当に「プログラマが要求しているか」どうかは別。
## スカラーが欲しいのに @buf= と書いたら、それはバグ。

同じ関数を使っても、リスト(配列)を要求するような書き方か、
スカラー(文字列や数値)を要求するような書き方かで、返ってくる値が違う。

ということを、
 「localtime はリストコンテキストでは〜を返し、
  スカラーコンテキストでは〜を返す」
と表現してるってこと。

B-Cus 1999/11/28(日) 18:27:53
追加。

サンプル2
 @array=(1,2,3,4,5);
 $a=@array;
 @b=@array;
 ($c)=@array;
 print "\$a=$a\n";
 print "\@b=@b\n";
 print "\$c=$c\n";
実行結果2
 $a=5
 @b=1 2 3 4 5
 $c=1

この場合は、
 配列 @foo という書き方は、
  スカラーコンテキスト(スカラーが欲しいような書き方)では、配列の要素数を返す
  リストーコンテキスト(リストが欲しいような書き方)では、配列の要素を返す(コピーする)
となるわけね。

英単語的には「コンテキスト」というのは、文脈・背景・前後関係
などという意味。結局は「perl は前後の文脈次第で動作が変わる」という
ことを言っているわけです。

# Cなんかだと前後をどう書いても動作は変わりません。
# C++だと、戻り値の型を変えた関数をオーバーロードできるから、
# 「コンテキスト次第で動作が変わる」と言えるかなぁ?

金銀ぱーるくん 1999/11/28(日) 18:30:10
ほんと、B-cusさんって頭いいっすね。。
近くに住んでたら塾として教わりたいっすよ。。(涙)
駄目っすか?

回答どうもです。
ちなみに一見しただけでは理解出来ないので
只今より、プリントアウトして1時間程、鬼のような復唱と
ノート書きとり作業で、私の空き容量不足の頭に叩きこんで
参ります。

でも、あれっすね。 同じ難しい文面でも本で読むのと
ここの見知ってるHNの人に書いて貰うのとでは
取っつきやすさっていうか、取り組む意欲が違ってきますね。

コンテキストが解らない位でperl戦線より撤退する訳には
まいりません。

理解不足の頭を根性で補えるかどうかの
自分との戦いなのであります。 隊長殿。

あ、サザエさんを見てからでもいいっすか?
これは日曜の日課ですので。

金銀ぱーるくん 1999/11/28(日) 18:40:31
あの、すいません。 B-cusさん。

いつも、あちらこちらでの切れ味の良い回答を
見させて頂いています。

いつか、訊こうと思ってたのですがラウンジの趣旨とは
外れてしまうので控えて居たのですが今日はもう訊きます。
勉強法っていうか暗記法は、どのようなやり方してるんですか?

私の機能の悪い脳CPUの為にも教えて下さい。

B-Cus 1999/11/28(日) 19:58:32
例3。
 open(IN,"filename");
 $line = <IN>; … 最初の一行を $line に代入
 @buf = <IN>; … 残り全ての行を @buf に代入


この件(コンテキスト)に関しては、いろんな例を見て慣れるのが
一番ではないかと。

ちなみに青ラクダ本の 「2.2.3 コンテキスト」には他にも
不定コンテキストとか、ブール値コンテキストと書いてありますけど、
これらは覚えなくてもいいと(個人的には)思います。


> 勉強法っていうか暗記法は、どのようなやり方してるんですか?
C や Java などの他の言語知らないでしょ? 僕は既に C を知って
いたから perl を理解できただけ。
# でも、最初の数か月は、よくバグで苦しんでましたけど。

で、そういう人 (既にプログラムが書ける人) はラクダ本のような
リファレンス的な本がよいわけ。既に変数とか配列とかファイル
入出力の概念は知ってるからね。

そうじゃなくてプログラミング言語に触れるのが全く初めてな人は、
How to 本のような一歩ずつ進んでいく本を買えばいいでしょう。
そのうちいろんな概念を覚えて、あとはリファレンス的な本
(例えばラクダ本) があれば何とかなるという状態になるだろうから。

> 暗記法
例えばコンテキストにより動作を変える関数は いくつかありますが、
全てを覚えているわけではありません。疑問に思ったら、すぐラクダ本を
見ます。だから全ての関数や機能などは暗記してませんし、暗記しようとも思いません。
# だから出先でラクダ本がないととても困るんだけど。

J.Naka 1999/11/28(日) 21:05:14
用語が良くわからない J.Naka野郎も参入! (^^;;

コンテキスト。。。。そういうば、明確に解からずに来ているぞっと(^^;
今、思った所は、関数の「引数&返り値」の事かな?
つまり、プログラム内で移動する一塊のデータとなるのなか?

----------------------
よもや話し:
 昔(DOS時代)の言語には、真の初心者にも解かるような解説書が言語パッケージについてきたけど、今の言語は何がしかの言語経験を前提にした解説書って感じですよね。これはC++あたりからなのかな?(と、某フォーラムでいっていたような気が)。
 Perlなんかは元々がC言語プログラマ(プロのという意味)のテキスト処理用にCプログラマ自身が自分の為に作ったというのがあるから、言語使用の前提にはC言語の基礎が必須というのが暗黙にあります。だから、自分もつい最近まではPerlには触手が動かなかった。。。
 そういう意味で、現在は真の初心者にはムチャクチャ敷居が高いですよね。可哀相ですよ。。伝々

きたむら 1999/11/28(日) 23:00:19
たしかにそうですね。>J.Nakaさん
真の初心者のための言語があるといいのに。

PerlもPerl4のころはお気軽な感じがあったんですが、
Perl5になって、文法書やリファレンスのボリュームが、
かなり初心者をビビらせるものになってしまいましたね。

私自身は、文法のボリューム的に、Cから始めるというのは
なかなかいいと思うんですが、これからPerlを使いたいって人の
ために、まずCを覚えろというのは、なんとなく酷な気がするです。

金銀ぱーるくん 1999/11/29(月) 00:28:50
B-cusさん、ご指導有り難うございましたっ。

本日の私のperl戦線、異常有り! あちゃ。

サザエさんから始まった日曜の恒例・・ TVのループが・・
男子バレー 特命リサーチ 知ってるつもり 雷波少年へ・・
と続いてしまい、perl戦線から撤退してしまいました(本日)

でも、明日はperl戦線の前線へと復帰し
このカチコチの脳みそでもやれば出来るっていう事を
竹内(学校のライバル)にも解らしてやる次第でございます。

それにしてもperl本は駄目っすね。 

絶対に、3年掛かってもラクダ本を暗記してやる。 ふんがー
コンテキスト位なんじゃー コンテキスとー(こんちくしょー)
あ、ちょっと苦しかった。

hiro-kim 1999/11/29(月) 13:12:07
●1 コンテキスト Context
周囲の状況,環境。Perlでは,ある式(サブルーチン,関数,演算子,変数,リテラル)がどんなデータを返すことを,それを取り囲む式が期待しているかということ。最も基本となるコンテキストは,配列コンテキストとスカラーコンテキストの2つである。(以下,省略)
    L.Wall & R.L.Schwartz『Perlプログラミング』(ソフトバンク)「用語集」p571

●2 contextの日本語訳として「文脈」があり,「文脈によって意味が変わる」という日本語の言い回しを私は知っていた。

●3 データ型のないプログラム言語があること。プログラム中の式に応じて,数値型として解釈されたり文字型として解釈されたりするプログラム言語があることを私は知っていた。

以上の3点から,コンテキストというのがどんなものか,私にはイメージがつかめました。(もちろん,私が分かることと,他の人が分かるかどうかは,まったく別だというのは十分承知していますが)

追伸.
Contextの説明文が,この本の「用語集」の他の項目のように,脱線した説明になっていなかったのは幸運といえるでしょう(微笑)

P初心者 1999/11/29(月) 14:41:55
B-Cusさんへ
$cの($c)と結果が$c=1って理解できません!おしえてください!
ちなみに、$a関係は理解できました!

サンプル2
 @array=(1,2,3,4,5);
 $a=@array;
 @b=@array;
 ($c)=@array;
 print "\$a=$a\n";
 print "\@b=@b\n";
 print "\$c=$c\n";
実行結果2
 $a=5
 @b=1 2 3 4 5
 $c=1

クロノのED「反省会」の見方教えて! 1999/11/29(月) 15:44:21
少し脱線
C++で
ハンドルデバイスコンテキストってなんですか?

参考書で
  ハンドルデバイスコンテキストを取得
  画像表示
  ハンドルデバイスコンテキストをリリース
ってやれって言ってるからやってるけど
何をしてるのかいまだに理解してません。

んん〜  場違いな質問かな?

>自己満足
初めてプログラムの本見たときビビった。
本の端っこに説明のってる本はありがたいよね。

. 1999/11/29(月) 16:32:00
すいません前の方のハンドルが長すぎて見づらかったもので…

B-Cus 1999/11/29(月) 22:44:57
> $cの($c)と結果が$c=1って理解できません
($c) とするとリストコンテキストになるので、
@array の最初の要素が $c に代入されます。
 ($c,$d,$e) = @array;
だと $c==1,$d==2,$e==3 になるわけで。

P初心者 1999/11/30(火) 09:24:27
B-Cusさん いつもありがとう!
理解できました!

銅鉄あめじすと さん 1999/12/01(水) 10:19:30
解決押せ!!

たかまろ 1999/12/02(木) 23:10:58
誰も解決チェックをなさっていないので
ちょっとばかし、つなげさせていただきます。

B-Cusさんの最初のサンプルで
関数localtimeを配列で求める際サンプル
 @buf=localtime;
 
実行結果
 @buf=32 4 18 28 10 99 0 331 0
となっているのですが、私の持っている
「CGI&Perl ポケットリファレンス」では
localtimeでのリストは秒、分、時、日、月、年、曜日、夏時間調整の有無 の8要素になってます。
最後の0は夏時間調整の無を表していると思いますが手前の
331とは何を表しているものなんでしょうか?
 

B-Cus 1999/12/03(金) 00:43:47
day or year。1月1日は0で、12月31日は364(うるう年は365)。
> 「CGI&Perl ポケットリファレンス」では
perl4 時代から yday は存在したはずです。誤植か、
著者の調査不足でしょう。

たかまろ 1999/12/03(金) 23:10:54
B-Cusさん どうもありがとう
解決チェック? 金銀パールさんにおまかせ

金銀ぱーるくん 1999/12/04(土) 08:50:28
[[解決]]
解決チェックが遅くなりすいません。
僕の中では未だに プチ? がついてますが
大分ご意見頂いたおかげで、もう一歩の所まで詰め寄りました。

もう勉強か or 思わず遊んでしまうかの?
週末がやってまいりました。
今週末は気合い一発ぜひ、コンテキストを習得したいと思います。

[上に] [前に] [次に]