perl 追加書き出し

#output.txtを追加書き出し用としてオープンし文字列を追加する

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

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

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

close(F);

#実行結果
# こんにちは、太郎さん。
# こんばんは、花子さん

初めてのPerl 第6版

初めてのPerl 第6版

perl 文字列の書き出し

#output.txtを書き出し用としてオープンし、文字列を書き出す

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

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

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

close(F);


#実行結果
# $cat output.txt
# こんにちは、太郎さん。

初めてのPerl 第6版

初めてのPerl 第6版

perl ファイルのオープンとクローズ

オープンするためのファイルを作成しておく

てすとてきすと
テストテキスト
test.txt

ファイルをオープンして内容を表示するスクリプト

#ファイルtest.txtを読み込み専用でオープンした後、その内容を画面に表示してからクローズする。

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

#ファイルをオープンする
open(F, "test.txt") || die "test.txtをオープンできません:$!\n";

#ファイルハンドルに対応するファイルの内容が1行ずつ読みこまれて特殊変数$_に入り中身が実行される。
while(<F>){
    #内容を表示
    print;
}

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


#実行結果
#てすとてきすと
#テストテキスト
#test.txt

初めてのPerl 第6版

初めてのPerl 第6版

perl utf8モジュール

#utf8モジュールを使って、UTF-8文字エンコーディングで日本語変数名を指定する。

#UTF-8の変数名を使う
# utf8_consumption_duty.pl

#モジュール呼び出し
use utf8;

$消費税率 = 0.08;

print "subtotal: ";

$小計金額 = <STDIN>;
chomp($小計金額);

$消費税額 = $小計金額 * $消費税率;

$合計金額 = $小計金額 + $消費税額;

print "tax: ${消費税額} yen\n";
print "total amount: ${合計金額} yen\n";


#このスクリプトがUTF-8で保存されていれば変数名に日本語を使っていても実
#行時にエラーは起きない。変数名の範囲を明示するために{}で囲んでいる。

#実行結果
# subtotal: 10000
# tax: 800 yen
# total amount: 10800 yen

初めてのPerl 第6版

初めてのPerl 第6版

perl Benchmarkモジュール

#オブジェクト指向モジュールの一つBenchmarkを使ってベンチマークのテストを行う

#ベンチマーク
#benchmark.pl

#モジュール呼び出し
use Benchmark;

#1つ目のベンチマークオブジェクト
$before_time = new Benchmark;

#500000カウントの計算
&recursive(50000);

#2つ目のベンチマークオブジェクト
$after_time = new Benchmark;

#2つのベンチマークから結果を求める
$diff = timediff($after_time, $before_time);

#表示
print "結果:", timestr($diff), "\n";

#時間を計測するための再帰呼び出し
sub recursive{
    my($number) = @_;

    #1つずつカウンタを減らして0になるまで再帰呼び出しを行う
    &recursive(--$number) if ($number);
}

#$before_timeと$after_timeという2つのオブジェクトをBenchmarkクラスから
#生成している。それぞれのオブジェクトは挙動や変数の管理が独立しており、
#相互に干渉しない。次に、timediff(2つのBenchmarkオブジェクトの間の時間
#の差を返すサブルーチン)とtimestr(timediffサブルーチンの戻り値オブジェ
#クトを文字列に変換するサブルーチン)という2つのサブルーチンを使ってお
#互いのオブジェクトを比較し表示する。

#実行結果
# 結果: 1 wallclock secs ( 0.03 usr +  0.01 sys =  0.04 CPU)

初めてのPerl 第6版

初めてのPerl 第6版

perl copyモジュール

#File::Copyを使ってファイルをコピー
#copy.pl

#モジュール呼び出し
#File::Copyモジュールを呼び出す
use File::Copy;

#引数が二つ以上の時はusageサブルーチンを呼び出してコピー命令の使い方を表示する。
if(@ARGV != 2){
    #引数が2つ以上の時には使い方を表示
    &usage();
}

#モジュールのルーチン実行
#引数をたd如く2つ指定した場合はcopyサブルーチンを実行する。
#エラーの判定には$!にエラー原因が入る(特殊な変数)
copy($ARGV[0], $ARGV[1]);

