有了C背景,我可能会尝试用错误的方式写一些东西,这样可以原谅初学者的问题。这是我正在寻找的:
我愿意有一个perl模块Verbose
(不是一个类)来定义一个名为verbose_print()
的子程序。仅当模块的变量$verbose
为真时,此子例程才会打印它的参数(字符串)。当然,我愿意做的是从命令行获取-V选项(使用Getopt::Long
),然后,-V开关打开,用{调用Verbose
模块是'作为$Verbose::verbose
的价值。
一种解决方法是使用verbose_init
函数在$Verbose::verbose
模块中将Verbose
变量设置为true。
另一个是在我的模块中使用$verbose
然后在主脚本中our
声明$Verbose::verbose = $command_line_verbose_switch
。
我想知道在perl中是否还有其他方法可以做到这一点?
答案 0 :(得分:0)
不要害怕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
自动导出所有已命名的子程序,但它现在被认为是不礼貌,因为您可能最终覆盖某人的本地子程序同名。更好地说明一点。如果出现问题,他们可以使用详细子例程的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
)。
答案 1 :(得分:-2)
“另一种方式”之一是创建import
函数:
package Verbose;
my $verbose_on;
sub import {
$verbose_on = shift;
}
#... Your code.
现在您可以像下面这样设置详细信息:
if( ... ) { #check getopt
use Verbose (1); #This will require package Verbose and call "import"
}
但是,我认为进一步使用更简单和更轻松的是制作功能设定器。