2008-03-01から1ヶ月間の記事一覧

12.14 組み込み関数と同様のエラーと警告を出力する

自分のモジュールでエラーと警告を生成する。しかし、warnまたはdieを使用すると、自分自身のモジュールのファイル名と行番号が出力される。ユーザのコードに基づいてメッセージが出力されるようにしたい。 標準モジュールCarpを使用する。 warn -> carp die…

12.12 組み込み関数をオーバーライドする

標準的な組み込み関数を独自のバージョンに置き換えたい。 該当する関数を別のモジュールから自分自身の名前空間にインポートする。 関数の定義 package Time::HiRes; use strict; require Exporter; use vars qw(@ISA, @EXPORT_OK); @ISA = qw(Exporter); @…

12.11 Autoloaderでモジュールのロードを高速化する

h2xsツールを使用して、必要なディレクトリと全てのファイルを作成する。 % h2xs -Xn Sample % cd Sample % perl Makefile.PL LIB=~/perllib % (Sample.pmを編集する。) % make install

12.9 モジュールを配布する

h2xsツールを使用する。 % h2xs -XA -n Planets % h2xs -XA -n Astonomy::Orbits

12.10 SelfLoaderでモジュールのロードを高速化する

SelfLoaderモジュールを使用する require Exporter; require SelfLoader; @ISA = qw(Exporter SelfLoader); # # 他の初期化または宣言をここに書く # __DATA__ sub abc { .... } sub def { .... }

12.8 自分専用のモジュールディレクトリを用意する

Perlの-lコマンドラインスイッチを使う。 PERL5LIB環境変数を設定する。 use libプラグマを使用する。 use FIndBin qw($BIN); use lib "$BIN/../lib";

12.6 呼び出し側のパッケージを判定する

現在のパッケージを判定する。 $this_pack = __PACKAGE__; 呼び出し側のパッケージを判定する。 $that_pack = caller();

12.7 モジュールのクリーンアップを自動化する

ユーザによる操作を必要とせずに自動的に呼び出されるモジュールの設定コードとクリーンアップコードを作成する必要がある。 設定コードについては、モジュールファイル内のサブルーチン定義以外の場所に実行可能なステートメントを書く。 クリーンアップコ…

12.4 変数を局所化する

パッケージ内で有効なレキシカル変数を使用する。

12.5 関数を局所化する

関数をパッケージに対して、局所化することはできない。 局所変数を作成し、その変数に無名関数へのリファレンスを保存する。 # これは、SomeModule.pmと言うファイルである package SomeModule; my $secret_function = sub { # ここにコードを書く }; sub r…

12.3 useで処理を実行時まで遅延させる

プログラムを実行するときに、必要な場合に限ってロードするモジュールがある。あるいは、プログラムが起動された後でロードすることが必要なモジュールがある。 useによる処理をrequireとimportによる独立した2つの処理の分割するか、または、use autouseプ…

12.2 requireまたはuseのエラーを捕捉する

requireまたはuseをevalの引数として書き、そのevalをBEGINブロックの中に書く。 モジュールをインポートしない場合 BEGIN { unless (eval "require $mod; 1") { warn "Couldn't require $mod: $@; } } モジュールを現在のパッケージにインポートする場合 BE…

12.1 モジュールのインターフェースを定義する

標準モジュールのExporterによって、自分のモジュールへの外部インタフェースを定義する。 YourModule.pmと言うモジュールファイルに次のコードを書く。 package YourModule; use strict; our (@ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $VERSION); use Exp…

11.13 データ構造体をディスクに保存する

Storableモジュールが提供するstore関数、retrieve関数を使用する。 use Storable; store(\%hash, "filename"); # データ構造体の読み取り $href = retrieve("filename");

11.14 透過的で永続的なデータ構造体を作成する

MLDBMとDB_Fileを使用する。 use MLDBM qw(DB_File); use Fcntl; tie (%hash, "MLDBM", "testfile.db", O_CREAT|O_RDWR, 0666) or die; # ... %hashに対する処理を書く untie %hash;

11.11 データ構造体を出力する

use Data::Dumper; print Dumper($reference);

11.12 データ構造体をコピーする

標準モジュールStorableが提供するdclone関数を使用する。 use Storable; $r2 = dclone($r1);

11.10 ハッシュレコードをテキストファイルから読み取る/テキストファイルに書き込む

1行に1フィールドを記述するシンプルなファイルフォーマットを使用する。 FieldName : Value 各レコードは空白行で区切る。 レコードを書き込む foreach $record (@Array_of_Records) { for $key (sort keys %$record) { print "$key : $record->{$key}\n"; …

11.8 メソッドのリファレンスを作成する

適切なオブジェクトの適切なメソッドを呼び出すクロージャを作成する。

11.9 レコードを構築する

無名ハッシュのリファレンスを使用する。 例 $record = { NAME => "Jason", EMPNO => 132, TITLE => "deputy peon", AGE => 23, SALARY => 37_000, PALS => ["Norbert", "Rhys", "Phineas"], };

11.6 スカラーリファレンスの配列を作成する

@array_of_scalar_refs = (\$a, \$b); @array_of_scalar_refs = \($a, $b);

11.7 オブジェクトの代わりにクロージャを使用する

プライベートな(外部からは参照できない)状態情報、動作情報、識別子を持つレコードを作成したい。 クロージャのリファレンスを格納したハッシュを(リファレンスで)返す関数を書く。これらのクロージャは、全て同じスコープ内で作成されるので、実行すると、…

11.5 スカラ値のリファレンスを取得する

$scalar_ref = \$scalar; $anon_scalar_ref = \15;

11.4 関数のリファレンスを取得する

リファレンスの取得 $cref = \&func; $cref = sub { ... }; デリファレンス @returned = $cref->(@arguments); @returned = &$cref(@arguments);

11.3 ハッシュのリファレンスを取得する

リファレンスの取得 $href = \%hash; $anon_hash = { "key1" => "value1", "key2" => "value2", ...}; $anon_hash_copy = { %hash }; デリファレンス %hash = %$href; $value = $href->{$key}; @slice = @$href{$key1, $key2, $key3}; @keys = keys %$href; …

11.1 配列のリファレンスを取得する

$aref = \@array; $anon_array = [1, 3, 5, 7, 9]; $anon_copy = [ @array ]; @$implicit_creation = (2, 4, 6, 8, 10);

11.2 配列のハッシュを作成する

ハッシュ内に値として、無名配列のリファレンスを格納する。 push(@{ $hash{"KEYNAME"} }, "new value"); ハッシュを出力する foreach $string (key %hash) { print "$string: @{$hash{$string}}\n" }

おもてなしの経営学

Life is beautifulで有名なSatoshiさんの本を読書中。とりあえず、面白かった言葉。 普通の人が使えないようなパソコンを作っている方が悪い。 ユーザエクスペリエンスとは、心地よさを体感すること。 YouTubeが成功した理由。ユーザの要求を理解し、それを…

10.5 配列、ハッシュをリファレンスで関数に渡す

バックスラッシュ演算子を使用する。 array_diff( \@array1, \@array2 );

10.4 現在実行されている関数の名前を取得する

caller関数を使用する。 $this_function = (caller(0))[3];