Cookbook

15.12 画面を制御する

画面のレイアウトや強調表示の制御、特殊キーが押された場合の検出、フルスクリーンメニューの表示などを行いたい。ただし、ユーザがどのような種類のディスプレイデバイスを使用しているかについては配慮する必要を無くしたい。 CPANのCursesモジュールを使…

15.11 入力を編集する

ユーザが入力行を送信してプログラムに読み取らせる前に、その入力行をユーザ自身が編集できるようにしたい。 Term::ReadLineモジュールを使用する。 use Term::ReadLine; $term = Term::ReadLine->new("APP DESCRIPTION"); $OUT = $term->OUT || *STDOUT; $…

15.10 パスワードを読み取る

キーボードからの入力を読み取るときに、そのキーの入力が画面にエコーされないようにする。 CPANのTerm::ReadKeyモジュールを使用して、その入力モードをnoechoに設定した後で、ReadLineを使用する use Term::ReadKey; ReadMode('noecho'); $password = Rea…

15.9 待機状態の入力を検査する

キーボードからの入力が実際に読み取られずに待機状態になっているかどうかを検査したい。 CPANのTerm::ReadKeyモジュールを使用して、引数として-1を渡すことによって、非ブロックモードによるキーの読み取りを試みる。 use Term::ReadKey; ReadMode ('cbre…

15.8 POSIX termiosを使用する

端末の特性を直接設定したい POSIXモジュールのtermiosインターフェースを使用する

15.7 端末のビープ音を制御する

"\a"文字を出力する print "\aWake Up!\n"; "vb"端末機能を使用して、ビジュアルレベルを表示する use Term::Cap; $OSPEED = 9600; eval { require POSIX; my $termios = POSIX::Termios->new(); $termios->getatt; $OSPEED = $termios->getospeed; }; $term…

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,…