Location : Home > Languages > Perl > Instruction Title : Input/Output |
![]() |
Input/Output
標準入力からの入力
標準入力から入力する場合は以下のように記述する。
$a = <STDIN>;
これにより、入力から1行(改行文字または同等に定義された文字列まで)を読み込む。
よく行われるのが、「入力の全ての行を読み込んで、その各行に対し処理を行う」というものである。これは次のように記述することができる。
while ($_ = <STDIN>){
statement1;
statement2;
}
行が正しく読み込まれている限り <STDIN> は真であるので、処理を継続し、全ての行が読み終わるか読み込み時にエラーが出るかという状態では undef を返しループから出ることになる。なお、$_ = は省略することもできる。
標準出力への出力
標準出力へ出力する場合は、print または printf を用いて処理を行う。
$a = print ("Hello World!");
これにより、標準出力に Hello World! と表示される。$a には正しく処理された場合には true値 1 が失敗時には 0 が格納される。
きめ細かく書式を設定したい場合には printf を用いる。
$a = 3.14159;
$b = 2.23606;
printf("%10.2f + %10.2f = %10.2f", $a, $b, $a + $b );
上式に対しては指定された書式にしたがって 3.14 + 2.23 = 5.37 と出力される。フォーマット指定子は以下の通り。
指定子 | 説明 |
%c | 文字(Character) |
%d | 10進数(Deximal) |
%e | 浮動少数(指数形式;Exponential) |
%E | 浮動少数(大文字のEを使った指数形式) |
%f | 浮動小数(固定小数点形式;Floating) |
%g | 浮動小数(浮動少数または指数形式のうち、短く表現できる方) |
%G | %g の指数表示をEにしたもの |
%ld | 倍精度10進数(Long) |
%lo | 倍精度8進数 |
%lu | 倍精度符号なし10進数 |
%lx | 倍精度16進数 |
%n | すでに出力した文字数を次の変数に格納 |
%o | 8進数(Octal) |
%p | ポインタ(16進数でのアドレス) |
%s | 文字列(String) |
%u | 符号なし10進数(Unsigned) |
%x | 符号なし16進数(heXadecimal) |
%X | %x と同じ |
ファイルハンドル
Perl と外部との入出力について、Perl の側から命名したもの。名称が「ファイル」ハンドルだからと言って、対象がファイルであるとは限らない。ファイル/デバイス/ソケット/パイプに名前をつけることができる。Perl の親分である Larry はファイルハンドルについては大文字だけを使うことを推奨している。
デフォルトで実装されているファイルハンドル
Perl には次の3つのファイルハンドルが実装されている。
ファイルハンドル | 意味 |
STDIN | Perlプログラムとそれが稼動するシステムの標準入力 |
STDOUT | Perlプログラムとそれが稼動するシステムの標準出力 |
STDERR | 標準エラー出力 |
ファイルハンドルのオープン/クローズ
ファイルハンドルを定義/開く際には以下のように宣言する。
open(FILEHANDLE, "hogehoge")
いったん、上のように定義したあとは、<FILEHANDLE> で "hogehoge"内で指定したファイルとかデバイスとかを利用することができる。ただ、その利用の仕方によって以下のような定義が可能である。
Code | 意味 |
open(SESAMI, "file") | 既存のファイルから読み込む |
open(SESAMI, "<file") | 同上 |
open(SESAMI, ">file") | ファイルを新規作成してファイルに書き出す |
open(SESAMI, ">>file") | 既存のファイルに追加して書き出す |
ファイルハンドルを閉じる際には close() を用い以下のように宣言する。
close(FILEHANDLE)
ファイルテスト演算子
演算子に関しては一括して扱うつもりだったのだが、ここ以外の場所で書くと意味がわかりにくくなるのでここで説明。
上記のようにファイルハンドルを使うといちいちファイル名を記述しなくてもファイルの開閉ができるが、このままでは入力時にファイルオープンに失敗したのに処理を続けようとしたり、出力時にファイルを改変したり上書きしたりしてしまう危険を排除できない。そこで、ファイルの存在や処理の可否などを判断する機能が付与されている。これを行う演算子をファイルテスト演算子(file test operator)と言う。以下のようなものが準備されている。
演算子 | 意味 |
-r | 読み込み可能 |
-w | 書き込み可能 |
-x | 実行可能 |
-o | 実行者とファイルの所有者が同一 |
-R | 実ユーザで読み込み可能 |
-W | 実ユーザで書き込み可能 |
-X | 実ユーザで実行可能 |
-O | 実ユーザとファイルの所有者が同一 |
-e | ファイルが存在する |
-z | ファイルが存在しているが、ファイルサイズが 0 |
-s | ファイルが存在しているが、ファイルサイズが 0 以外(大きさを返す) |
-f | ファイルは通常ファイル |
-d | ファイルはディレクトリ |
-l | ファイルはシンボリックリンク |
-p | ファイルは名前付きパイプ |
-S | ファイルはソケット |
-b | ファイルはブロック特殊デバイス |
-c | ファイルはキャラクタ特殊デバイス |
-t | ファイルハンドルが tty としてオープンされている |
-u | ファイルの setuid ビットがセットされている |
-g | ファイルの setgif ビットがセットされている |
-k | ファイルの sticky ビットがセットされている |
-T | ファイルがテキストファイル |
-B | ファイルがバイナリファイル |
-M | ファイルの最終更新時刻からの日数 |
-A | ファイルの最終アクセス時刻からの日数 |
-C | ファイルの作成時刻からの日数 |
たとえばファイルが存在していることを確認して処理を行うためには以下のように記述する。
$p = "/etc/hogehoge";
if ( -e $p){
statement1;
} else {
statement2;
}
![]() |
Updated : 2007/03/14 |