Perl/入出力・コマンドラインオプション
本項では、Perlの入出力とコマンドラインオプションについて解説する。
外部ファイルに書き込みたい場合[編集]
open(han, ">" , "testperl.txt" );
print han "zzzzz";
close(han);
- (※ 2020年6月3日に Fedora32 で動作を確認ずみ。)
- 解説
まず、外部ファイルに読み書きしたい場合、組み込み関数の open関数 で目的のファイルを開きます。
(Perlにかぎらず、他の多くのプログラム言語でも、)外部ファイルにアクセスするには、読み込みをするにしても、書き込みをするにしても、まずはopenで開かないと、プログラムのコンパイラ(Perlの場合はPerlコンパイラ)からはアクセスすることが出来無い仕組みです。
ファイル書き込みをする場合、目的のファイルが無い場合には、自動的に作成されます。
- モード
open関数の第2引数で > という不等号みたいなのがありますが、これはモード指定の記号であり、書き込み専用モードを指定している意味です。
一方、もし < というふうに左向きなら、読み込み専用モードです。
- 2個式
上のコードではopen関数を3つの引数で書きましたが、下記のように2個の引数でも書けます。
open(han, "> testperl.txt" );
と、ひとつの二重引用符の中にスペースで区切って書いても構いません。
ただし、セキュリティ的な事情から、クラッカーがファイル名に > や < などの記号を入れたりして悪用する場合がありえるので、あまり望ましくないとする解釈もあります[1]。
なお、
open(han, ">>" , "testperl.txt" );
のように > を2回続けて >> と書くと、追加書き込みモードになります。
どのプログラム言語でも、ファイル入出力のモードはこの3つなのが大半のプログラム言語です。(C言語もそうです。) つまり、
- 読み込みモード
- (通常)書き込みモード
- 追加書き込みモード
の3通りのモードが、Perlを含むほとんどのプログラム言語におけるファイル入出力のモードの分類です。
そしてPerlの場合、それぞれのモードへのアクセス記号は、
モード | アクセス記号 |
---|---|
読み込みモード | < |
(通常)書き込みモード | > |
追加書き込みモード | >> |
です。
なお、openで開いたファイルは、使い終わったら close で閉じる事が出来ます。(閉じなくても、エラーにならない。 ※ Fedora 32 で確認したかぎりは、エラーにならない。)
もし close で閉じたファイルに再度アクセスしたい場合には、再度openで同様に開けばいいだけです。
- ファイルハンドル
open関数の第一引数(例ではhanの部分)は、ファイルハンドルというものです。
ひとつの外部ファイルをいくつものopen命令で開いたりする場合もあるので、区別のためにもファイルハンドルが必要になります。
Perlにかぎらず、C言語など他の多くのプログラム言語でも、若干の記法の違いこそあるものの、ファイルハンドルのようなものが存在しており(C言語ではファイルポインタにほぼ相当)、このファイルハンドルと似たような使い方です。
- 書き込み命令の方法
そして、書き込みをしたい場合、書き込みモードで開いたファイルに対し、
print ファイルハンドル名 "書き込みたい語句";
で書き込みできます。
たとえば上記コードの場合の
print han "zzzzz";
なら、ファイルtestperl.txt に「zzzzz」と書き込まれます。
実際にコマンド端末で上記コード例を実行して試してみましょう。たしかにファイルに書き込まれているハズです。
このような出力先を指定する方法でprint関数で外部ファイルに書き込みする方法は、Perlに特有の方法です。(C言語では、違う方法です。)
標準出力[編集]
たとえば、
- コード例
print STDOUT "qqq\n";
- (※ 2020年6月3日に Fedora32 で動作を確認ずみ。)
をコマンド端末で実行すると、単に「qqq」と表示されます。(行末の \n は改行のエスケープシーケンス)
STDOUT とは、標準出力というもので、一般的にはコマンド端末画面のことです。
小文字で stdout と書いても構いません。(動作することを確認ずみ)
print関数はこのように出力先を指定できる機能があります。特に出力先を指定しない場合には、printの出力先は標準出力になるので、今までの単元では気にすることなく print "文字列" のように利用できたわけです。
ファイルハンドル[編集]
Perlには、次に挙げる特殊なファイルハンドルが組み込まれている。
- STDIN
- 標準入力を表す。
- STDOUT
- 標準出力を表す。
- STDERR
- 標準エラー出力を表す。
- DATA
- __END__以降を表す。
ファイルハンドルから一行ずつ読み込むには、山カッコ演算子を用いる。
while (<STDIN>) { print; }
これは次のコードと等価である。
while (defined($_ = readline *STDIN)) { print $_; }
空のファイルハンドルを指定すると標準入力から読み込む。ただし、コマンドライン引数がある場合はそれをファイル名として解釈し、ファイルの内容を標準入力にパイプした上で、標準入力から読み込む。
while (<>) { print; }
ファイルハンドルに対して出力するには、print()の間接ファイルハンドル記法を用いる。
print STDOUT "Hello, world!\n";
ローカルファイルはopen()を呼び出してファイルハンドルに関連付けて操作する。
open my $fh, '<', 'hoge.txt' or die $!; my $line = <$fh>; close $fh;
コマンドラインオプション[編集]
コマンドライン引数は、@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;
- ^ 深沢千尋『かんたんPerl』、技術評論社、2016年2月25日 初版 第1刷 発行、351ページ