Posts Tagged: perl

File::Temp

サーバのメンテナンススクリプトなんかを書いていると、
テンプレートとなるファイルを一時ディレクトリにコピー

中の文字列を置換

任意のディレクトリへ配布

見たいな処理をしたくなることがある。
そういうときにPerlのFile::Tempが大変便利だったのでメモ。

サンプルコード

#!/usr/bin/perl -w

use strict;
use File::Temp qw(tempfile tempdir);

# 一時ディレクトリを作成
my $dir = tempdir( CLEANUP => 1 );
print "$dir を作成しました。\n";
# 一時ファイルを作成
my ($fh, $filename) = tempfile( DIR => $dir );
print "$filename を作成しました。\n";

my $tmp = <STDIN>;

exit 0;

これを実行すると次のような出力結果になります。
$ ./test_temp_file.pl
/tmp/fc69T4R949 を作成しました。
/tmp/fc69T4R949/DI3QD1eyTf を作成しました。(※/tmp/以下の文字列はランダム)
(※一旦止まる)

止まったときに/tmp/fc69T4R949/DI3QD1eyTfをlsするとちゃんと存在することがわかります。
Enterを押して処理を続行、終了します。
終了後/tmp/fc69T4R949/DI3QD1eyTfをlsするとちゃんと消してくれてることがわかります。
便利。

Perlのデストラクタ

Perlを初めて書いてからもう1年半くらい経ちますが、まだまだ超初心者の域を出ません。
(日常的に使う機会がないって言い訳しておきます苦笑)
本当はプログラミングPerl(通称ラクダ本)で勉強したいですが、電子版が出ていないというのもあり手が出せていません。
(電子版がないから読まないってのもなかなか本末転倒ものですが。。。)

変わりに以下の書籍は電子版が出ているので、こちらを教科書として使っています。

ちなみに以下の2冊も電子版が出ているみたいですね。
私はまだ読んだことがないので『続・初めてのPerl』を読み終え次第買ってみようかと思います。

前置きが長くなりましたが、
今は『続・初めてのPerl』でオブジェクト指向でPerlをかけるように勉強中です。

私が書いたことのあるオブジェクト指向言語はJava位のものですが、
Javaと比べてPerlはいろんな書き方ができます。
たとえばJavaはパッケージを作ってクラスを作ってインスタンスを生成して…としなければ動きませんが、
Perlではパッケージクラスやクラスを作らなくても組み込みメソッドの羅列だけで一応は動作してしまいます。

Perlをオブジェクト指向的に書くためには自分で”オブジェクト指向的な書き方”をするしかありませんが、
記憶力のない私はすぐ忘れてしまいます(~_~;)

パッケージやクラスの基本的な書き方は↓が参考になりました。
Perl講座 10章 [ オブジェクト指向プログラミング ]

またデストラクタについて『続・初めてのPerl』を参考に書いたものです。

#!/usr/bin/perl -w

use strict;

# Animalパッケージ
{package Animal;

    # コンストラクタの役割を担うメソッド
    sub named {
        my $class = shift;
        my $name = shift;
        #my $self = { Name => $name, Sound => $class->sound, Color => $class->default_color };
        my $self = { Name => $name, Sound => $class->sound, Color => $class->default_color };
        bless $self, $class; #$selfを$classのインスタンスにする
    }

    sub speak {
        my $class = shift;
        ref $class
            ? print "a $class->{Name} goes ", $class->{Sound}, "!\n"
            : "an unnamed $class";
    }

    sub name {
        my $either = shift;
        ref $either # ref関数:引数がリファレンスだったら真、でなければ偽を返す
            ? $either->{Name}
            : "an unnamed $either";
    }

    sub DESTROY {
        my $self = shift;
        print '[', $self->name, " has died.]\n";
    }
}

# Horseパッケージ
{package Horse;
    use base qw(Animal);
    sub sound { 'heigh' }

    sub default_color { 'brown' }
}

# main
sub feed_a_horse_named {
    my $name = shift;
    my $horse = Horse->named($name);
    $horse->speak;
    print "Returning from the subroutine.\n";
}

print "Start of program.\n";
my $outer_horse = Horse->named('Bassie');
print "Now have a horse named ", $outer_horse->name, ".\n";
feed_a_horse_named('Gwen');
print "Returned from subrountine.\n";

exit 0;

これを実行すると、
Start of program.
Now have a horse named Bassie.
a Gwen goes heigh!
Returning from the subroutine.
[Gwen has died.]
Returned from subrountine.
[Bassie has died.]

と出力されるので、オブジェクトのディストラクションがよくわかります。