Perl模块使用的参数

ct3nt3jp  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(197)

有一个C背景,我可能会试图写一些错误的方式,所以原谅初学者的问题。这里是我正在寻找:
我愿意有一个perl模块Verbose(不是类别),定义称为verbose_print()的副程式。这个副程式会打印它的参数(一个字符串)当然,我愿意做的是从命令行获取-V选项(使用Getopt::Long),然后,如果-V开关打开,则调用Verbose模块,“true”为$Verbose::verbose的值。
一种解决方法是使用verbose_init函数,在Verbose模块中将$Verbose::verbose变量设置为true。
另一个方法是在我的模块中使用our声明$verbose,然后在主脚本中使用$Verbose::verbose = $command_line_verbose_switch
我想知道在perl中是否有另一种方法可以做到这一点?

jhdbpxl9

jhdbpxl91#

不要害怕Perl中的 classes,它们只是包和模块,处理方式稍有不同。它们不会咬人。但是,你说没有类,那就没有类。
我不喜欢直接接触包变量,而是使用子例程来设置它们。
这是我的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成为一个 package 变量,这意味着它在调用之间位于包的外部。
注意我是如何使用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子例程:

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)。

gzszwxb4

gzszwxb42#

“另一种方法”之一是创建一个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"
}

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

相关问题