Perl/入出力・コマンドラインオプション

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動
プログラミング > 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/入出力・コマンドラインオプション」は、まだ書きかけです。加筆・訂正など、協力いただける皆様の編集を心からお待ちしております。また、ご意見などがありましたら、お気軽にトークページへどうぞ。
  1. ^ 深沢千尋『かんたんPerl』、技術評論社、2016年2月25日 初版 第1刷 発行、351ページ