Perl勉強 - use, my, package

試行錯誤のための良くないサンプルコード。

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;

my $a = {b => 'c'};
my $n = 0;

sub print_a {
    print Data::Dumper->Dump([$a]), "\n";
}

{
    package Package1;
    sub print_a {
        my $a = {%{$a}, d => 'e'};
        print Dumper($a), "\n";
        &print_n;
        use Data::Dumper;
    }
    sub print_n { print $n, "\n"; }
    $n++;
}

package Package2;
sub print_a { main::print_a; }

package main;
Package2::print_a;
Package1::print_a;

以下、このコードに関して気づいたこと。

  • モジュール名のないサブルーチン呼び出しは、__PACKAGE__が補完されていると考えれば良さそう。
    • デフォルトはmainパッケージ。
  • useはコンパイル時に処理される。なので、どこに書いてもファイルスコープでモジュールはロードされている(多分)。
    • ただし、@EXPORTされるものはパッケージ内のスコープになる模様*1。つまり冒頭でuse Data::Dumperしても、別のpackage宣言をした場合その中ではDumperメソッドは使えない。
    • 動的にモジュールをロードしたいならrequireを利用。
  • パッケージは1つのファイルに複数書ける。ただし宣言後でなければ使えない(多分)。
  • myは変数のレキシカルスコープ宣言。レキシカルスコープはブロック毎なので、パッケージ宣言とは無関係。

TODO

  • packageの理解の詰め
    • アロー演算子を使う場合は、文字列をパッケージ名として使えそうだけどホント?など。
  • というか続初めてのPerl買ったから読む
  • の前に、無印の演習問題だけはこなす。

*1:BEGINブロックなどと関係ありそう