読者です 読者をやめる 読者になる 読者になる

「優れたPerlプログラマを見分ける27の質問」に回答してみた(グダグダ)

回答してみました。

1.Perl5において変数のシジルが示すものは何か

シジルは型を表しています。
perlの型は、スカラー($hoge)、配列(@hoge)、ハッシュ(%hoge)、関数(&hoge)があります。

2.配列のアクセスする際の $items[$index] と @items[$index] の違いは何か

両方とも配列itemのindex番目のデータを指していますが、返ってくる値のコンテキストが違います。
$items[$index]は、スカラーコンテキストで返ってきます。

    my $item = $items[$index];

という感じで値を受け取ります。


@items[$index]は、配列コンテキストで返ってくる。

    my ($item) = @items[$index];

という感じで値を受け取ります。

3.== と eq の違いは何か

==は数値の比較で、eqは文字列の比較。

    # 真
    if ( 20 < 110 ) {
	print "OK"
    }

    # 偽
    if ( 20 lt 110 ) {
	print "OK"
    }

4.ハッシュをリストコンテキストで評価すると得られるものは何か

ハッシュのキーと値が交互に並んだリストになります。

例えば、以下の場合。

    my %hoge;
    $hoge{'key1'} = 'value1';
    $hoge{'key2'} = 'value2';

    # ('key1', 'value1', 'key2', 'value2')になる。
    my @hoge = %hoge;

5.Perlドキュメントからキーワードを検索するにはどのようにするのか

perldocコマンドを使用します。

6.Perl5における関数とメソッドの違いは何か

    Hoge::hoge();

と呼び出す時が関数。

    my $obj = Hoge->new();
    $obj->hoge();

と呼び出す時がメソッド。

うーん、答えになってないかなぁ・・・。


7.Perl5が変数のメモリを再利用するのはいつか

分かりません。再利用?ガーベッジコレクションされるタイミングかな?よく分かりませんでした。

8.変数のスコープがデフォルトでレキシカルであると保証するにはどのようにするのか

use strict;を記述して、変数に「my」を付けます。

9.モジュールからシンボルをインポートするにはどのようにするのか

    use Hoge qw(hoge);

のようにすれば、Hogeモジュールで定義されているhoge関数がインポートできます。
このとき、hoge関数はEXPORT_OKである必要があります。


または、シンボルテーブルを使ってインポートすることができます。

    use Hoge;
    no strict 'refs';
    *{"My::hoge"} = \&Hoge::hoge;

10.perlがモジュールのロードを敢行するディレクトリの操作はどのようにするのか

ディレクトリ操作?検索するときにみるディレクトリのことでしょうか。
@INCに入っているディレクトリパスを検索して、モジュールをロードします。

11.Perl5のエラーメッセージの検索はどのようにするのか(発生するエラーメッセージに説明を加える方法を知っていればボーナスポイント)

分かりません。

12.配列を関数に渡したときに起きることは何か

@_に配列が格納されます。

    hoge(@hoge);


    sub hoge {
	my $self = shift @_; # @_の一番目の要素を受け取るとか
	my $self = shift;    # 上と同じ
	my @args = @_;       # 配列で受け取る
	my %args = @_;       # ハッシュで受け取るとか
    }

13.複数の配列をそれぞれ区別して関数に渡すときにはどのようにするのか

リファレンスで渡すようにします。

hoge(\@a, \@b);

sub hoge {
    my ($a, $b) = @_;

    # デリファレンス
    my @a = @{$a};
    my @b = @{$b};
}

14.呼び出された側から見た return; と return undef; の違いは何か

分かりません。まずい、結構基本的なことですよね^^;

15.標準的CPANディストリビューションではテストはどこに置かれるか

t/ディレクトリ以下です。

16.標準的CPANディストリビューションでテストを走らせるにはどのようにするのか

makeコマンド。

perl Makefile.PL
make
make test


または、proveコマンド。

