Perl模块使用的参数

时间:2012-11-04 14:36:23

标签: perl perl-module

有了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中是否还有其他方法可以做到这一点?

2 个答案:

答案 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"
}

但是,我认为进一步使用更简单和更轻松的是制作功能设定器。