Perl

15.6 キーボードから1文字を読み取る

1文字のキーを押して選択するメニューを表示した場合に、ユーザが文字キーの後でEnterキーを押さなくても選択できるようにする。 CPANのTerm::ReadKeyモジュールを使用して、端末をcbreakモードに切り替える use Term::ReadKey; ReadMode 'cbreak'; $key = R…

15.5 テキストの色を変更する

CPANのTerm::ANSICorlorモジュールを使用して、ANSIの色変更シーケンスをユーザの端末に送信する。 use Term::ANSIColor; print color("red"), "Danger, Will Robinson!\n", color("reset"); print "This is just normal text.\n"; print colorred("<BLINK>Do you h</blink>…

15.4 端末またはウィンドウのサイズを判定する

CPANのTerm::ReadKeyモジュールを使用する。 use Term::ReadKey; ($wchar, $hchar, $wpixels, $hpixels) = GetTerminalSize();

15.3 画面を消去する

Term::Capモジュールを使用して、適切な文字シーケンスを送信する。 use Term::Cap; $OSPEED = 9600; eval { require POSIX; my $termios = POSIX::Termios->new(); $termios->getattr; $OSPEED = $termios->getospeed; }; $terminal = Term::Cap->Tgetent({…

15.2 プログラムが対話的に実行されているかどうか判定する

プログラムが対話的に実行されているかどうか知りたい。例えば、プログラムがシェルから実行されている場合は対話的であり、プログラムがcronから呼び出されている場合は対話的でない。 -tを使用してSTDINとSTDOUTをテストする sub I_am_interactive { retur…

15.1 プログラムの引数を解析する

標準モジュールGetopt::Stdを使用して、1文字オプションを使用する。 use Getopt::Std; # -v ARG, -D ARG, -o ARGに基づいて、$opt_v, $opt_D, $opt_oを設定する getopt("vDo"); # -v ARG, -D ARG, -o ARGに基づいて、$args{v}, $args{D}, $args{o}を設定す…

14.18 データベースなしでSQLを使用する

SQLを使用して複雑な問い合わせを行いたいが、リレーショナルデータベースサーバの管理はしたくない。 CPANで公開されているDBD::SQLiteモジュールを使用する。 use DBI; $dbh = DBI->connect("dbi:SQLite:dbname=/User/gnat/salaries.sqlt, "", "", { Raise…

14.17 CSVファイルをSQLで問い合わせる

SQLを使用してCSVファイルのデータの挿入、削除、または取り出しを行いたい。 CPANで公開されているDBD::CSVモジュールを使用する。 use DBI; $dbh = DBI->connect("dbi:CSV:f_dir=/home/gnat/payroll", "", "", { AutoCommit => 1, RaiseError = > 1 }); $d…

14.16 1ページ分ずつデータを表示する

テーブルの内容または問い合わせの結果を一度に1ページ分ずつ表示したい。 どのレコードから表示し始めるかを常に確認できるように変数を設定し、次にその変数の値を使用して、1ページ分として表示するにはいくつのレコードを取り込めばよいかを決定する。

14.15 トランザクションを使用する

$dbh->{AutoCommit} = 0; # トランザクションを有効にする。 $dbh->{RaiseError} = 1; クエリに問題がある場合は、dieを呼び出す。 eval { # ここで挿入、更新、削除、問い合わせなどを行う。 $dbh->commit(); }; if ($@) { warn "Transaction aborted: $@; …

14.14 クエリによって返された行数を確認する

$rows = $dbh->do("DELETE FROM Conference WHERE Language='REBOL'"); if (! defined $rows) { # 失敗したときの処理。ただし、RaiseErrorが有効になっていれば、不要である。 } else { print "Deleted $rows rows\n";

14.13 プログラムによってクエリを生成する

検索用のクエリを実行時に構築したい。例えば、プログラムのユーザが検索の対象とする列と許容できる値の範囲を組み合わせて指定できるようにする。 検索の条件を示す句のリストを構築し、joinによってそれらを連結してSQLのWHERE句を作成する。 if ($year_m…

14.12 効率よくクエリを繰り返す

類似しているが全く同じではない複数のクエリがあり、それらを効率的に実行したい。 prepareを使用して、クエリを1回だけ準備しておけば、そのクエリはexecuteを使用して、何回でも繰り返し実行することができる。 $sth = $dbh->prepare($SQL); # クエリを10…

14.11 データベースのエラーを処理する

自分のプログラムにおいて、データベースのエラーを捕捉して処理したい。 データベースに接続するときに、RaiseErrorを有効にし、データベースに対する呼び出しをevalブロックの中に書く。 $dbh = DBI->connect($DSN, $user, $password, { RaiseError => 1 }…

14.10 クォートの処理

Perlの値をリテラルな文字列として、クエリの中に挿入したい。 データベースハンドルのquoteメソッドを使用する。 $quoted = $dbh->quote($unquoted);

14.9 DBIを使用してSQLコマンドを実行する

Oracle, Sybase, mSQL, MySQLなどのデータベースシステムにSQLクエリを送信し、その結果を処理したい。 CPANで公開しているDBI(DataBase Interface), DBD(DataBase Driver)モジュールを使用する use DBI; $dbh = DBI->connect('dbi:driver:database', 'usena…

14.8 問い合わせ結果をExcelまたはCSVへ保存する

CPANのDBIx::Dumpモジュールを使用して、問い合わせの後でステートメントハンドルをダンプする。 use DBIx::Dump; use DBI; # ... 通常の方法でデータベースに接続する $sth = $dbh->prepare("SELECT ..."); # ここにクエリを書く $sth->execute(); $out = D…

14.7 永続的なデータ

プログラムを一度呼び出してから、次に呼び出すまでの間、変数が値を維持できるようにしたい。 MLDBMを使用して、変数の値を保存する use MLDBM "DB_File"; my ($VARIABLE1, $VARIABLE2); my $Persistent_Store = "/projects/foo/data"; BEGIN { my %data; t…

14.6 DBMファイルに複雑なデータを保存する

文字列や数値よりも複雑な値を保存するには、CPANのMLDBMモジュールを使用する。 use MLDBM "DB_File"; tie(%HASH, "MLDBM", [... その他のDBMの引数]) or die $!; 次の方法で、特定のシリアル化モジュールを指定する。 use MDLBM qw(DB_File Storable);

14.5 大規模なDBMファイルをソートする

DB_FileのBツリーバインドを機能を使用して、自分で独自に作成した比較関数を指定する。 use DB_File; # エクスポートされた$DB_BTREEハッシュリファレンスを使用して # キーの比較を行うPerlのサブルーチンを指定する $DB_BTREE->{'compare'} = sub { my ($…

14.4 DBMファイルをマージする

それぞれのハッシュをリストとして処理する %OUTPUT = (%INPUT1, %INPUT2); それぞれのキーと値のペアをループ処理する %OUTPUT = (); foreach $href (\%INPUT1, \%INPUT2) { while (my($key, $value) = each(%$href) { if (exists $OUTPUT{$key}) { # どち…

14.3 異なるDBMファイルに変換する

DBMファイルからキーと値を読み取り、それらを異なるDBMフォーマットの新しいファイルに書き込む #!/usr/bin/perl -w # db2gdbm: DBをGDBMに変換する use strict; use DB_File; use GDBM_File; unless (@ARGV == 2) { die "Usage: db2gdbm infile outfile\n"…

14.2 DBMファイルを空にする

tieを使用してデータベースを開き、そのデータベースに関連づけられたハッシュに()を設定する。 use DB_File; tie(%HASH, "DB_File", $FILENAME) or die; %HASH = (); untie %HASH; ファイルを削除してから、改めて開き直す。 unlink $FILENAME or die; tie(…

14.1 DBMファイルを作成/使用する

DBMデータベースを作成し、値を格納、入力、参照、削除したい。 tieを使用してデータベースを開き、ハッシュによってアクセスできるようにする。必要な操作が完了したら、untieを呼び出す。 use DB_File; # データベースモジュールをロードする。 tie %HASH,…

13.15 tieでマジック変数を作成する

tieによって関連づけられた変数の解釈方法 ユーザコード 実行されるコード tie $s, "SomeClass" SomeClass->TIESCALAR() $p = $s $p = $obj->FETCH() $s = 10 $obj->STORE(10)

13.14 演算子のオーバーロード

自分が作成したクラスを継承しているオブジェクトにおいて、==や+などの使い慣れた演算子を使用したい。 overloadプラグマを使用する use overload '<=>' => \&threeway_compare; sub threeway_compare { my ($s1, $s2) = @_; return uc($s1->{NAME}) cmp uc…

13.13 オブジェクトで環状データ構造に対処する

自己参照データ構造でしか表すことのできないデータがある。従って、たとえそのデータ構造が不要になっても、Perlに組み込まれている参照ベースのガベージコレクションでは、そのことを認識することができない。 自己参照データ構造へのポインタを保存する非…

13.12 AUTOLOADで属性メソッドを生成する

自分で作成するオブジェクトにおいて、複数のデータフィールドを設定したり、取得したりするためのアクセッサメソッドが必要である。ただし、それら全てを一度に一つずつ書く手間を簡略化したい。 PerlのAUTOLOADメカニズムを一種のプロキシメソッド生成手段…

13.11 オーバーライドされたメソッドにアクセスする

自分で作成したクラスのコンストラクタメソッドによって、親クラスのコンストラクタをオーバーライドしている。この状況で自分のコンストラクタから親クラスのコンストラクタを呼び出す必要がある。 疑似クラスSUPERを使用する。 sub meth { my $self = shif…

13.10 継承可能なクラスを書く

自分で設計したクラスが他のクラスやオブジェクトによる継承に耐えられるくらい十分に堅牢であるかを確認したい。 自分のクラスに対して、"空のサブクラステスト"を適用する。 Personと言う名前のクラスを実装したと仮定する。 package Person; sub new { my…