「なぜ split $;, $_[1] なのかは宿題」の答え

Perl初心者のためのPerlノートです!

HTML/ CSS/ CGI-Perl/ JavaScript/ JavaApplet/ AccessUp/ Internet/ EnglishLearn/ ちゃいちゃん天使/ 天使メッセージ/ 飯田ワールド/ 結城ワールド/ プロフィール/ WEB相談室/ WEBアンテナ/ WEBリーダー/ 燈明日記/ yahoo

◆ はじめに

本ページは、私がPerlを習得した時(いや習得中)のノートです。

ごく普通の言語(COBOL,C,Java,VB等)を知っている人が、Perlをやり始めるといろいろと悩むことがあります。

それは、

です。

本ページは、そのようなハードルを一つ一つクリアにしていけたらと思います。

そして、本ページが何かのお役に立てれば幸いです。では、ごゆっくりご覧ください。

尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくPerlノート掲示板へご指摘ください。

◆ サイト最新情報

◆ コンテンツ

2008-07-05 「なぜ split $;, $_[1] なのかは宿題」の答え

まずは、問題。

1から100までの数をプリントするプログラムを書け。

ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm

弾さんの答え

tie my %fizzbuzz, 'Tie::Code' => sub {
    $_[0] % 15 ? $_[0] % 5 ? $_[0] % 3 ? 
    $_[0]      : 'Fizz'    : 'Buzz'    : 'FizzBuzz';
};

print "$fizzbuzz{$_}\n" for (1..100);

答えは感嘆せざるをえないほど簡単だ。

package Tie::Code;
use Tie::Hash;
sub TIEHASH { bless $_[1], $_[0] }
sub FETCH   { $_[0]->( split $;, $_[1] ) }

なぜsplit $;, $_[1]なのかは宿題ということで。

http://blog.livedoor.jp/dankogai/archives/50826956.html

そして、宿題の答えなのですが、わかりませんでした!

わかったのは、「split $;」しても、しなくても結果は同じになったということです。


$_[1]には1から100のスカラー値が設定されます。

そして「split $; $_[1]」すると配列値(ゼロ番目にそのスカラー値)になります。

しかし、これを受ける方(無名サブルーチン)で、第一引数の$_[0]になっていますので、スカラー値でも配列値も同じ値になりますよね。

実際、実行結果でも同じでした。


ちなみに、私的にソース解説をしときました。

tie my %fizzbuzz, 'Tie::Code' => sub {
    $_[0] % 15 ? $_[0] % 5 ? $_[0] % 3 ? 
    $_[0]      : 'Fizz'    : 'Buzz'    : 'FizzBuzz';
};

は、入れ子の3項演算子使用で、以下のようにすると意味が理解しやすくなります。

tie my %fizzbuzz, 'Tie::Code' => sub {
    $_[0] % 15 ? $_[0] % 5 ? $_[0] % 3 ? $_[0]
                                       : 'Fuzz'
                           : 'Bumper'
               : 'FuzzBumper';
};

尚、「・・・ 'Tie::Code' => sub{ ・・・」等でハッシュぽっく書いてあるけど、この無名サブルーチンリファレンスは、コンストラクタ(Tie::CodeのTIEHASH)の第2引数にセットされる。


print "$fizzbuzz{$_}\n" for (1..100);

は、以下と同じです。

for $_ (1..100) {
    print "$fizzbuzz{$_}\n";
}

◆ おすすめ Perl本

■ 続・初めてのPerl 改訂版

『初めてのPerl』の次ぎに読むと吉です。

結構いいですが・・・、初心者にはちょっと難しいかもです。

■ 結城浩のPerlクイズ

この本には、ちゃいちゃんパパの小話しが載っています(謎)。

ある程度、Perlを理解している人には、たまらない内容になっています。さすが結城先生だな!

結城浩のPerlクイズ

■ 新版Perl言語プログラミングレッスン入門編

実は、私はまだ読んでいませんが、結城先生の本なので良くないはずがありません。

新版Perl言語プログラミングレッスン入門編

■ CGI&Perlポケットリファレンス (Pocket reference)

この本は、非常に役に立ちます。ちょっと調べるのに最適です。サンプルも説明も的を射ています。

CGI&Perlポケットリファレンス (Pocket reference)

■ Perlベストプラクティス

一読の価値有りだと思います。

Perlベストプラクティス

■ プログラミングPerl〈VOLUME1〉

ご存知、Perl本の聖書、ラクダ本(上)です。

■ プログラミングPerl〈VOLUME2〉

ご存知、Perl本の聖書、ラクダ本(下)です。

◆ おわりに

最後に、本ページが、何かのお役に立てれば幸いです。

尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくPerlノート掲示板へご指摘ください。

HTML/ CSS/ CGI-Perl/ JavaScript/ JavaApplet/ AccessUp/ Internet/ EnglishLearn/ ちゃいちゃん天使/ 天使メッセージ/ 飯田ワールド/ 結城ワールド/ プロフィール/ WEB相談室/ WEBアンテナ/ WEBリーダー/ 燈明日記/ yahoo

人のよいところをどんどん見つけよう