第8章のサンプルコード
---------------------
目次（ページ番号）
■P176-1
■P176-2
■P177
■P179-1
■P179-2
■P180-1
■P180-2
■P184
■P185-1
■P185-6
■P186
■P187
■P191-1
■P191-2
■P192
■P194
■P195-1
■P195-2
---------------------

■P176-1
# ファイルをオープンし、その内容を表示する
#  open.pl

# ファイルをオープンする
open(F, "test.txt") || die "test.txt をオープンできません:$!\n";
while (<F>) {
  # 内容を表示
  print;
}

# ファイルのクローズ
close(F);

■P176-2
# 出力ファイルに文字列を書き出す
#  write.pl

# 新規出力ファイルとしてオープン
open(F, ">output.txt") || 
  die "output.txt を作成できません:$!\n";

# 文字列をファイルハンドルFに書き出し
print F "こんにちは、太郎さん。\n";

close(F);

■P177
# 追加出力ファイルに文字列を書き出す
#  append.pl

# 追加出力ファイルとしてオープン
open(F, ">>output.txt") || 
  die "output.txt に追加できません:$!\n";

# 文字列をファイルハンドルFに書き出し
print F "こんばんは、花子さん。\n";

close(F);

■P179-1
# 入力をそのままエコーする
#  echo.pl

do {
  # 標準入力から取り込む
  $string = <STDIN>;
  # 表示する
  print $string;
  # QUITを含む文字列が入ると終了する
} until ($string =~ /QUIT/);

■P179-2
# 標準出力と標準エラー出力の違い
#  std.pl

# 標準出力
print STDOUT "標準出力に出力しています。\n";

# 標準エラー出力
print STDERR "標準エラー出力に出力しています。\n";

■P180-1
# 標準入力とファイルの双方を受けるスクリプト
#  which.pl

# 標準入力、ファイルのどちらかを取得
while (<>) {
  # 内容を表示
  print;
}

■P180-2
# 引数を表示
#  argv.pl

# 引数の数を表示
print "ARGVの数:" . @ARGV . "\n";

# 各引数の内容を表示
for ($number = 0; $number < @ARGV; $number++) {
  print "引数$number: $ARGV[$number]\n";
}

■P184
# ファイル名の変更
#  rename.pl

print "変更前のファイル名: ";
$from_file = <STDIN>;
print "変更後のファイル名: ";
$to_file = <STDIN>;

chomp($from_file, $to_file);

# 名前の変更
rename($from_file, $to_file) || 
  die "$from_file から $to_file に名前変更できません:$!\n";

■P185-1
# 指定したファイルを削除する
#  unlink.pl

$file = <STDIN>;
chomp($file);
unlink($file) || die "$file を削除できません:$!\n";

■P185-6
# ファイルのテスト
#  filetest.pl

if (@ARGV > 0) {
  # 最初の引数をファイル名と見なす
  print "$ARGV[0] は通常のファイルです。\n" if (-e $ARGV[0]);
  print "$ARGV[0] はディレクトリです。\n" if (-d $ARGV[0]);
  print "$ARGV[0] はシンボリックリンクです。\n" if (-l $ARGV[0]);
  print "$ARGV[0] はあなたが所有者です。\n" if (-o $ARGV[0]);
  print "$ARGV[0] は名前付きパイプです。\n" if (-p $ARGV[0]);
  print "$ARGV[0] は読み込めます。\n" if (-r $ARGV[0]);
  print "$ARGV[0] は書き出せます。\n" if (-w $ARGV[0]);
  print "$ARGV[0] は実行できます。\n" if (-x $ARGV[0]);
  print "$ARGV[0] はバイナリファイルです。\n" if (-B $ARGV[0]);
  print "$ARGV[0] はテキストファイルです。\n" if (-T $ARGV[0]);
  print "$ARGV[0] はソケットファイルです。\n" if (-S $ARGV[0]);
} else {
  print "ファイル名を指定してください。\n";
}

