Perl Perl_0
Perl 「 ファイルハンドル 」: STD シリーズ補足 (0x42)
目次 - Perl Index
Theme
Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x42 回。
Perl の特別なファイルハンドル「 STD シリーズ 」(STDIN, STDOUT, STDERR) についての補足。
STDIN の補足
標準入力ストリーム ( STanDard INput stream ) を意味する「 STDIN 」は、通常ユーザのキーボードを入力元に設定されていますが、Unix のシェルの機能を使えば、簡単に入力元を変更出来ます。
Unix のシェルの力を借りてコネクションを操作出来るのは「 STDOUT 」と「 STDERR 」も同じです。
なぜなら、これらの標準設定が、元々システム ( Unix の標準 I/O ライブラリ : 近代的のほとんどのオペレーティングシステムもこれに準じている ) に由来するからです。
「 STDIN 」の場合は次の様にして入力元を変更することが出来ます。
次の例では、Perl プログラム「 program 」を実行する際に、「 < 」を使ったリダイレクトによって、ファイル「 inputfile 」を入力ソースにしています。
これにより、プログラム内で「 STDIN 」を指定した文では、「 inputfile 」の内容が読み込まれます。
$ ./program < inputfile
Perl プログラム「 program 」が、次の様なコードだった場合は、ファイル「 inputfile 」の内容を 1 行ずつ標準出力へ出力します。
while (<STDIN>) {
print $_;
}
ちなみに、上の例と次の例は同じ動きをします。
while (<>) {
print;
}
「 | 」( パイプ ) を使った値の受け渡しにも対応しています。
$ cat inputfile | ./program
この例では、コマンド cat の出力を Perl プログラムにパイプで渡しています。その結果は先のリダイレクトを使った場合と同じものになります。
STDOUT と STDERR の補足
「 STDOUT 」は、標準出力ストリーム ( STanDard OUTput ) を意味します。これは通常あなたのディスプレイを指し示します。
「 STDERR 」は、標準エラー出力ストリーム ( STnDard ERRor ) を意味します。これも通常はあなたのディスプレイを指し示していますが、それはエラーにまつわる情報を出力します。
「 STDOUT 」で、例えば次の様にした場合は、Perl プログラム「 program 」の出力をファイル「 outputfile 」に書き込むことが出来ます。
「 > 」を「 >> 」に代えれば、上書きせずに追加で書き込むことも出来ます。
$ ./program > outputfile
「 program 」の中身は例えばこんな感じです。
print "Hello, STDOUT\n";
これで、「 outputfile 」には改行付きの文字列「 Hello, STDOUT 」が書き込まれます。
「 STDIN 」と違い、コードの中には「 STDOUT 」の文字がありません。なぜなら、print 文自体が「 STDOUT 」とのコネクションを持っているからです。
「 STDERR 」の動作も確認しましょう。
基本的には「 STDOUT 」と同じですが、その中身はエラーです。
例えば、次の様なコードを書いて実行すると「 Use of uninitialized value in print at program line n. 」と言ったエラーが表示されます。
print;
これを次の様にして実行してみましょう。
ここでは、手元のシェルが「 tcsh 」なので「 >& 」というリダイレクトにしています。「 bash 」の系統を使っている場合は「 2> 」を使ってください。
$ ./program >& outputfile
ファイル「 outputfile 」には、「 Use of uninitialized value in print at program line n. 」が書き込まれます。
0x42 -> 0x43 へ
今回は、Unix 系のオペレーションシステムでお馴染みの「 シェル 」( Shell ) に関する内容がいくつか出てきました。
「 シェル 」はいわゆる「 コマンドラインインターフェイス 」( Command Line Interface ) というやつです。
「 Perl コメントアウトと #! (0x0a) 」で少し紹介しましたが、一口に「 シェル 」と言っても複数種類があります。
僕は、レンタルサーバ Drive Network のシステム ( Free BSD ) 上で勉強しているので、このサービスが標準で提供している「 tcsh ( (TENEX | TOPS-20) C Shell ) 」をもっぱら利用しています。
各種シェルは多くの共通点を持ちますが、多くの相違点もありますので、それぞれの流儀にしたがって、好みのシェルを使っている様です。
参考情報は書籍「 初めての 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)