prove t/*.t

17.CPANから新しいディストリビューションをインストールする際に使うコマンドはなにか

cpanコマンドか、cpanmコマンド。

18.組み込み関数openを3引数形式で使うのは何故か

不正なファイル書き込みが行われないようにするためです。
例えば下記のようなコードがあったとします。

    my $file = <STDIN>;
    open my $fh, "$file";


このとき、$fileに「>/tmp/hoge.txt」という値が入力されてしまうと、書き込みモードでファイルがオープンしてしまいます。しかし、3引数形式の場合はこういうことは起こらなくなります。

    my $file = <STDIN>;
    open my $fh, '>', $file;

19.openのようなシステムコールのエラーを検出(と報告)するにはどのようにするのか(エラーの検出と報告を自動的に有効にする方法を知っていればボーナスポイント)

or演算子でつなぐようにします。

    open my $fh, '<', $file or die "Can't open $file: $!";

openが失敗すればdie関数が呼び出されるようになります。
自動的に有効にする方法はどういうことかわかりませんでした。

20.Perl5で例外を投げるにはどうするのか

die関数を呼び出します。
die関数では文字列を投げることもできるし、例外オブジェクトを投げることもできます。

21.Perl5で例外を補足するにはどうするのか

例外を投げる処理をeval{}で囲います。
例外メッセージは$@に格納されます。

    eval {
	die "Exception!";
    };
    if ($@) {
    }

22.ファイルの読み込みにおけるforとwhileの違いは何か

は、評価されるコンテキストによって挙動が違ってきます。

    my $line = <FILE>;

のようにスカラーコンテキストで評価されると一行だけ読み込まれます。

    my @lines = <FILE>;

のようにリストコンテキストで評価されるとファイル全体が読み込まれます。


forは、リストコンテキストで評価しますので、ファイルの全体が1ループで読み込まれます。
whileは、スカラーコンテキストで評価するので、ファイルの一行一行が順番にループで読み込まれます。


というふうに覚えていたのですが、下記のコードで実験したら予想した通りの結果にならなかったです。。。。

    use strict;
    use warnings;

# print文が一回だけ実行されることを期待、したけれど行数分だけ実行されてしまいました。
open my $fh1, '<', 'test.txt';
for my $line (<$fh1>) {
    print "for ", $line;
}
close $fh1;

# print文が行数分だけ実行されることを期待
open my $fh2, '<', 'test.txt';
while (my $line = <$fh2>) {
    print "while ", $line;
}
close $fh2;

なにか間違っているんでしょうね^^;

23.メソッドと関数においてパラメータを取り扱うにはどうしたらよいか

メソッドでは、自動的にオブフェクトのリファレンスが引数の最初に挿入されることに注意します。

    $obj->hoge($a, $b);

    sub hoge {
        my ($self, $a, $b) = @_;
    }

24.my ($value) = @_; の変数を囲む括弧が意味するものは何か、またこの括弧を取り除くと何が起きるか

受け取り側がリストコンテキストであることを意味します。この場合は、右辺値の一番左側のデータが$valueに格納されます。


括弧を取り除くと、左辺はスカラーコンテキストとなり、右辺はスカラーコンテキストとして評価されます。右辺の配列の値は左側から順番に評価されていき、最終的に一番右の値が評価され、その結果が$valueに入ります。この場合、評価の結果は一番右の値になるので、$valueには一番右の値が格納されます。

25.new は組み込み関数ないしキーワードか

組み込み関数でもキーワードでもありません。単なるメソッド名です。perlではコンストラクタの名前は自由に付けられます。

26.コアライブラリやCPANモジュールのドキュメントを読むにはどのようにするのか

perldoc モジュール名

で、コマンド実行します。

27.ハッシュの値のみを取り出したい時はどのようにするのか

valuesを使用します。

    my @values = values %hoge;

おわりに

ということで、ひと通り答えてみました。自分の知識があやふやだったり穴があったりしたので、なかなか(キリッと答えることができてません。

優れたperlプログラマになるために勉強し直してきます(ノ_・。)


弾さんの回答を正座して見ます。
404 Blog Not Found:perl - 「優れたPerlプログラマを見分ける27の質問」回答例