print "コピー中にエラーが発生しました($!)。\n" if($!);

#使い方を表示
#使い方を表示した後exit関数によってスクリプトを終了する。
sub usage{
    print <<EOT
copy.pl:ファイルのコピー

copy.pl コピー元ファイル名 コピー先ファイル名
EOT
        ;
    exit(1);
}


#コマンドラインにperl copy.pl test.txt xxx.txt
# と入力してスクリプトを実行すると現在のディレクトリにあるファイルtet.txtがxxx.txtにコピーされる。

初めてのPerl 第6版

初めてのPerl 第6版

perl パッケージ

helloという名前のパッケージを定義する

#パッケージ化したhelloモジュール
# hello_package.pm

# helloという名前でパッケージを定義
package hello;

#このサブルーチンはhello::helloとして呼び出す
sub hello{
    my($name) = @_;
    print "こんにちは、$nameさん。\n";
}

1;

これを次のスクリプトで呼び出す。

# hello_packageを呼び出す
# hello_package_call.pl

#パッケージ呼び出し
use hello_package;

#パッケージ名をつけずに呼び出し
#hello_package_call.pl内にあるhelloサブルーチンが呼び出される
&hello("太郎");

#パッケージ名をつけて呼び出し
#hello_package.pmのhelloサブルーチンが呼び出される
&hello::hello("太郎");

#同名のサブルーチンを定義
sub hello{
    my($name) = @_;
    print "さようなら、$nameさん。\n";
}


#実行結果
# さようなら、太郎さん。
# こんにちは、太郎さん。

初めてのPerl 第6版

初めてのPerl 第6版

perl モジュール

#BEGINとENDのテスト
#begin_end.pm

#BEGINルーチン
BEGIN{
    print "モジュールを開始しました。\n";
}

#ENDルーチン
END{
    print "モジュールを終了しました。\n";
}

1;

モジュールを読み込むスクリプト

#begin_endモジュールを読み込む
#begin_end_call.pl

print "モジュール呼び出し前\n";

#モジュール呼び出し
use begin_end;
print "メインルーチンの終了\n";


#実行結果
# モジュールを開始しました。
# モジュール呼び出し前
# メインルーチンの終了
# モジュールを終了しました。

初めてのPerl 第6版

初めてのPerl 第6版

perl 設定ファイルを読み込む

設定ファイルをを作成する

#設定ファイル
#config

$name = "太郎";
1;

この設定ファイルを読み込む

#設定ファイルを読み込むスクリプト
# config_load.pl

#初期値
$name = "匿名";

#ファイルの存在チェック
if(-r "config"){
    require("config");
}

print "こんにちは、$nameさん。\n";

#ファイルテスト演算子-rを使ってconfigというライブラリファイルの存在をチェックしている。configというファイルが存在しており、読み込みが可能であればrequireによってその内容を読み込んでいる。

もしconfigファイルが存在しなければスクリプト内で設定した変数の初期値が使われ「こんにちは、匿名さん。」と表示される。

#実行結果
# こんにちは、太郎さん。

初めてのPerl 第6版

初めてのPerl 第6版

perl ライブラリとモジュール

ライブラリファイルを作る

#helloライブラリ
#hello_lib.pl

#サブルーチン定義
sub hello{
    my($name) = @_;
    print "こんにちは、$nameさん。\n";
}

#戻り値
#ライブラリなのでスクリプトの最後に1;をつける。
1;

これをrequire関数を使って読み込む

#hello_libの呼び出し
#hello_call.pl

#ライブラリの呼び出し
require("hello_lib.pl");

#サブルーチンの呼び出し
&hello("太郎");

#実行結果
# こんにちは、太郎さん。

初めてのPerl 第6版

初めてのPerl 第6版

perl ハッシュのリファレンス

#ハッシュのリファレンスを受け取り、キーと値を逆にして返すサブルーチン

#サブルーチン実行前
%hash = (
    "太郎"=>"tarou",
    "花子"=>"hanako",
    "次郎"=>"jirou",
);
print "実行前:\n";
print "$key => $value\n" while(($key, $value) = each(%hash));

#サブルーチン実行
&sub_hush(\%hash);

