2009-02-01から1ヶ月間の記事一覧

第75回 tie

Perlには、摩訶不思議な機構 tieが存在する。今、 何か変数に代入されると同時に、その代入された内容がファイルに書き込まれることで、 その変数の変化の様子をログに落とし込むことを考える。 つまり、 $hoge = 3;とあれば、摩訶不思議な機構により、ファ…

第74回 Error::Simple

第64回 Error.pm でちょっとハマったので - bingo_nakanishiの他言語出身者のためのPerl入門 ここで、dieされたものは、Error::Simpleにblessされたハッシュであることを述べた。 print $e ハッシュであるにもかかわらず、次のように書ける。 use strict; us…

第73回 例外の伝搬のさせ方

Java 同じものをthrowした場合 public class Hoge { public static void main(String[] args) { try { giveUp(); System.out.println("main() : 例外起こらないでー"); } catch (Exception e) { System.out.println("main() : 例外処理った"); e.printStackT…

第71回 Javaの例外処理の構造(文法的なお話) その2

それでは、try{ } catch { } の構造を使うと、 どのようにプログラムが流れていくのか見てみよう。 public class Hoge { public static void main(String[] args) { try { badMethod(); System.out.println("例外起こらないでー"); } catch (Exception e) { …

第70回 Javaの例外処理の構造(文法的なお話) その1

Javaの例外処理はかなりきっちりめにできており、 例外が起こった場合の処理を書いておかないとコンパイラさえ通らない。なお、大きくわけて例外は、処理しなければならない例外と、処理しなくてもいい例外の2つに別けることができる。 処理しなければなら…

第72回 log4perl

ログ出力のためのモジュール 残念な事にうまく説明する事ができないのだが、 log4perlというログ出力にとても便利なものがある。 設定方法などは、ここ↓に、簡単にであるが書いてある。 ビンゴ中西のほげほげlog4perl 今回は、簡単な説明図を載せることにす…

第69回 Javaで理解するデータ構造のお話

突然だが、(といっても最近の話題は結構当然性が強いが) Perlの配列の話をしよう。 Perlの配列は、配列といっているが実はListであるらしい。 だから、こんな事ができる。 use strict; use Data::Dumper; my @c = 1..3; print Dumper \@c; $c[10] = 4; pri…

第68回 関数ではなくforで処理を共通化する

いま、 ############### 中西 ############### ############### 木村 ############### ############### 田中 ############### ############### 山本 ###############と出力するソースを考えるとする。 へたくそに書く なにも考えずにとてもへたくそに書くと…

第67回 正常系と異常系

正常系と異常系という言葉がある。 第66回 Perlでじゃんけんゲーム - bingo_nakanishiの他言語出身者のためのPerl入門 この前回のじゃんけんゲームを例に挙げて説明すると、 入力に関して言えば、 「グー、チョキ、パー」のいずれかが、入力された場合が正常…

第66回 Perlでじゃんけんゲーム

Perlでじゃんけんゲームをつくりました。 勝敗を決めるアルゴリズムが違う2パターン作りました。 じゃんけんプログラム その1 使い方 プログラムの引数に、グー, チョキ, パーのいずれかの文字を与えて起動 勝負の判定方法 勝負の全パターンを書いて場合わけ…

第65回 「システムエラー」と「業務エラー」と「警告」

予期しないこと それがError 今、Errorというものを考える。 今、ここでアルファベットでErrorと表したものは、 「なにか予期しないこと」 と言った意味合いで使うことにする。 このErrorにはどんな種類のものがあるか、考えてみることにしよう。 システムエ…

第64回 Error.pm でちょっとハマったので

第45回 Java的な例外処理 - bingo_nakanishiの他言語出身者のためのPerl入門 で、Error.pmを紹介しました。 Error.pmを使ったソース で、今回、 次のようなコードを書いてみました。 use Error qw(:try); try { die 'OH'; }otherwise{ my $e = shift; print …

第63回 print (1+1)*5 は 2

次のソースを実行してほしい。 use strict; print (1+1)*5; 結果は、あなたの予想に反して 2となるであろう。なぜだろう? 2*5で10となってほしいところである。 これは、( ) が関数呼び出しの( ) と認識されてしまっているためである。 print('Hello World'…

第62回 vim入門 part4

ちょっと今覚えたので、メモ書きとして。開いたあとに文字コードを変えて読むには、 :e ++enc=文字コードである。 :e ++enc=EUC_JPなどが例である。 しかし、このファイル文字コードわかんねーんだよなぁ。 なにかなぁ ってときはブラウザで開けるのが一番賢…

第61回 例外処理 とか もしくはそれに似通ったもののベストプラクティスってないのかな?

例外処理に関するベストプラクティスってないのだろうか? 今回は例外処理とはちょっと違うかもしれないが、 入力された値をチェックする必要があったとして、 CHECK:{ last CHECK if なんかのチェック; last CHECK if またチェック; last CHECK if またまた…

第60回 チーム開発におけるソースコード使い回しによる悲惨な例

チームで開発している場合に、ソースコードを再利用するのはよいことであろう。 だが今回ご紹介するのはの、起こってはならない最悪な例のひとつと言える。次のような関数があったとしよう。 sub say { my $c = shift; print "$c" . "\n"; } これは、 say('h…

第59回 引数が多いときのための「名前付き引数」

何か自分で関数を作っているときなどで、 やけにその関数にもらう引数の数が多くなってしまうときはないだろうか? そんなときは、なにをどの順でもらうかなど意味のないところで足踏みしてしまったり、 呼び出す方も、ええと第1引数が、あれで第2引数があれ…

第58回 クロージャをもっとていねいに

では、クロージャをどのように作るのか説明してみる。 基礎になっている知識から説明していき、自然にクロージャが作れるようにするのを狙う。 最後に、クロージャで定数を作ってみる。 関数に関数を返してもらう 次のソースをみてもらおう。 use strict; su…

第57回 コールバックをもっとていねいに

前回、クロージャの話を書いたが、あまりていねいに説明はしなかった、 なぜかと言うと、そんなに実践で使われていないから(と私は感じているから)。 でも、詳しく知りたい方がおられるようなので、ていねいに解説してみよう。 まず、クロージャの前に、い…

第56回 クロージャの実践的使いどころ

あまりPerlでクロージャを使っている例をみたことがなくて(僕の勉強不足もあるだろうけど)、 友人に聞いてみたところ、 コールバックかな。 と言われたので、やってみよう。 コールバック そもそもコールバックとはなにかというと、 なにかの関数に関数を…

第55回 クロージャ

関数に値を保持させる 今、関数に何か数字を与えると、 その関数を呼ぶたびに与えた数字を ++ してほしいとする。 イメージ的には、 print f(5), "\n"; # 5 print f() , "\n"; # 6 print f() , "\n"; # 7こんな感じである。 純粋に、 use strict; sub f { my…

第54回 ガベージコレクションについて

Perlのガベージコレクションの話をしたいと思います。 相方から、こんな質問が入りました。 相方の発言 sub h{ my @c = 1..10; return \@c; # ここは大丈夫? } my $d = h(); print $_, "\n" for @$d; ってできないよね? C言語的な意味で。 私の発言 できる…

第53回 型グロブ

blessは2引数で - 北海道苫小牧市出身の初老PGが書くブログ このようなご指摘をいただいていた。 正直なところ、 *new = \&Human::new;の部分のアスタリスクは「型ブログ」と呼ばれるものであろうということぐらいの認識しかなく理解していなかった、そんな…

第52回 forとforeach

他の言語では、 配列からひとつひとつ取り出してループするにはforeachを使うようだが、 Perlにおいてforとforeachはまったく同じである。嘘だと思うなら、次のソースを試してみるとよい。for use strict; for(my $i=0; $i<5; $i++){ print $i, "\n"; } 結果…