Google グループは Usenet の新規の投稿と購読のサポートを終了しました。過去のコンテンツは引き続き閲覧できます。
表示しない

[Q] perlのreferenceを 人に教えるのに良い方法は?

閲覧: 19 回
最初の未読メッセージにスキップ

Takahide Nojima

未読、
2004/01/14 23:44:452004/01/14
To:
nojimaです。

[Q]

1. 過去に一度もプログラミングをやったことが無く、かつ、
2. 英語も苦手である

人が、現在やっとreference以外のperlの文法を理解したと想定します。

この人にperlのreferenceを理解させて、かつ、リンクリスト
位まで理解させる為には、どのような参考書/方法がありますでしょうか?


よくよく考えると自分はCやらLispやらを普通にやってたし、英文も
別になんとも思わんので

man perlref,
man perlreftut,
man perldsc,
man perllol

を読むだけで何も全く困らんかったのですが、CやらLispやらを全くやってない
人に「perlのreferenceを理解させて、かつ、リンクリストを使えるようになるまで
理解」させようとすると相当つらそうです。

何か情報をおもちの方はよろしくお願いいたします。





Takahide Nojima

未読、
2004/01/15 20:21:272004/01/15
To:
nojimaです。補足です。

Takahide Nojima <noj...@taito.co.jp> writes:

> を読むだけで何も全く困らんかったのですが、CやらLispやらを全くやってない
> 人に「perlのreferenceを理解させて、かつ、リンクリストを使えるようになるまで
> 理解」させようとすると相当つらそうです。
>

「相当つらそうです」というのも、実際やってみるとわかるのですが、

my $d=2;
my $ref_d=\$d;
print $$ref_d;

ぐらいなら「なんとかなる」みたいですが、

my %foo=();
$foo{bar}={xyzzy=>[1,2,3,4],plugh=>{a=>1,b=>"aaa"}};
print join(",",@{$foo{bar}{xyzzy}})."\n";
print $foo{bar}{plugh}{a}."\n";

あたりから理解が大変怪しくなり、

my %top_node=();
my $current_node_ref=\%top_node;
my $cnt=0;
$top_node{value}=$cnt;
$cnt++;
for(;$cnt<10;$cnt++){
my %a_node=(value=>$cnt);
$current_node_ref->{next}=\%a_node;
$a_node{prev}=$current_node_ref;
$current_node_ref=\%a_node;
}
print "forward:\n";
for($current_node_ref=\%top_node;defined $current_node_ref->{next};
$current_node_ref=$current_node_ref->{next}){
print $current_node_ref->{value}.",";
}
print $current_node_ref->{value}."\n";
print "reverse:\n";
for(;defined $current_node_ref->{prev};
$current_node_ref=$current_node_ref->{prev}){
print $current_node_ref->{value}.",";
}
print $current_node_ref->{value}."\n";

になると「もうわけわからんちん」になるそうです。


Hoshi Takanori

未読、
2004/01/15 22:11:362004/01/15
To:
ほしです。

In article <m3eku1s...@nightmare.hm.taito.co.jp>
Takahide Nojima <noj...@taito.co.jp> writes:

> この人にperlのreferenceを理解させて、かつ、リンクリスト
> 位まで理解させる為には、どのような参考書/方法がありますでしょうか?

perl のリファレンスに関する日本語の文献としては、

「実用 Perl プログラミング」Sriram Srinivasan
http://www.amazon.co.jp/exec/obidos/ASIN/4900900826

に結構詳しい記述がありますが、初心者向けとは
言えないでしょうね。

ところで、perl (に限らず、最近の言語処理系) で
linked list を使って嬉しいことって何でしょう?
(大抵は配列とハッシュで充分だと思うんですが...)

ほし

Takahide Nojima

未読、
2004/01/15 23:48:032004/01/15
To:
nojimaです。

ho...@sra.co.jp (Hoshi Takanori) writes:

> perl のリファレンスに関する日本語の文献としては、
>
> 「実用 Perl プログラミング」Sriram Srinivasan
> http://www.amazon.co.jp/exec/obidos/ASIN/4900900826
>
> に結構詳しい記述がありますが、初心者向けとは
> 言えないでしょうね。
>
> ところで、perl (に限らず、最近の言語処理系) で
> linked list を使って嬉しいことって何でしょう?
> (大抵は配列とハッシュで充分だと思うんですが...)

1. 経路探索

2. 塊りを並べ替えとか、

3. 木構造のデータを扱うとか、

いかがでしょうか?


IKEDA Kenji

未読、
2004/01/16 0:24:592004/01/16
To:
On 16 Jan 2004 10:21:27 +0900,
In article <m3r7y0y...@nightmare.hm.taito.co.jp>,
Takahide Nojima <noj...@taito.co.jp> wrote:

> あたりから理解が大変怪しくなり、

