Perl Perl_6
Perl ファイルハンドル IO::Handle 概要 (d049)
目次 - Perl Index
Theme
Perl について、復習を兼ねて断片的な情報を掲載して行く連載その d049 回。
Perl で、入出力全般の基底クラスになっているというモジュール ( パッケージ ) 「 IO::Handle 」を確認する。
「 IO::Handle 」のドキュメントは前回 (d048) で確認しました。今回は、そのドキュメントを参考にしてモジュールの概要を確認します。
標準入力 ( STDIN ) から入力を受け付ける
(0x16) では、ダイヤモンド演算子「 <> 」(0x226) と特別なファイルハンドル「 STDIN 」(0x42) を利用して、標準入力 ( standard input ) から 1 行の入力を受け付けるプログラムを確認しました。
if( defined (my $line = <STDIN>) ){
print $line;
}
これと同じ機能を IO::Handle のメソッドを利用して実装すると、次のようになるようです。
# オブジェクトを生成
my $io = IO::Handle->new();
# 読み込みモード ( r ) で標準入力を open
if($io->fdopen(fileno(STDIN),"r")){
# 1 行の入力受付
print $io->getline;
# クローズ
$io->close;
}
メソッド「 $io->fdopen( FD,MODE ) 」
メソッド「 fdopen() 」は、ほとんど普通の「 open() 」と同じ機能とのことですが、第 1 引数「 FD 」には、「 ファイルハンドル 」, 「 IO::Handle のオブジェクト 」または 「 ファイルディスクリプタ 」を指定します。
第 2 引数「 MODE 」には、Perl のモード文字列「 > 」, 「 +< 」等や、ANSI C の「 fopen() 」で利用可能なモード文字列「 w 」, 「 r+ 」等が利用出来るようです。
組み込み関数の「 fileno 」は、引数に指定したファイルハンドルのファイルディスクリプタ ( ファイル記述子 ) を返します。
メソッド「 $io->getline 」
メソッド「 getline 」は、「 $io->getline 」で「 <$io> 」(0x228) のように動作しますが、より安全に呼び出すことが出来ます。
また、コンテキスト ( 文脈 ) に関わらず必ず 1 行のみを返します。
リストコンテキストで利用した「 <$io> 」のように、複数行を取得したい場合は、「 getline 」の代わりに「 getlines 」が利用可能です。
標準出力 ( STDOUT ) に出力する
IO::Handle メソッドを利用して標準出力 ( standard output ) にデータを出力するには次のように書けます。
my $io = IO::Handle->new();
if($io->fdopen(fileno(STDOUT),"w")){
$io->print("Some text\n");
}
ファイルハンドルをオブジェクトとして利用する
通常の「 open 」のファイルハンドルに、IO::Handle のオブジェクトを指定することが出来ます。
use IO::Handle;
my $file = 'some_text';
# オブジェクトを作成
my $io = IO::Handle->new();
# オブジェクトをファイルハンドルスカラとして指定
open $io, '>', $file or die "$!";
# 書き込み
$io->print("some message..\n");
# 読み込みで利用
open $io, '<', $file or die "$!";
# STDOUT に出力
print $io->getline;
なお、そもそも Perl の裏側ではファイルハンドルは IO::Handle のオブジェクトとして扱われているので、実は IO::Handle を use しておけば、そのオブジェクトをファイルハンドルに指定しなくても、各種メソッドは利用可能です。
use IO::Handle;
my $file = 'some_text';
open my $fh, '>', $file or die "$!";
# IO::Handle メソッドが利用可能
$fh->print("some message..\n");
しかしながら、ファイルハンドルをめぐる冒険(ただしマニア向け) - daily dayflower の検証結果にあるように推奨される利用方法ではないようです。
また、前回 (d048) 等で確認した通り、モジュール「 IO::Handle 」はあくまで入出力全般のベースになる機能を提供するものなので、ファイルハンドルをオブジェクトとして利用する等、具体的な処理を行う場合は、例えば「 IO::File 」等の用途にあったモジュールを選択します。
NEXT
次回は、モジュール「 IO::File 」のドキュメントを確認します。
参考情報は書籍「 続・初めての Perl 改訂版 」, 「 Effective Perl 第 2 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。
目次 - Perl Index
Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)