■P186
# ファイル権限の変更
#  chmod.pl

print "ファイル名を指定してください: ";
$file = <STDIN>;
chomp($file);

# 初期状態を表示
print "初期状態\n";
&fileinfo( );

print "権限値を 100 にします。\n";
chmod(0100, $file);
&fileinfo( );

print "権限値を 200 にします。\n";
chmod(0200, $file);
&fileinfo( );

print "権限値を 400 にします。\n";
chmod(0400, $file);
&fileinfo( );

print "権限値を 600 にします。\n";
chmod(0600, $file);
&fileinfo( );

print "権限値を 700 にします。\n";
chmod(0700, $file);
&fileinfo( );

sub fileinfo {
  # ファイルの情報を表示
  print "\t$file は読み込めます。\n" if (-r $file);
  print "\t$file は書き込めます。\n" if (-w $file);
  print "\t$file は実行できます。\n" if (-x $file);
}

■P187
# ファイルの詳細な情報を表示する
#  stat.pl

print "ファイル名を指定してください: ";
$file = <STDIN>;
chomp($file);

# statで情報を取得
($device, $inode, $mode, $nlink, $userid, $groupid, $rdev, 
 $size,$accesstime, $modifytime, $changetime, $blocksize, 
 $blockcount)
  = stat($file);

# 各情報を表示
printf( "デバイス:		%d\n" .
        "i-node:		%d\n" .
        "権限値:		%o\n" .
        "リンク:		%d\n" .
        "ユーザーID:	%d\n" .
        "グループID:	%d\n" .
        "デバイス識別子:	%d\n" .
        "サイズ:	%d\n" .
        "アクセス時間:	%d\n" .
        "更新時間:		%d\n" .
        "i-node変更時間:	%d\n" .
        "ブロックサイズ:	%d\n" .
        "ブロック数:		%d\n",
        $device, $inode, $mode, $nlink, $userid, $groupid, 
        $rdev, $size,$accesstime, $modifytime, $changetime, 
        $blocksize, $blockcount);

■P191-1
# 指定したディレクトリを作成
#  mkdir.pl

print "作成するディレクトリ名を指定してください: ";
$directory = <STDIN>;
chomp($directory);

if (!-d $directory) {
  # ディレクトリがまだない
  # ディレクトリを作成
  mkdir($directory, 0755) || 
    die "$directory を作成できません:$!\n";
} else {
  # すでに存在
  print "$directory はすでに存在します。\n";
}

■P191-2
# ディレクトリの削除
#  rmdir.pl

print "削除するディレクトリ名を指定してください: ";
$directory = <STDIN>;
chomp($directory);

if (-d $directory) {
  # ディレクトリがすでにある
  # ディレクトリを削除
  rmdir($directory) || die "$directory を削除できません:$!\n";
} else {
  # ディレクトリがないかディレクトリではない
  print "$directory は存在しません。または、ディレクトリではありません。\n";
}

■P192
# ディレクトリの内容を読み込み表示する
#  readdir.pl

# 現在のディレクトリをオープンする
opendir(DIR, ".") || die ". をオープンできません:$!\n";

# 配列に読み込む
@files = readdir(DIR);

# クローズする
closedir(DIR);

# 表示
foreach (@files) {
  print "$_\n";
}

■P194
# shell関数による実行
#  shell.pl

# ls を実行
system("ls");

■P195-1
# exec関数による実行
#  exec.pl

# ls を実行
exec("ls");
print "エラーが発生しました。:$!\n";

■P195-2
# forkを使って2つの処理を作る
#  fork.pl

if ($pid = fork( )) {
  # 親プロセス
  for ($i = 1; $i <= 3; $i++) {
    print "親プロセス\n";
    sleep(3);
  }
  waitpid($pid, 0);
}
elsif (defined $pid) {
  # 子プロセス
  for ($i = 1; $i <= 5; $i++) {
    print "子プロセス\n";
    sleep(1);
  }
} else {
  die "forkできません: $!\n";
}