my %foo;
$foo{bar} = {
xyzzy => [1, 2, 3, 4],
plugh => {
a => 1,
b => "aaa",
},
};

と書いたらわかったりして。

> になると「もうわけわからんちん」になるそうです。

『ARRAY で表現できるのに、なんでこんな回りくどいことをするのか、
「もうわけわからんちん」』と言っているんだったりして。

--
池田研二 稲城駅前在住

Takahide Nojima

未読、
2004/01/16 0:57:172004/01/16
To:
nojimaです。

IKEDA Kenji <noro...@mob.or.jp> writes:

> > あたりから理解が大変怪しくなり、
>
> my %foo;
> $foo{bar} = {
> xyzzy => [1, 2, 3, 4],
> plugh => {
> a => 1,
> b => "aaa",
> },
> };
>
> と書いたらわかったりして。

^^;そうだと良いなぁ...

> 『ARRAY で表現できるのに、なんでこんな回りくどいことをするのか、
> 「もうわけわからんちん」』と言っているんだったりして。

そうあってくれぇぇぇっ...

referenceはC言語かAssemblerから習得かなぁ...でもこの独特の表記に慣れるという
意味ではC言語からの習得か?


Takahide Nojima

未読、
2004/01/20 19:46:232004/01/20
To:
nojimaです。

ho...@sra.co.jp (Hoshi Takanori) writes:

> 「実用 Perl プログラミング」Sriram Srinivasan
> http://www.amazon.co.jp/exec/obidos/ASIN/4900900826
>
> に結構詳しい記述がありますが、初心者向けとは
> 言えないでしょうね。

あと、最近本屋でみかけたのですが、

「続・初めてのPerl - Perlオブジェクト、リファレンス、モジュール」
http://www.amazon.co.jp/exec/obidos/ASIN/4873111676

