不要那么害怕 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);
现在,您的详细子例程可能如下所示:
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
)。