#サブルーチン実行後
print "実行後:\n";
print "$key => $value\n"  while(($key, $value) = each(%hash));

#サブルーチン
sub sub_hush{
    my($reference_hush) = @_;
    
    %$reference_hush = reverse(%$reference_hush);        
    

}

#実行結果
# 実行前:
# 太郎 => tarou
# 次郎 => jirou
# 花子 => hanako
# 実行後:
# tarou => 太郎
# hanako => 花子
# jirou => 次郎

初めてのPerl 第6版

初めてのPerl 第6版

perl 無名サブルーチン

#無名サブルーチンで戻り値を直接取得する

#無名サブルーチン
$string = sub{
    #文字列を返す
    return("こんにちは、私は$nameです。\n");
};

#戻り値を表示
$name = "花子";
print "戻り値:", &$string;

#実行結果
# 戻り値:こんにちは、私は花子です。

初めてのPerl 第6版

初めてのPerl 第6版

perl 配列のリファレンス

#配列のリファレンス

@array = (1 .. 5);

#サブルーチン実行前
print "実行前:",join(", ", @array), "\n";

#リファレンスを渡してサブルーチン実行
&sub_reference_array(\@array);

#サブルーチン実行後
print "実行後:",join(", ", @array), "\n";

#サブルーチン
sub sub_reference_array{
    #リファレンスを受け取る
    my($reference_array) = @_;

    #リファレンスの配列の内容を変更
    for($i = 0; $i < @$reference_array; $i++){
        $$reference_array[$i]++;
    }
}

#実行結果
# 実行前:1, 2, 3, 4, 5
# 実行後:2, 3, 4, 5, 6

#@arrayのリファレンスである\@arrayを渡してサブルうーちんを実行する。サ
#ブルーチン内では引数を介して渡されたリファレンスをローカル変数
#$referece_arrayに代入している。その後のforステートメントの条件式の中
#に@$referece_arrayを記述しリファレンスが指す内容を表している。forルー
#プは0から始まり、配列の各要素に対してインクリメントを行っているため元
#の配列はループ終了後に(2, 3, 4, 5, 6)になる。

初めてのPerl 第6版

初めてのPerl 第6版

perl リファレンス1

#スカラー変数をリファレンスで渡し、サブルーチンで内容を変更する

$string = "私は太郎です。";

#サブルーチン実行前
print "実行前: $string\n";

#リファレンスを渡してサブルーチン実行
&sub_reference(\$string);

#サブルーチン実行後:
print "実行後: $string\n";

#サブルーチン
sub sub_reference{
    #リファレンスを受ける
    my($referece) = @_;

    #リファレンスのスカラー変数の内容を変更
    $$referece =~ s/太郎/花子/;
}

#実行結果
# 実行前: 私は太郎です。
# 実行後: 私は花子です。

#\$stringによって変数$stringのリファレンスを返し、それをサブルーチンの引数にしている。
#サブルーチンの中では、myで宣言したローカル変数$refereceにそのリファレンスを代入している。
#$$refereceではリファレンスによって元の変数の内容が取得されるので、その中の「太郎」を「花子」
#に置き換えている。
#サブルーチンのなかではmyを使ってリファレンスをローカル変数として定義しているが、そのリファレンス先
#の内容を変更するとグローバル変数の内容が操作される。

初めてのPerl 第6版

初めてのPerl 第6版

perl リファレンス

#スカラー変数のリファレンス
#\$variable

#スカラー変数のリファレンスから内容を求める
# $$reference
# ${$reference}

#配列のリファレンス
# \@array

#配列のリファレンスから内容を求める
# @$referece
# @{$reference}

#配列の特定要素を求める
# $$reference[affix]
# reference->[affix]

#ハッシュのリファレンス
# \%hash

#ハッシュのリファレンスから内容を求める
# %$reference
# %{$reference}

#ハッシュの特定要素を求める
# $$reference{key}
# $reference->{key}

#サブルーチンのリファレンス
# \&subroutine

#サブルーチンのリファレンスから内容を求める
# &$reference
#&{reference}

#無名サブルーチン
# sub{statements}

初めてのPerl 第6版

初めてのPerl 第6版