blog20100901

2013/08/20 - プログラミング言語 Perl にまつわる etc. - Perl monger
参考 : perldoc, perldoc.jp, search.cpan.org, perldoc.perl.org ...
「 初めての Perl 第 6 版 」(オライリー・ジャパン発行 ISBN978-4-87311-567-2) 」
「 続・初めての Perl 改訂版 」(オライリー・ジャパン発行 ISBN4-87311-305-9) 」
「 Effective Perl 第 2 版 」(翔泳社発行 ISBN978-4-7981-3981-4) 」 ... etc,.

Perl Perl_6

Perl ファイルハンドル IO::Handle 概要 (d049)

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)の記事
 Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228) (2023-10-11 23:49)
 Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227) (2023-05-26 15:41)
 Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226) (2023-05-19 17:05)
 Perl mp2 翻訳 テンプレートシステムの選択 (d225) (2022-08-15 22:23)
 Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224) (2022-06-15 20:43)
 Perl mp2 翻訳 チュートリアル (d223) (2022-06-15 20:42)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

Llama
リャマ
TI-DA
てぃーだブログ
プロフィール
セラ (perlackline)
セラ (perlackline)
QRコード
QRCODE
オーナーへメッセージ

PAGE TOP ▲