第6章のサンプルコード
---------------------
目次（ページ番号）
■P116
■P117
■P118
■P119-1
■P119-2
■P120-1
■P120-2
■P121
■P125-1
■P125-2
■P125-3
■P126-1
■P126-2
■P128
■P130
■P133
■P134-1
■P134-2
■P135-1
■P135-2
---------------------

■P116
# print関数の実験
#  print.pl

$_ = "こんにちは。\n";

# 特殊変数$_を表示
print;

# ファイルprint.txtをオープン
open(F, ">print.txt");

# 特殊変数$_を、ファイルハンドルFに定義付けられているファイルprint.txtに書き出す
print F;
close(F);

# リストを表示
print ("私", "は", "太郎", "です。\n");

@list = ("あなた", "は", "花子", "さん", "ですか。\n");

# 配列を表示
print @list;

■P117
# printfとsprintfのテスト
#  printf.pl

# 文字列
printf("文字列:\t%s\n", "私は太郎です。");

# 整数
printf("整数:\t%08d\n", 1234);

# 整数*
printf("整数*:\t%0*d\n", 6, 1234);

# 浮動小数点値
printf("浮動小数点値:\t%.2f\n", 12.3456);

# 8進数、16進数
$buffer = sprintf("8進数:\t%#o\n16進数:\t%#x\n", 123, 123);
print $buffer;

■P118
# splitを使って入力文字列を分割する
#  split.pl

print "文字列を入力してください: ";
$string = <STDIN>;
chomp($string);

# スペース文字で区切る
@words = split(/\s+/, $string);
foreach (@words) {
  # 各要素を表示
  print "単語: $_\n";
}

■P119-1
# splitを使って入力文字列を2つに分割する
#  split2.pl

print "文字列を入力してください: ";
$string = <STDIN>;
chomp($string);

# スペース文字で2つに区切る
($pre, $post) = split(/\s+/, $string, 2);

# スペース文字の前後の文字列を表示
print "最初の文字列: $pre\n";
print "後の文字列  : $post\n";

■P119-2
# joinを使って配列の要素を合成する
#  join.pl

print "文字列を入力してください: ";
$string = <STDIN>;
chomp($string);

# スペース文字で区切る
@words = split(/\s+/, $string);

# 各要素の間に,を入れて表示
print join(",", @words), "\n";

■P120-1
# chopとchompの比較
#  chop_chomp.pl

$string1 = "Perl\n";
$string2 = $string1;

# chopとchompをそれぞれ2回実行する
chop($string1);
chop($string1);
chomp($string2);
chomp($string2);

# 表示
print "chop:  $string1\n";
print "chomp: $string2\n";

■P120-2
# lengthのテスト
#  length.pl

print "文字列を入力してください: ";
$string = <STDIN>;
chomp($string);

# 長さを調べる
print "文字列の長さ: ", length($string), "\n";

■P121
# lengthのテスト (encodingによる日本語対応)
#  jlength.pl

# Shift_JISとしてencodingモジュールを登録
# (Unix環境では use encoding "euc-jp";)
use encoding "Shift_JIS";

print "文字列を入力してください: ";
$string = <STDIN>;
chomp($string);

# 長さを調べる
print "文字列の長さ: ", length($string), "\n";

■P125-1
# タンジェントを求める
#  tan.pl

print "ラジアン値を入力: ";
$radian = <STDIN>;
chomp($radian);

# タンジェントを計算
print ("タンジェント: ", (sin($radian) / cos($radian)), "\n");

■P125-2
# 平方根を求める
#  sqrt.pl

print "数値を入力してください: ";
$number = <STDIN>;
chomp($number);

print "平方根: ", sqrt($number), "\n";

■P125-3
# intの効果をテストする
#  int.pl

# intなし
print "intなし: ", (13 / 6), "\n";

# intあり
print "intあり: ", int(13 / 6), "\n";

■P126-1
# 乱数を生成
#  rand.pl

print "数値を入力してください: ";
$number = <STDIN>;
chomp($number);

# 乱数を表示
print rand($number), "\n";

■P126-2
# expとlogのテスト
#  exp_log.pl

print "e: ", exp(1), "\n";
print "log e 100: ", log(100), "\n";

■P128
# 時間情報を取得し、表示
#  time.pl

# グリニッジ標準時で取得
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime( );

# 整形して表示
printf("グリニッジ時間:\t%s/%s/%s %s %02d:%02d:%02d\n", 
  $year + 1900, ++$mon, $mday,
	("日", "月", "火", "水", "木", "金", "土")[$wday],
	$hour, $min, $sec);

printf("\t夏時間:%s\n", $isdst ? "あり" : "なし");
printf("\t年始からの日数: %s 日\n", $yday);

# 地方時で取得
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime( );

# 整形して表示
printf("地方時間:\t%s/%s/%s %s %02d:%02d:%02d\n", 
  $year + 1900, ++$mon, $mday,
	("日", "月", "火", "水", "木", "金", "土")[$wday],
	$hour, $min, $sec);

printf("\t夏時間:%s\n", $isdst ? "あり" : "なし");
printf("\t年始からの日数: %s 日\n", $yday);

■P130
# 入力された年月日に基づき、1970年1月1日からの経過日数を求める
#  countday.pl

use Time::Local;

# 年月日を取得
print "年月日を入力 (YYYY/MM/DD): ";
$string = <STDIN>;
chomp($string);
($year, $month, $day) = split(/\//, $string);

print "1970年1月1日からの日数: ", (timegm(0, 0, 0, $day, 
  $month - 1, $year - 1900) / (60 * 60 * 24)), "日\n";

■P133
# 0除算をevalで捕捉する
#  eval.pl

# evalで命令を実行する
eval("\$value = 2 / 0");

# エラーがあるときは表示
print "エラーが発生しました: $@" if ($@);

■P134-1
# スペース文字で区切った数値リストを整列する
#  sort.pl

print "要素をスペース文字で区切った数値のリストを入力してください: ";
$numbers = <STDIN>;
chomp($numbers);

# ソートして表示
print join(", ", sort { $a <=> $b } (split(/\s+/, 
  $numbers))), "\n";

■P134-2
# スペース文字で区切った数値リストを逆順に整列する
#  sort_reverse.pl

print "要素をスペース文字で区切った数値のリストを入力してください: ";
$numbers = <STDIN>;
chomp($numbers);

# ソートして表示
print join(", ", reverse(sort { $a <=> $b } (split(/\s+/, 
  $numbers)))), "\n";

■P135-1
# packとunpackのテスト
#  pack_unpack.pl

print "文字列を入力してください: ";
$string = <STDIN>;
chomp($string);
$length = length($string);

print "数値を入力してください: ";
$number = <STDIN>;
chomp($number);

# パックする
$packed = pack("A${length}i", $string, $number);
print "パック文字列: $packed\n";

# アンパックする
($string2, $number2) = unpack("A${length}i", $packed);
print "元の文字列: $string2 元の数値: $number2\n";

■P135-2
# カウントダウン
#  sleep.pl

for ($i = 10; $i > 0; $i--) {
  print "$i.\n";
  sleep(1);
}
