Perl のクラスを恐れる必要はありません。それらはパッケージとモジュールの扱いが少し異なるだけです。彼らは噛みません。しかし、あなたはクラスがないと言ったので、クラスはありません。
パッケージ変数に直接触れたくない。代わりに、サブルーチンを使用してそれらを設定します。
これが私のLocal::Verbose
( に保存されているLocal/Verbose.pm
)
package Local::Verbose;
use strict;
use warnings;
use Exporter 'import';
# Could have used just '@EXPORT', but that's bad manners
our @EXPORT_OK = qw(verbose verbose_switch);
# Use "our", so $verbose_value is a package variable.
# This makes it survive between calls to this package
our $verbose_value;
# prints out message, but only if $verbose_value is set to non-blank/zero value
sub verbose {
my $message = shift;
if ( $verbose_value ) {
print "VERBOSE: $message\n";
return $message;
}
else {
return;
}
}
sub verbose_switch {
my $switch_value = shift;
$verbose_value = $switch_value;
return $switch_value;
}
1;
に注意してour
ください。これにより$verbose_value
、パッケージ変数が作成されます。これは、呼び出し間でパッケージの外側に存在することを意味します。
Exporter
と@EXPORT_OK
配列の使い方に注目してください。@EXPORT
名前付きサブルーチンをすべて自動的にエクスポートする which を使用できますが、同じ名前を持つ誰かのローカル サブルーチンを覆い隠すことになる可能性があるため、今ではマナーが悪いと見なされています。明示したほうがいい。問題がある場合Local::Verbose::verbose
は、冗長サブルーチンの名前を使用できます。
そして、それがどのように使用されているか
use strict;
use warnings;
use Local::Verbose qw(verbose verbose_switch);
verbose ("This is a test");
verbose_switch(1);
verbose ("This is a second test");
ところで、冗長サブルーチンを次のように呼び出すと想像してください。
verbose($message, $my_verbose_level);
これで、verbose サブルーチンは次のようになります。
sub verbose {
my $message = shift;
my $verbose_level = shift;
if (not defined $verbose) {
$verbose_level = 1;
}
if ( $verbose_value =< $verbose_level ) {
print "VERBOSE: $message\n";
return $message;
}
else {
return;
}
}
これで、冗長レベルをさまざまな値に設定し、冗長ステートメントにさまざまなレベルの冗長性を与えることができます。(私は同じことをしますが、それを呼び出しますdebug
)。