Perl/入出力・コマンドラインオプション
< Perl
本項では、Perlの入出力とコマンドラインオプションについて解説します。
外部ファイルに書き込みたい場合
編集open(my $handle, ">" , "testperl.txt") or die; print $handle "zzzzz";
- 解説
- まず、外部ファイルに読み書きしたい場合、組み込み関数の open関数 で目的のファイルを開きます。
- ファイルは、open することで、読み出し・書き込み・追加が可能になります。
open(某) or die
は、Perlの慣用句で「開けるか死ぬか」程度の意味に読めます。- モード
- open関数の第2引数はモードです。
<
- 読出しモード
>
- 書込みモード
>>
- 追加書込みモード
- の3つがあります。
- 2引数呼出し
- 上のコードではopen関数を3つの引数で書きましたが、下記のように2個の引数でも書けます。
open($handle, "> testperl.txt" );
- と、ひとつの二重引用符の中にスペースで区切って書いても構いません。
- クローズ
- openで開いたファイルは、全ての操作が終わったら close 関数で閉じるます。
- 閉じ忘れるても、スクリプト終了時にインタープリターにより自動的に閉じられますが、明示的に閉じるとその時点でランタイムやオペレーションシステムのクローズ処理がはじまります。
- クローズはファイルハンドルを保持する変数がスコープを抜けたとき、より正確に言うとファイルハンドルへの参照がなくなったときに行なわれます。
- このためファイルハンドルは、my 宣言したレキシカルスコープの変数に保持するのが望ましいでしょう。
- ファイルハンドル
- open関数の第一引数(例では$handleの部分)は、ファイルハンドルです。
- 複数の入出力先を区別のためにファイルハンドルが必要になります。
- Perlにかぎらず、C言語など他の多くのプログラム言語でも、若干の記法の違いこそあるものの、ファイルハンドルのようなものが存在しており(CではファイルディスクリプタやFILE型へのポインタにほぼ相当)、このファイルハンドルと似たような使い方です。
- 書き込み命令の方法
- そして、書き込みをしたい場合、書き込みモードで開いたファイルに対し、
print ファイルハンドル名 "書き込みたい語句";
- で書き込みできます。
- たとえば上記コードの場合の
print $handle "zzzzz";
- なら、ファイルtestperl.txt に「zzzzz」と書き込まれます。
- 実際にコマンド端末で上記コード例を実行して試してみましょう。たしかにファイルに書き込まれているハズです。
- このような出力先を指定する方法でprint関数で外部ファイルに書き込みする方法は、Perlに特有の方法です。(C言語では、違う方法です。)
標準出力
編集たとえば、
- コード例
print STDOUT "qqq\n";
- をコマンド端末で実行すると、単に「qqq」と表示されます。(行末の \n は改行のエスケープシーケンス)
- STDOUT は、標準出力で、一般的にはコマンド端末画面のことです。
- print関数はこのように出力先を指定する機能があります。特に出力先を指定しない場合には、printの出力先は標準出力になるので、今までの単元では気にすることなく print "文字列" のように利用できたわけです。
ファイルハンドル
編集Perlには、次に挙げる特殊なファイルハンドルが組み込まれています。
- STDIN
- 標準入力を表します。
- STDOUT
- 標準出力を表します。
- STDERR
- 標準エラー出力を表します。
- DATA
- __END__以降を表します。
ファイルハンドルから一行ずつ読み込むには、< >
演算子を用います。
while (<STDIN>) { print; }
- これは次のコードと等価です。
while (defined($_ = readline *STDIN)) { print $_; }
- あるいは
print while <>;
- 空のファイルハンドルを指定すると標準入力から読み込みます。
- ただし、コマンドライン引数がある場合はそれをファイル名として解釈し、ファイルの内容を標準入力にパイプした上で、標準入力から読み込みます。
while (<>) { print; }
ファイルハンドルに対して出力するには、print()の間接ファイルハンドル記法を用います。
print STDOUT "Hello, world!\n";
ローカルファイルはopen()を呼び出してファイルハンドルに関連付けて操作します。
open my $fh, '<', '/etc/hosts' or die $!; print while <$fh>; close $fh;
グローバルスコープのスカラ変数でファイル名を与え、同名のファイルハンドルでファイルをオープンできます。
$FH = "/etc/hosts"; open FH; print while <FH>; close FH;
- 推奨できる書き方ではありませんが、過去に書かれたコードにこのパターンがある可能性はあるので、一つしか引数を取らないopen関数を見かけたら思い出してください。
コマンドラインオプション
編集コマンドライン引数は、@ARGVという特殊な配列に代入されます。サブルーチンの外で空引数のshift()を呼び出すと、shift(@ARGV)と解釈されます。
my $arg = shift; print "第一引数は $arg です。";
特殊変数$/
編集特殊変数$/を指定すると入力レコードレパレータを変更することができます(デフォルトは\n)。次の例では、「hoge.txt」から一行ずつではなくすべての内容を一度に読み出す。
open my $fh, '<', 'hoge.txt' or die $!; my $content = do { local $/; <$fh> }; close $fh;