0

有 C 背景,我可能试图用错误的方式写一些东西,所以请原谅初学者的问题。这是我正在寻找的:

我愿意有一个 perl 模块Verbose(不是一个类)来定义一个名为verbose_print(). $verbose仅当模块的变量为真时,此子例程才会打印它的参数(字符串) 。当然,我愿意做的是从命令行(使用Getopt::Long)获取 -V 选项,然后,如果 -V 开关打开,调用Verbose模块,将 'true' 作为$Verbose::verbose.

一种解决方法是在模块内使用一个verbose_init函数将$Verbose::verbose变量设置为 true Verbose

另一种是$verbose在我的模块中使用our然后$Verbose::verbose = $command_line_verbose_switch在主脚本中声明。

我想知道在 perl 中是否有另一种方法可以做到这一点?

4

2 回答 2

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数组。您可以使用@EXPORTwhich 将自动导出所有命名的子例程,但现在它被认为是不礼貌的,因为您最终可能会覆盖某人的同名本地子例程。最好说清楚。如果有问题,他们可以使用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)。

于 2012-11-04T16:07:56.783 回答
-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"
}

但是,我认为更简单和更明显的进一步使用是制作一个函数设置器。

于 2012-11-04T14:47:21.423 回答