perl ENDを着くんだ文字列が入るまで標準エラー出力に表示する

#キーボードの入力を、キーワードENDを含んだ文字列が入るまで、そのまま標準エラー出力に表示するスクリプト
while(1){
$string = <STDIN>;
    if($string =~ /END/){
        exit;
    }else{
        print STDERR $string;
    }
}

#実行結果
# abc
# abc
# def
# def
# ghi
# ghi
# END

初めてのPerl 第6版

初めてのPerl 第6版

perl ARGV

#引数の数と内容を表示する。

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

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

#実行結果
# $ perl argv.pl 
# ARGVの数:0

# $ perl argv.pl practical extraction and report language
# ARGVの数:5
# 引数0: practical
# 引数1: extraction
# 引数2: and
# 引数3: report
# 引数4: language

初めてのPerl 第6版

初めてのPerl 第6版

perl 標準入力または引数に指定したファイルを表示する

#標準入力または引数に指定したファイルをそのまま表示する
#標準入力とファイルの双方を受け取るスクリプト
#which.pl

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

#perl which.plのように引数を指定しないで実行すると、標準入力を受け取る
#待機状態になる。文字列を入力してenterキーを押すとその文字列がエコーバッ
#クされ待機状態に戻る。perl which.pl test.txtのようにwhich.plに引数を
#指定すると、引数をファイル名とみなしてオープンし、その内容を入力とし
#て受け取り、画面に出力する。

#実行結果
# $ perl which.pl 
# hello
# hello
# hello
# hello
# how
# how
# low
# low
# ^C


# $ perl which.pl copyFile.txt 
# これをこぴー

初めてのPerl 第6版

初めてのPerl 第6版

perl 出力先を標準出力と標準エラー出力に分ける 

#出力先を標準出力と標準エラー出力に分ける
#標準出力と標準エラー出力の違い
#std.pl

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

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

#実行結果
# $ perl std.pl 
# 標準出力に出力しています。
# 標準エラー出力に出力しています。
#
#$ perl std.pl > stdout.txt
# 標準エラー出力に出力しています。
#
#$ cat stdout.txt
# 標準出力に出力しています。

初めてのPerl 第6版

初めてのPerl 第6版

perl 標準入力STDIN

#標準入力からの入力を受け、それをそのまま表示する。(エコーバック)実行後、文字列を入力してEnterキーを押すと画面にその文字列を表示した後、また入力を待つ。QUITを含む文字列を入力するとスクリプトを終了する。

#入力をそのままエコーする
#echo.pl

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

#実行結果
# hello
# hello
# world
# world
# QUIT
# QUIT

初めてのPerl 第6版

初めてのPerl 第6版

perl ファイルのコピー

#コピー元のファイル名とコピー先のファイル名を入力するとファイルのコピーを行うスクリプト

#ファイルの内容を別のファイル名のファイルにコピーする
#copy2.pl

print "コピー元のファイル名を指定してください>";
$from_file = <STDIN>;
print "コピー先のファイル名を指定してください>";
$to_file = <STDIN>;

chomp($from_file, $to_file);

#それぞれのファイルをオープン
open(F, $from_file)  || die "$from_file をオープンできません:$!\n";
open(F2, ">$to_file") || die "to_file を作成できません:$!\n";

while(<F>){
    #コピー元のファイルから読み込み、コピー先のファイルに書き出す
    print F2;
}

close(F2);
close(F);


#実行結果
# cat copyFile.txt 
# これをこぴー

# perl copy2.pl 
# コピー元のファイル名を指定してください>copyFile.txt
# コピー先のファイル名を指定してください>pasteFile.txt
# cat pasteFile.txt 
# これをこぴー

初めてのPerl 第6版

初めてのPerl 第6版

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版