なども詳しい方だと思うのですが、案の定
perl journal誌(2001~2002の雑誌の頃 http://tpj.com/ )の記事のまんまでした。
「初めての...」とあるわりには、ちょっと初心者向けじゃないような??

#...どことなく、読者前提がアセンブラ/Cをやったことのある人向けの解説...

C言語はポインタ関係だけの本が沢山出てるのにー、なんでperlは無いのぉぉ?


Takahide Nojima

未読、
2004/01/22 2:58:312004/01/22
To:
nojimaです。

#すみません。忘れてたです。

Takahide Nojima <noj...@taito.co.jp> writes:

> > perl のリファレンスに関する日本語の文献としては、
> >
> > 「実用 Perl プログラミング」Sriram Srinivasan
> > http://www.amazon.co.jp/exec/obidos/ASIN/4900900826
> >
> > に結構詳しい記述がありますが、初心者向けとは
> > 言えないでしょうね。
> >
> > ところで、perl (に限らず、最近の言語処理系) で
> > linked list を使って嬉しいことって何でしょう?
> > (大抵は配列とハッシュで充分だと思うんですが...)
>
> 1. 経路探索
>
> 2. 塊りを並べ替えとか、
>
> 3. 木構造のデータを扱うとか、

確かに究極的には、何でも格納できる配列さえあればなんだってできますね。

・でっかい配列を用意してもらい、
・この配列上にいろんなデータを実体で格納してもらい、
・この配列の添字のみでデータ操作をさせる

ことで、配列操作のみであらゆるデータ構造を確かに作れます。

つまり配列を実メモリとして使って、要素番号を「ポインタのアドレス」
として使わせればいい...

そうすれば、この配列の上では1~3は全て要素番号だけで操作可能。
配列だけわかってくれる初心者にも1.~3.をいけるに違いない。

#...ただ、一ついえることは自分は絶対に使わんに違いない...

IKEDA Kenji

未読、
2004/01/22 9:42:452004/01/22
To:
なんと <m3r7y0y...@nightmare.hm.taito.co.jp> って本気だったんだ。
てっきりギャグがすべってるのかと。

On 22 Jan 2004 16:58:31 +0900,
In article <m3llo09...@nightmare.hm.taito.co.jp>,
Takahide Nojima <noj...@taito.co.jp> wrote:

> 確かに究極的には、何でも格納できる配列さえあればなんだってできますね。

誰がそんなことをしたがるんだ? ハッシュのリファレンスが格納できりゃ十分では?

> #...ただ、一ついえることは自分は絶対に使わんに違いない...

で <m3r7y0y...@nightmare.hm.taito.co.jp> な使い方をすると。

my @data;
foreach my $i (0 .. 9) {
push @data, { value => $i };
}
print 'forward:';
foreach my $ref (@data) {
print ' ', $ref->{value};
}
print "\n", 'reverse:';
foreach my $ref (reverse @data) {
print ' ', $ref->{value};
}
print "\n";

は、<m3r7y0y...@nightmare.hm.taito.co.jp> よりどういう点が劣るのか?

--
池田研二 稲城駅前在住

Takahide Nojima

未読、
2004/01/25 20:23:552004/01/25
To:
nojimaです。

IKEDA Kenji <noro...@mob.or.jp> writes:

> > 確かに究極的には、何でも格納できる配列さえあればなんだってできますね。
>
> 誰がそんなことをしたがるんだ? ハッシュのリファレンスが格納できりゃ十分では?

いやその。 ハッシュのリファレンスを使いこなす人から見ればそのとおりです。
もう、仰る通りでおいらも「そうしてくれぇ~」と思うことしきりです。

ただ、リファレンスをどうにもいまいち理解出来無い人からすれば、
下手するとこういう手に出るのかも?という話です。

> で <m3r7y0y...@nightmare.hm.taito.co.jp> な使い方をすると。
>
> my @data;
> foreach my $i (0 .. 9) {
> push @data, { value => $i };
> }

...中略...


> foreach my $ref (reverse @data) {
> print ' ', $ref->{value};
> }
> print "\n";
>
> は、<m3r7y0y...@nightmare.hm.taito.co.jp> よりどういう点が劣るのか?

「件の例題の範囲」では全く劣ってませんし、シンプルでこちらの方が良いです。

もし<m3r7y0y...@nightmare.hm.taito.co.jp>を見て、上の引用を自分で
言ってくるような人ばかりであれば自分もあのような投稿はしませんでした。

自分の知りたい内容は、<m3r7y0y...@nightmare.hm.taito.co.jp>の
プログラムの動作の予想がまったくつかない人がいるので、これをどう助ける
かということです。

自分にとって一番良いのは、「初めてのリファレンス」とか、
「サルでもわかるリファレンス」等の本/文献を見つけて、それを
読ませるという手を使いたいのですがどうにもみつからないので困ってます。

今まで見つけたリファレンスの本は、どうみてもC言語でポインタぐらいは使える
人向けの解説だったりする印象がどうしてもあります。自分が相手にしているのは、
「ポインタ/リファレンスという概念すら初めて
(アセンブラ/インデックス経由のアクセスの経験全く無し)」という人です。

なお、こういった人にリファレンスを使いこなした実用的なプログラムがかける
レベルまで理解させようとすると、

(1) 「メモリにデータを格納するにはアドレスを使うのだ」という概念の
理解から始まり、
(2) リファレンスという概念の理解、
(3) リファレンスを表す独特の表記方法/文法の理解、
(4) リファレンスの使い方の実際の例を解析させる、
(5) リファレンスを用いたデータ構造の主なパターンを沢山みせる、
(6) リファレンスを実際つかわせる、
(7) リファレンスを用いたプログラムのデバッグの仕方も憶えさせる、

の全部を理解させる必要があります。

C言語だと(1)~(7)までしっかり解説した本が沢山出ているのに、Perlだと(3)と
非常に限定的な(4)程度までの本しかどうにも見つからない印象を受けてます。

まあ、そういった人にはperlなんぞつかわせず、OOPな高級言語を使わせれば
様々なデータ構造はオブジェクトの組み合わせで行うからリファレンスに
頼らなくても作成可能なので楽かもという話もあるとは思います。
しかし結局、そいった言語でもobjectのDeepCopy/ShallowCopyを説明する段階になって
結局リファレンスと同じような話をしなければならずハマルんじゃないかと...

(ただ、少なくとも(3)の独特の表記については、たいして憶える必要はなさそう
ですが)




IKEDA Kenji

未読、
2004/01/26 10:39:012004/01/26
To:
On 26 Jan 2004 10:23:55 +0900,
In article <m3y8rvv...@nightmare.hm.taito.co.jp>,
Takahide Nojima <noj...@taito.co.jp> wrote:

> 「件の例題の範囲」では全く劣ってませんし、シンプルでこちらの方が良いです。

では、例題の範囲から外れた、配列やハッシュを使うより linked list を使っ
た方が良い例をあげてもらえませんか?

On 16 Jan 2004 13:48:03 +0900,
In article <m3n08ox...@nightmare.hm.taito.co.jp>,
Takahide Nojima <noj...@taito.co.jp> wrote:

>> ところで、perl (に限らず、最近の言語処理系) で
>> linked list を使って嬉しいことって何でしょう?
>> (大抵は配列とハッシュで充分だと思うんですが...)

> 1. 経路探索
> 2. 塊りを並べ替えとか、
> 3. 木構造のデータを扱うとか、

てなあたりの例ですね。

2は何を言わんとしてるのか素人の私にはわかりませんが、1, 3 を扱うなら何
も考えず配列とハッシュを使ってしまうでしょう。そういうレベルにいるもん
で、linked list を使った場合の利点がわかると大変ありがたい。

--
池田研二 稲城駅前在住

新着メール 0 件