Perl Perl_0
Perl 「 ファイルハンドル 」: ダイヤモンド演算子と print, printf (0x4a)

目次 - Perl Index
Theme
Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x4a 回。
Perl のファイルハンドルを、ダイヤモンド演算子「 <> 」や print文、printf 文で利用する。
ダイヤモンド <> を利用する
「 Perl 「 I/O 」: ダイヤモンド演算子 (0x3a) 」等で紹介した様に「 <> 」は起動引数 ( Invocation argument ) を読み込む演算子です。
ファイルハンドルに対して「 <> 」を使うと、起動引数の代わりに、ファイルハンドルのコネクションから行を読み込むことが出来ます。
既に何度か利用していますが、具体的には次の様に指定します。
while (<STDIN>) {
# 処理;
}
# または
@line = <STDIN>;
# 他には
foreach (<STDIN>) {
# 処理;
}
「 STDIN 」は、「 Perl 「 ファイルハンドル 」とは何か (0x41) 」、「 Perl 「 ファイルハンドル 」: STD シリーズ補足 (0x42) 」等で取り上げた、「 標準入力 」を表す特別なファイルハンドルです。
この「 STDIN 」の部分を、任意のファイルハンドルに変更することで、指定したコネクションからデータを読み込める様になります。
例えば次の様に指定します。
open FILE, '<', 'file' or die "Message: $!";
while (<FILE>) {
# 処理;
}
# または
@line = <FILE>;
# または
foreach (<FILE>) {
# 処理;
}
ちなみに、ファイルハンドルを囲むダイヤモンド「 <> 」を省いた場合は、次の様なエラーになります (use strict を指定している場合)。
Bareword "FILE" not allowed while "strict subs" in use at programfile line 10.
(裸のワード "FILE" は許可されていません "strict subs" では...)
利用する演算子、関数の書式で、明確に「 FILEHANDLE 」と書かれていれば、「 Bareword 」のファイルハンドルでも問題ありませんが、それ以外では、ダイヤモンド演算子と併用しなければいけない様です。
print 文にファイルハンドル
print 関数の書式は次の様になっています。
print FILEHANDLE LIST
print FILEHANDLE
print LIST
「 print FILEHANDEL LIST 」の形式を使えば、指定したファイルハンドルのコネクションに「 LIST 」の値を出力できます。
この書式には、「 FILEHANDLE 」とあるので、「 Bareword 」のファイルハンドルを指定して問題ありません。
open FILEOUT, '>', 'file' or die "Message: $!";
print FILEOUT "print to Filehandel\n";
「 FILEHANDEL 」の指定は、出力モードのファイルハンドルに限られます。print 関数自体が、出力のための機能を提供するからです。
仮に、入力モードのファイルハンドルを指定すると、Perl から次の様に指摘されます。
Filehandle FILEIN opened only for input
(ファイルハンドル FILEIN のオープンは input オンリーです)
最も頻繁に利用する「 print LIST 」の形式は、標準出力のファイルハンドル「 STDOUT 」を省略した形式です。
print "some words\n";
本来 (?) であれば、「 print STDOUT "some words\n"; 」となります。
「 print 」のみの形式は、暗黙のスカラ変数「 $_ 」を指定したことと同じことです。
つまり、「 print "$_"; 」です。
「 print FILEHANDLE 」の形式は、「 $_ 」の利用を前提としてファイルハンドルを指定しています。
つまり、「 print FILEHANDLE "$_"; 」です。
printf 文にファイルハンドル
printf 関数の書式は、次の様になっています。
printf FILEHANDLE FORMAT, LIST
printf FILEHANDLE
printf FORMAT, LIST
printf
考え方は、print 関数とほとんど同じです。
printf 関数の使い方は「 Perl 「 printf 」: 出力の整形 (0x3c) 」からの 4 記事を確認してください。
0x4a -> 0x4b へ
「 print "Hello, world !"; 」
「 print 」が、「 STDOUT 」を隠し持っていたという事実 !
それはまるで、はからずも暴いた旧友の秘密のごとく、ささやかな好奇心への残酷な仕打ち。
だが、「 勇気 」とは「 怖さ 」を知ることっ !
人間讃歌は「 勇気 」の讃歌 !!
「 おまえは今まで打った print の回数をおぼえているのか ? 」
参考情報は書籍「 初めての Perl 第 6 版 」を中心に 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)