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を利用。
- ただし、@EXPORTされるものはパッケージ内のスコープになる模様*1。つまり冒頭で
- パッケージは1つのファイルに複数書ける。ただし宣言後でなければ使えない(多分)。
- myは変数のレキシカルスコープ宣言。レキシカルスコープはブロック毎なので、パッケージ宣言とは無関係。
参考文献
*1:BEGINブロックなどと関係ありそう